数据模型
定义销毁数据模型节点回调函数原型
typedef void (* TwNodeValueDesktroy_Func)(TwDataNode *node, TTable *value);
功能:定义销毁数据模型节点回调函数原型
参数:
参数 | 说明 |
---|---|
node | 将要销毁的数据模型节点 |
value | 将要销毁的数据模块节点的值 |
返回值:无
节点排序回调函数原型
typedef int (*TwDMQuickSort_func)(TwDataNode *n1, TwDataNode *n2, void *arg);
功能:节点排序回调函数原型
参数:
参数 | 说明 |
---|---|
n1 | 节点1 |
n2 | 节点2 |
arg | 同函数TwDMQuickSort的参数arg |
返回值:TRUE n1和n2互换顺序,FALSE n1和n2顺序保持不变
遍历DM节点回调函数原型
typedef int (*TwNodeVisit_Func)(TwDataNode *node, Tint depth, void *arg);
功能:遍历DM节点回调函数原型
参数:
参数 | 说明 |
---|---|
node | 当前遍历的节点 |
depth | 当前节点深度 |
arg | 执行函数传递的用户参数 |
返回值:
0 表示继续遍历
1 表示不遍历孩子,
其他表示立即退出遍历
注解:
此回调函数中不能删除node节点
创建一个数据模型
TwDataModel *TwDMCreate(T_ID root_type);
功能:创建一个数据模型
参数:
参数 | 说明 |
---|---|
root_type | 数据模型根节点的类型 |
返回值:创建好的数据模型
注解:根节点的类型需要与 list_layout.ini 配置文件中配置的类型名称保持一致
示例:
TwDataModel *dm;
dm = TwDMCreate(TStringID("test_root"));
销毁一个数据模型
void TwDMDestroy(TwDataModel *dm);
功能:销毁一个数据模型
参数:
参数 | 说明 |
---|---|
dm | 将要销毁的数据模型 |
返回值:无
示例:
TwDMDestroy(dm);
给数据模型加锁
void TwDMLock(TwDataModel *dm);
功能:当用户修改数据模型时(添加节点、删除节点、改变节点的值 Table),一定是先调用TwDMLock()先上锁,批量修改完后再调用 TwDMUnlock() 解锁
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
返回值:无
示例:
TwDMLock(dm);
给数据模型解锁
void TwDMUnlock(TwDataModel *dm);
功能:给数据模型解锁
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
返回值:无
示例:
TwDMUnlock(dm);
设置销毁数据模型节点时触发的回调函数
void TwDMSetNodeValueDestroyFunc(TwDataModel *dm, TwNodeValueDesktroy_Func func);
功能:当销毁 dm 的任意节点时,系统都会回调 TwNodeValueDesktroy_Func 函数。调用 TwDMSetNodeValue 设置新的 Table 时,也会调用该回调函数销毁旧的 Table。
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
func | 回调函数 |
返回值:无
示例:
TwDMSetNodeValueDestroyFunc(dm,DestroyFunc);
获取数据模型的根节点
TwDataNode *TwDMGetRootNode(TwDataModel *dm);
功能:获取数据模型的根节点
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
返回值:根节点
示例:
TwDataNode *root = TwDMGetRootNode(dm);
向数据模型中添加节点
TwDataNode *TwDMAddNode(TwDataNode *parent, T_ID type);
功能:向数据模型中添加节点
参数:
参数 | 说明 |
---|---|
parent | 新节点的父节点 |
type | 节点的类型 |
返回值:成功添加的新节点,不成功则返回NULL
示例:
TwDMAddNode(root,TStringID("node"));
删除节点
void TwDMDeleteNode(TwDataNode *node);
功能:删除节点
参数:
参数 | 说明 |
---|---|
node | 将要删除的节点 |
返回值:无
示例:
TwDMDeleteNode(node);
删除当前节点下的所有子节点
void TwDMDeleteNodeAllChild(TwDataNode *node);
功能:删除当前节点下的所有子节点
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
返回值:无
示例:
TwDMDeleteNodeAllChild(root);
交换两个节点位置
T_Result TwDMSwapNode(TwDataNode *node1, TwDataNode *node2);
功能:交换两个节点位置
参数:
参数 | 说明 |
---|---|
node1 | 将要交换位置的节点1 |
node2 | 将要交换位置的节点2 |
返回值:成功返回0,失败返回-1
示例:
T_Result result = TwDMSwapNode(node1,node2);
移动节点
T_Result TwDMMoveNode(TwDataNode *node, TwDataNode *parent, TwDataNode *prev);
功能:移动节点
参数:
参数 | 说明 |
---|---|
node | 将要移动的节点 |
parent | 节点移动后的父节点 |
prev | 节点移动后的下一节点 |
返回值:移动成功返回0,失败返回-1
示例:
T_Result result = TwDMMoveNode(node, TwDMGetParentNode(node), TwDMGetSiblingNode(sibling, TRUE));//将node向前移动一个节点
获取当前节点的子节点个数
Tint TwDMGetChildNodeCount(TwDataNode *node);
功能:获取当前节点的子节点个数
参数:
参数 | 说明 |
---|---|
node | 根节点 |
返回值:当前节点的子节点个数
示例:
Tint count = TwDMGetChildNodeCount(root);
获取当前节点的父节点
TwDataNode *TwDMGetParentNode(TwDataNode *node);
功能:获取当前节点的父节点
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
返回值:当前节点的父节点
示例:
TwDataNode *parent = TwDMGetParentNode(node);
获取根节点的子节点
TwDataNode *TwDMGetChildNode(TwDataNode *parent, Tbool if_first);
功能:获取根节点的子节点
参数:
参数 | 说明 |
---|---|
parent | 根节点 |
if_first | 为 TRUE 返回第一个子节点,为 FALSE 返回最后一个子节点 |
返回值:当前节点子节点
注解:循环调用此接口可以实现遍历根节点的所有子节点
示例:
TwDataNode *node = TwDMGetChildNode(parent,TRUE);//获取parent的第一个子节点
获取当前节点的兄弟节点
TwDataNode *TwDMGetSiblingNode(TwDataNode *node, Tbool if_next);
功能:获取当前节点的兄弟节点
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
if_next | 为 TRUE 返回当前节点的后一个节点,为 FALSE 返回当前节点的前一个节点 |
返回值:当前节点的兄弟节点
注解:配合函数TwDMGetChildNode可以实现遍历根节点的所有子节点
示例:
TwDataNode *pNode = NULL, *pNext = NULL,*pRoot = NULL;
int iNodeCount = 0,i = 0;
pRoot = TwDMGetRootNode(dm); //dm为一个数据模型
pNode = TwDMGetChildNode(pRoot, TRUE);
iNodeCount = TwDMGetChildNodeCount(pRoot);
for(;i < iNodeCount;i++)
{
TwDMLock(dm);
//pNode即使dm的所有子节点
TwDMUnlock(dm);
pNext = TwDMGetSiblingNode(pNode, TRUE);
pNode = pNext;
}
获取当前节点的数据模型
TwDataModel *TwDMGetNodeDM(TwDataNode *node);
功能:获取当前节点的数据模型
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
返回值:当前节点的数据模型
示例:
TwDataModel *dm = TwDMGetNodeDM(node);
获取数据模型的根节点的类型
T_ID TwDMGetRootType(TwDataModel *dm);
功能:获取数据模型的根节点的类型
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
返回值:根节点类型
T_ID id = TwDMGetRootType(dm);
获取当前节点类型
T_ID TwDMGetNodeType(TwDataNode *node);
功能:获取当前节点类型
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
返回值:当前节点类型
示例:
T_ID id = TwDMGetNodeType(node);
设置当前节点的值
void TwDMSetNodeValue(TwDataNode *node, TTable *value);
功能:设置当前节点的值
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
value | 封装了节点的值 |
返回值:无
示例:
TTable *t = TTableCreate();
TTableAddString(t, T_STRING_ID(name), "name", -1);
TwDMSetNodeValue(TwDMFindNode(dm, "test"), t);
TTableDestroy(t);
获取节点的值
TTable *TwDMGetNodeValue(TwDataNode *node, Tbool create);
功能:获取节点的值
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
create | 如果此节点没有值,那么 create 为 TRUE 则返回一个空 TTable,为 FALSE 返回 NULL |
返回值:节点的值
示例:
TTable *table = TwDMGetNodeValue(node,FALSE);
节点排序
T_Result TwDMQuickSort(TwDataNode *parent, TwDMQuickSort_func dm_qsort_func, void *arg);
功能:节点排序
参数:
参数 | 说明 |
---|---|
parent | 根节点 |
dm_qsort_func | 回调函数,节点排序的规则在此回调中设定 |
arg | 传递到回调函数中的参数 |
返回值:操作结果
示例:
static int _quicksort_func(TwDataNode *n1, TwDataNode *n2, void *arg)
{
TTable *v1, *v2;
v1 = TwDMGetNodeValue(n1, FALSE);
v2 = TwDMGetNodeValue(n2, FALSE);
return TTableGetInt(v1, TStringID("num")) - TTableGetInt(v2, TStringID("num"));
}
TwDMQuickSort(TwDMGetRootNode(dm), quicksort_func, NULL);
遍历根节点的所有子节点
TwDataNode *TwDMVisitEach(TwDataNode *root, Tint flags, TwNodeVisit_Func func, void *arg);
功能:遍历根节点的所有子节点
参数:
参数 | 说明 |
---|---|
root | 根节点 |
flags | 暂无作用,传0即可 |
func | 遍历任意节点时都会调用此函数,不可在此函数中销毁此节点 |
arg | 传递到回调函数中的用户参数 |
返回值:终止遍历时的TwDataNode;如果没有终止遍历的情况,返回 NULL
示例:
int visit_node(TwDataNode *node, Tint depth, void *arg)
{
TLogI("visit_node %s, depth=%d\n", TwDMGetNodeName(node), depth);
//TTableDump(TwDMGetNodeValue(node, FALSE));
return 0;
}
TwDMVisitEach(TwDMGetRootNode(dm), 0, visit_node, NULL);
打印数据模型所有节点数据
void TwDMDump(TwDataModel *dm);
功能:打印数据模型所有的节点数据
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
返回值:无
示例:
TwDMDump(dm);
设置当前节点名字
T_Result TwDMSetNodeName(TwDataNode *node, const char *name);
功能:设置当前节点名字
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
name | 节点名 |
返回值:设置结果
示例:
T_Result result = TwDMSetNodeName(node,name);
获取当前节点的名字
const char * TwDMGetNodeName(TwDataNode *node);
功能:获取当前节点的名字
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
返回值:当前节点的名字
示例:
const char *name = TwDMGetNodeName(node);
在数据模型dm中查找名为name的节点
TwDataNode *TwDMFindNode(TwDataModel *dm, const char *name);
功能:在数据模型dm中查找名为name的节点
参数:
参数 | 说明 |
---|---|
dm | 数据模型 |
name | 节点名 |
返回值:查找到的节点
示例:
TwDataNode *node = TwDMFindNode(dm,name);//在数据模型dm中查找name节点
设置当前节点的用户数据
void TwDMSetNodeUserValue(TwDataNode *node, void *value);
功能:设置当前节点的用户数据
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
value | 用户数据 |
返回值:无
注解:value可以是任意值,dm内部只负责保存
示例:
TwDMSetNodeUserValue(node,value);
获取当前节点的用户数据
void *TwDMGetNodeUserValue(TwDataNode *node);
功能:获取当前节点的用户数据
参数:
参数 | 说明 |
---|---|
node | 当前节点 |
返回值:无
注解:需配合函数TwDMSetNodeUserValue一起使用
示例:
TwDMGetNodeUserValue(node);