Container所在文件:tvm/runtime/container.h
tvm自定义的container有:
(1)Array
ArrayNode : Object
: InplaceArrayBase<ArrayType, ElementType> 主要重载[],用于访问指定下标的数据
{
m_func at(index) //获取对应元素,与[]一样
m_func begin() //获取迭代器指针
s_func CreateRepeated(n, ObjectRef val) //重复创建
s_func Empty(n) // 创建空数组
m_func size() // 获取数组大小
}
Array : ObjectRef // 对Object的引用,管理
{
m_fun push_back(T item) // 添加数据
m_fun insert(iterator pos, val) // 插入Item
m_fun pop_back() // 从末尾出一个元素
m_fun erase(iterator i) // 删除元素
m_fun resize(n)
m_fun reserve(n)
m_fun clear()
m_fun set(i, value)
m_fun Assign(IterType first, IterType last) //初始化
}
// 全局函数
Array Concat(Array first, Array second) // 函数拼接
std::forward(...) // 原样转发参数
new (pointer) Class // placement new,在指针的内存位置创建对象,不用申请新空间
(2) ADT是一个可以指定tag的Tuple元组,只能创建,不能修改,使用[index]下标访问
ADTObject : Object
: InplaceArrayBase
{
m_field tag;
m_field size;
}
ADT : ObjectRef
{
m_func tag()
m_func size()
s_fun Tuple(....)
}
std::distance(iterator1, iterator2) // 长度
(3)String, 字符串实际上也是container,它也是Immutable的,只能创建,不能修改
StringObj : Object
{
m_field char * data
m_field size
}
String : ObjectRef
{
m_func compare()
m_func c_str() // 返回char*
m_func size()
m_func length() // 与size等价
m_func empty() // 判空
m_func char at(index)
m_func char* data() // 与c_str等价
}
String支持=、+、<、>、<=、>=、== 加、赋值和比较运算
(4)Optional,表示一个可以为空的引用类型
Optional : ObjectRef
// 实例:
Optional<String> opt = nullptr;
Optional<String> opt2 = String("xyz")
(5)ClosureObj 闭包的类型
ClosureObj : Object
Closure : ObjectRef
(6)Map
MapNode : Object
{
using KVType = std::pair<ObjectRef, ObjectRef>;
m_func size()
m_func count(key)
m_func value at(key) // 类似于map[key]
m_func begin() / end()
m_func iterator find(key)
m_func erase(iterator pos)
m_func erase(key) // 删除
s_func Empty()your
}
SmallMapNode : MapNode
: InplaceArrayBase
{
}
DenseMapNode : MapNode
{
}
// MapNode内部实际上维护两个map,当数据量小时使用smallMapNode,当数据量大时,使用DenseMapNode
Map : ObjectRef
{
m_func at(key)
m_func [key]
m_func size()
m_func count(key)
m_func empty() // 判空
m_func Set(key, value)
m_func iterator begin() / end() / find(key)
m_func erase(key)
}