9 typedef struct W_TreeNode
{
12 /*unsigned int uflags:16;*/
18 struct W_TreeNode
*parent
;
20 WMFreeDataProc
*destructor
;
26 destroyNode(void *data
)
28 WMTreeNode
*node
= (WMTreeNode
*) data
;
30 if (node
->destructor
) {
31 (*node
->destructor
)(node
->data
);
34 WMFreeArray(node
->leaves
);
41 WMCreateTreeNode(void *data
)
43 return WMCreateTreeNodeWithDestructor(data
, NULL
);
48 WMCreateTreeNodeWithDestructor(void *data
, WMFreeDataProc
*destructor
)
52 node
= (WMTreeNode
*) wmalloc(sizeof(W_TreeNode
));
53 memset(node
, 0, sizeof(W_TreeNode
));
55 node
->destructor
= destructor
;
60 node
->leaves
= WMCreateArrayWithDestructor(1, destroyNode
);
67 WMInsertItemInTree(WMTreeNode
*parent
, int index
, void *item
)
71 wassertrv(parent
!=NULL
, NULL
);
73 node
= WMCreateTreeNodeWithDestructor(item
, parent
->destructor
);
74 node
->parent
= parent
;
75 node
->depth
= parent
->depth
+1;
76 if (index
< 0 || index
> WMGetArrayItemCount(parent
->leaves
)) {
77 WMAddToArray(parent
->leaves
, node
);
79 WMInsertInArray(parent
->leaves
, index
, node
);
87 WMAddItemToTree(WMTreeNode
*parent
, void *item
)
91 wassertrv(parent
!=NULL
, NULL
);
93 node
= WMCreateTreeNodeWithDestructor(item
, parent
->destructor
);
94 node
->parent
= parent
;
95 node
->depth
= parent
->depth
+1;
96 WMAddToArray(parent
->leaves
, node
);
103 updateNodeDepth(WMTreeNode
*node
, int depth
)
108 for (i
=0; i
<WMGetArrayItemCount(node
->leaves
); i
++) {
109 updateNodeDepth(WMGetFromArray(node
->leaves
, i
), depth
+1);
115 WMInsertNodeInTree(WMTreeNode
*parent
, int index
, WMTreeNode
*node
)
117 wassertrv(parent
!=NULL
, NULL
);
118 wassertrv(node
!=NULL
, NULL
);
120 node
->parent
= parent
;
121 updateNodeDepth(node
, parent
->depth
+1);
122 if (index
< 0 || index
> WMGetArrayItemCount(parent
->leaves
)) {
123 WMAddToArray(parent
->leaves
, node
);
125 WMInsertInArray(parent
->leaves
, index
, node
);
133 WMAddNodeToTree(WMTreeNode
*parent
, WMTreeNode
*node
)
135 wassertrv(parent
!=NULL
, NULL
);
136 wassertrv(node
!=NULL
, NULL
);
138 node
->parent
= parent
;
139 updateNodeDepth(node
, parent
->depth
+1);
140 WMAddToArray(parent
->leaves
, node
);
147 WMGetTreeNodeDepth(WMTreeNode
*node
)
154 WMDestroyTreeNode(WMTreeNode
*node
)
161 WMGetDataForTreeNode(WMTreeNode
*node
)
168 WMGetParentForTreeNode(WMTreeNode
*node
)
175 WMSortLeavesForTreeNode(WMTreeNode
*node
, WMCompareDataProc
*comparer
)
177 wassertr(node
!=NULL
);
179 WMSortArray(node
->leaves
, comparer
);
184 sortLeavesForNode(WMTreeNode
*node
, WMCompareDataProc
*comparer
)
188 WMSortArray(node
->leaves
, comparer
);
189 for (i
=0; i
<WMGetArrayItemCount(node
->leaves
); i
++) {
190 sortLeavesForNode(WMGetFromArray(node
->leaves
, i
), comparer
);
196 WMSortTree(WMTreeNode
*root
, WMCompareDataProc
*comparer
)
198 wassertr(root
!=NULL
);
200 sortLeavesForNode(root
, comparer
);