84 ptrdiff_t loc_parent, |
84 ptrdiff_t loc_parent, |
85 ptrdiff_t loc_children, ptrdiff_t loc_last_child, |
85 ptrdiff_t loc_children, ptrdiff_t loc_last_child, |
86 ptrdiff_t loc_prev, ptrdiff_t loc_next); |
86 ptrdiff_t loc_prev, ptrdiff_t loc_next); |
87 ``` |
87 ``` |
88 |
88 |
89 <warning> |
89 The function `cxTreeCreate()` creates a `CxTree` structure |
90 TODO: document |
90 where each node created by the `create_func` has the layout specified by the offset arguments. |
91 </warning> |
91 The function `cxTreeCreateSimple()` is exactly the same, except that it assumes the `cx_tree_node_base_layout`. |
|
92 |
|
93 In both cases the tree will be created empty, that is with no nodes, not even a root node. |
|
94 On the other hand, `cxTreeCreateWrapped()` creates a `CxTree` structure with the specified layout and `root` node |
|
95 where `root` may already be the root of a larger tree. |
|
96 |
|
97 Note, that a wrapped tree by default has no create or search functions assigned. |
|
98 Therefore, if you wish to use one of the functions below that needs those function pointers set, |
|
99 you will have to set them manually by assigning to the respective fields in the `CxTree` structure. |
92 |
100 |
93 ## Add Nodes |
101 ## Add Nodes |
94 |
102 |
95 ```C |
103 ```C |
96 #include <cx/tree.h> |
104 #include <cx/tree.h> |
151 size_t cxTreeSubtreeDepth(CxTree *tree, void *subtree_root); |
159 size_t cxTreeSubtreeDepth(CxTree *tree, void *subtree_root); |
152 |
160 |
153 size_t cxTreeDepth(CxTree *tree); |
161 size_t cxTreeDepth(CxTree *tree); |
154 ``` |
162 ``` |
155 |
163 |
156 <warning> |
164 The function `cxTreeSubtreeSize()` counts all nodes belonging to the subtree starting with `subtree_root`. |
157 TODO: document |
165 |
158 </warning> |
166 The function `cxTreeSubtreeDepth()` reports the maximum depth of the subtree starting with `subtree_root`. |
|
167 If the `subtree_root` does not have any children, this results in a depth of one. |
|
168 |
|
169 The function `cxTreeDepth()` is equivalent to `cxTreeSubtreeDepth()` where `subtree_root` is the root node of the entire tree. |
|
170 |
|
171 > Passing a `NULL` pointer as `subtree_root` makes those functions return zero. |
|
172 |
|
173 > In the current UCX version there is no separate function `cxTreeSize()`, because |
|
174 > the size attribute can be directly accessed in the `CxTree` structure. |
|
175 > The next UCX version is planned to have also a function for accessing that attribute. |
|
176 >{style="note"} |
159 |
177 |
160 ## Search |
178 ## Search |
161 |
179 |
162 ```C |
180 ```C |
163 #include <cx/tree.h> |
181 #include <cx/tree.h> |
177 void *cxTreeFindInSubtree(CxTree *tree, const void *data, |
195 void *cxTreeFindInSubtree(CxTree *tree, const void *data, |
178 void *subtree_root, size_t max_depth); |
196 void *subtree_root, size_t max_depth); |
179 ``` |
197 ``` |
180 |
198 |
181 <warning> |
199 <warning> |
182 TODO: document |
200 TODO: document low level functions |
183 </warning> |
201 </warning> |
|
202 |
|
203 The function `cxTreeFind()` uses the `search_data_func` of the `CxTree` |
|
204 to find the `data` in the tree, and returns a pointer to the node when the data was found (or `NULL`, otherwise). |
|
205 |
|
206 The function `cxTreeFindInSubtree()` is equivalent, except that it restricts the search to nodes |
|
207 in the subtree starting with (and including) `subtree_root`, and skipping all nodes below the `max_depth`. |
|
208 Note, that the `max_depth` is specified in relation to the `subtree_root` and not in relation to the entire tree. |
184 |
209 |
185 ## Iterator and Visitor |
210 ## Iterator and Visitor |
186 |
211 |
187 ```C |
212 ```C |
188 #include <cx/tree.h> |
213 #include <cx/tree.h> |