- Preliminary tree code
[wmaker-crm.git] / WINGs / tree.c
blob0bee563f41071100a130c24e632735227574bb7d
4 //#include <stdlib.h>
5 #include <string.h>
7 #include "WUtil.h"
10 typedef struct W_TreeNode {
11 void *data;
13 //unsigned int uflags:16;
15 WMArray *leaves;
17 int depth;
19 struct W_TreeNode *parent;
21 WMFreeDataProc *destructor;
22 } W_TreeNode;
26 void
27 destroyNode(void *data)
29 WMTreeNode *node = (WMTreeNode*) data;
31 if (node->destructor) {
32 (*node->destructor)(node->data);
34 if (node->leaves) {
35 WMFreeArray(node->leaves);
37 wfree(node);
41 WMTreeNode*
42 WMCreateTreeNode(void *data)
44 return WMCreateTreeNodeWithDestructor(data, NULL);
48 WMTreeNode*
49 WMCreateTreeNodeWithDestructor(void *data, WMFreeDataProc *destructor)
51 WMTreeNode *node;
53 node = (WMTreeNode*) wmalloc(sizeof(W_TreeNode));
54 memset(node, 0, sizeof(W_TreeNode));
56 node->destructor = destructor;
58 node->data = data;
59 node->parent = NULL;
60 node->depth = 0;
61 node->leaves = WMCreateArrayWithDestructor(1, destroyNode);
63 return node;
67 WMTreeNode*
68 WMInsertItemInTree(WMTreeNode *parent, int index, void *item)
70 WMTreeNode *node;
72 wassertrv(parent!=NULL, NULL);
74 node = WMCreateTreeNodeWithDestructor(item, parent->destructor);
75 node->parent = parent;
76 node->depth = parent->depth+1;
77 if (index < 0 || index > WMGetArrayItemCount(parent->leaves)) {
78 WMAddToArray(parent->leaves, node);
79 } else {
80 WMInsertInArray(parent->leaves, index, node);
83 return node;
87 WMTreeNode*
88 WMAddItemToTree(WMTreeNode *parent, void *item)
90 WMTreeNode *node;
92 wassertrv(parent!=NULL, NULL);
94 node = WMCreateTreeNodeWithDestructor(item, parent->destructor);
95 node->parent = parent;
96 node->depth = parent->depth+1;
97 WMAddToArray(parent->leaves, node);
99 return node;
103 static void
104 updateNodeDepth(WMTreeNode *node, int depth)
106 int i;
108 node->depth = depth;
109 for (i=0; i<WMGetArrayItemCount(node->leaves); i++) {
110 updateNodeDepth(WMGetFromArray(node->leaves, i), depth+1);
115 WMTreeNode*
116 WMInsertNodeInTree(WMTreeNode *parent, int index, WMTreeNode *node)
118 wassertrv(parent!=NULL, NULL);
119 wassertrv(node!=NULL, NULL);
121 node->parent = parent;
122 updateNodeDepth(node, parent->depth+1);
123 if (index < 0 || index > WMGetArrayItemCount(parent->leaves)) {
124 WMAddToArray(parent->leaves, node);
125 } else {
126 WMInsertInArray(parent->leaves, index, node);
129 return node;
133 WMTreeNode*
134 WMAddNodeToTree(WMTreeNode *parent, WMTreeNode *node)
136 wassertrv(parent!=NULL, NULL);
137 wassertrv(node!=NULL, NULL);
139 node->parent = parent;
140 updateNodeDepth(node, parent->depth+1);
141 WMAddToArray(parent->leaves, node);
143 return node;
148 WMGetTreeNodeDepth(WMTreeNode *node)
150 return node->depth;
154 void
155 WMDestroyTreeNode(WMTreeNode *node)
157 destroyNode(node);