docs/Writerside/topics/tree.h.md

Sun, 06 Apr 2025 12:38:40 +0200

author
Mike Becker <universe@uap-core.de>
date
Sun, 06 Apr 2025 12:38:40 +0200
changeset 1275
0f21abc52241
parent 1273
c35be6dc1667
permissions
-rw-r--r--

complete tree documentation

relates to #451

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Tree
1142
9437530176bc add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents: 1141
diff changeset
2
1254
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
3 UCX provides several low-level function for working with arbitrary tree structures,
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
4 as well as some high-level functions for trees that induce a certain order on the data they store.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
5
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
6 The following convenience macros allow you to declare and use simple tree structures.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
7
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
8 ```C
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
9 #define CX_TREE_NODE_BASE(Type)
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
10
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
11 #define cx_tree_node_base_layout
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
12 ```
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
13
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
14 The `CX_TREE_NODE_BASE` macro declares four pointers of type `Type*`:
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
15 `parent`, `children`, `last_child`, `prev`, and `next`,
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
16 which must be placed as first member into your struct.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
17
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
18 You can use it for example like this:
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
19 ```C
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
20 typedef struct my_tree_node_s {
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
21 CX_TREE_NODE_BASE(struct my_tree_node_s);
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
22 int value;
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
23 char *desc;
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
24 } MyTreeNode;
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
25 ```
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
26
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
27 The macro `cx_tree_node_base_layout` expands to the offsets of the above-mentioned pointers.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
28 It will become handy when calling the low-level tree functions which expect all offsets to be passed as arguments.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
29
1266
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
30 > In all functions, the `last_child` and `prev` pointers are completely optional.
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
31 > If your tree structure does not contain the `last_child` pointer, the last child will be determined by
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
32 > traversing all children from the first child.
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
33 > The same happens when it does not have a `prev` pointer, and the left sibling of a child is needed.
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
34 > The `children` pointer (which points to the first child), and the `next` pointer are mandatory,
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
35 > and so is the `parent` pointer.
1265
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
36
1254
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
37 Before diving into the function definitions, there are four function pointer declarations you should know.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
38
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
39 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
40 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
41
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
42 typedef void *(*cx_tree_node_create_func)(
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
43 const void *data, void *context);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
44
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
45 typedef int (*cx_tree_search_data_func)(
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
46 const void *node, const void *data);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
47
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
48 typedef int (*cx_tree_search_func)(
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
49 const void *node, const void *new_node);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
50
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
51 typedef void (*cx_tree_relink_func)(
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
52 void *node, const void *old_parent, const void *new_parent);
1254
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
53 ```
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
54
1254
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
55 A `cx_tree_node_create_func` takes a pointer to the `data` the new node shall contain, and a `context` (which might be an allocator, for example).
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
56 It shall allocate and return the created node, or `NULL` when node creation is not possible.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
57
1254
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
58 A `cx_tree_search_data_func` shall check if the `node` contains the `data`, or if a child node might contain the data.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
59 It shall return zero, when `node` contains the `data`.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
60 When a child node _might_ contain the data, the returned positive number shall indicate how close the match is.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
61 It is _not_ relevant if the data can actually be found in the subtree - the positive number also indicates that the data could be inserted in that subtree.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
62 Only when the entire subtree starting with `node` cannot contain the `data`, a negative number is supposed to be returned.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
63
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
64 A `cx_tree_search_func` behaves exactly the same, except that it does expect a pointer to the `data` but a pointer to a node structure.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
65 In combination with the `cx_tree_node_create_func`, when inserting nodes with the high-level functions, a `new_node` is created first,
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
66 and then an appropriate insertion point is searched with the `cx_tree_search_func`.
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
67
1265
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
68 A `cx_tree_relink_func` is called when an intermediate node was removed from the tree and it's children need to be detached from
1254
6a342294499b add intro text for tree.h doc
Mike Becker <universe@uap-core.de>
parents: 1252
diff changeset
69 the removed `old_parent` and attached to a `new_parent`.
1265
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
70 The function is called for every child of the removed node and can be used, for example, to update the contents of the node when needed.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
71
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
72 ## Create
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
73
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
74 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
75 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
76
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
77 CxTree *cxTreeCreate(const CxAllocator *allocator,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
78 cx_tree_node_create_func create_func,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
79 cx_tree_search_func search_func,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
80 cx_tree_search_data_func search_data_func,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
81 ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
82 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
83 ptrdiff_t loc_prev, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
84
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
85 CxTree *cxTreeCreateSimple(const CxAllocator *allocator,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
86 cx_tree_node_create_func create_func,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
87 cx_tree_search_func search_func,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
88 cx_tree_search_data_func search_data_func);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
89
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
90 CxTree *cxTreeCreateWrapped(const CxAllocator *allocator,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
91 void *root,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
92 ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
93 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
94 ptrdiff_t loc_prev, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
95 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
96
1255
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
97 The function `cxTreeCreate()` creates a `CxTree` structure
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
98 where each node created by the `create_func` has the layout specified by the offset arguments.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
99 The function `cxTreeCreateSimple()` is exactly the same, except that it assumes the `cx_tree_node_base_layout`.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
100
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
101 In both cases the tree will be created empty, that is with no nodes, not even a root node.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
102 On the other hand, `cxTreeCreateWrapped()` creates a `CxTree` structure with the specified layout and `root` node
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
103 where `root` may already be the root of a larger tree.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
104
1266
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
105 If your wrapped tree structure does not have a `last_child` or a `prev` pointer,
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
106 you may specify a negative location to indicate the missing pointer.
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
107 All other pointers are mandatory and a non-negative location is expected.
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
108
1255
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
109 Note, that a wrapped tree by default has no create or search functions assigned.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
110 Therefore, if you wish to use one of the functions below that needs those function pointers set,
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
111 you will have to set them manually by assigning to the respective fields in the `CxTree` structure.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
112
1266
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
113 ### Example for wrapping a libxml2 tree
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
114
1272
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
115 In this example we wrap the XML tree of the commonly used libxml2 library.
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
116
1266
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
117 ```C
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
118 #include <libxml/tree.h>
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
119 #include <cx/tree.h>
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
120
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
121 CxTree *wrap_xml_tree(xmlNode *root) {
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
122 return cxTreeCreateWrapped(
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
123 cxDefaultAllocator, // or you can just write NULL
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
124 root,
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
125 offsetof(xmlNode, parent),
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
126 offsetof(xmlNode, children),
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
127 offsetof(xmlNode, last),
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
128 offsetof(xmlNode, prev),
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
129 offsetof(xmlNode, next)
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
130 );
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
131 }
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
132 ```
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
133
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
134 You do not need to specify any function pointers or destructors in the `CxTree` structure,
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
135 if you just want to use the resulting `CxTree` for [iterating](#iterator-and-visitor) over the nodes.
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
136
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
137 You can, for example, print the XML structure with the following code:
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
138
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
139 ```C
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
140 // continued from above
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
141
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
142 void print_xml_structure(CxTree *tree) {
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
143 // specify visit_on_exit argument = true
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
144 // so that we are visiting each node twice: on enter and on exit
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
145 CxTreeIterator iter = cxTreeIterate(tree, true);
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
146
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
147 cx_foreach(xmlNode*, node, iter) {
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
148 if (node->type == XML_ELEMENT_NODE) {
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
149 // the exiting field from the iterator indicates
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
150 // whether we are entring or leaving the subtree
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
151 // of the current element
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
152 printf("%s - %s\n",
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
153 node->name,
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
154 iter.exiting ? "start" : "end"
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
155 );
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
156 }
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
157 }
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
158 cxTreeIteratorDispose(&iter);
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
159 }
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
160 ```
a34373b17e58 wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents: 1265
diff changeset
161
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
162 ## Add Nodes
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
163
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
164 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
165 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
166
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
167 void cx_tree_link(void *parent, void *node, ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
168 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
169 ptrdiff_t loc_prev, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
170
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
171 extern unsigned int cx_tree_add_look_around_depth;
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
172
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
173 size_t cx_tree_add_iter(struct cx_iterator_base_s *iter, size_t n,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
174 cx_tree_search_func sfunc, cx_tree_node_create_func cfunc,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
175 void *cdata, void **failed, void *root,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
176 ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
177 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
178 ptrdiff_t loc_prev, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
179
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
180 size_t cx_tree_add_array(const void *src, size_t n, size_t elem_size,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
181 cx_tree_search_func sfunc, cx_tree_node_create_func cfunc,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
182 void *cdata, void **failed, void *root,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
183 ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
184 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
185 ptrdiff_t loc_prev, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
186
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
187 int cx_tree_add(const void *src,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
188 cx_tree_search_func sfunc, cx_tree_node_create_func cfunc,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
189 void *cdata, void **cnode, void *root,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
190 ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
191 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
192 ptrdiff_t loc_prev, ptrdiff_t loc_next);
1275
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
193 ```
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
194
1275
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
195 The low-level function `cx_tree_link()` adds a `node` to a new `parent`, unlinking it from its previous parent, if required.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
196
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
197 The functions `cx_tree_add_array()` and `cx_tree_add_iter()` are equivalent,
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
198 except that the former adds `n` items of size `elem_size` from the `src` array,
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
199 and the latter adds _up to_ `n` items from the iterator `iter`.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
200 For each element, the `cfun` is called with the element as first argument and the `cdata` context as second argument.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
201 The `cfun` function is supposed to return a node for which then the `sfunc` is used to find the location where to insert the node.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
202 If a node could not be added, because `sfunc` always returns a negative number, it is stored at the location where `failed` points to.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
203
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
204 > The functions `cx_tree_add_array()` and `cx_tree_add_iter()` are optimized for adding multiple nodes to
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
205 > the same subtree without starting the search all over from the root node.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
206 > This behavior can be controlled with `cx_tree_add_look_around_depth`, which specifies for how many parent nodes
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
207 > the algorithm backtracks in the current subtree before restarting the search from the root node.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
208
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
209 The function `cx_tree_add()` is similar to the other add-functions,
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
210 except that it does only add one single item to the tree and always stores the created node at the location where `cnode` points to.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
211
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
212 > By design, the add-functions can only be used to add children to the tree.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
213 > If you want to add a new root node, this is much easier by simply calling `cx_tree_link(newroot, oldroot, layout...)` .
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
214
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
215 The following high-level functions can be used to add nodes to a `CxTree`.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
216
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
217 ```C
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
218 #include <cx/tree.h>
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
219
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
220 int cxTreeAddChild(CxTree *tree, void *parent, const void *data);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
221
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
222 void cxTreeAddChildNode(CxTree *tree, void *parent, void *child);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
223
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
224 void cxTreeSetParent(CxTree *tree, void *parent, void *child);
1275
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
225
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
226 int cxTreeInsert(CxTree *tree, const void *data);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
227
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
228 size_t cxTreeInsertIter(CxTree *tree, CxIteratorBase *iter, size_t n);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
229
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
230 size_t cxTreeInsertArray(CxTree *tree, const void *data,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
231 size_t elem_size, size_t n);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
232 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
233
1275
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
234 The functions `cxTreeAddChild()`, `cxTreeAddChildNode()`, and `cxTreeSetParent()` are similar to `cx_tree_link()`.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
235 The difference between `cxTreeAddChild()` and `cxTreeAddChildNode()` is,
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
236 that `cxTreeAddChild()` uses the `cx_tree_node_create_func` of the `CxTree` to create the node first, before adding it.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
237 The function returns non-zero in case the creation of the node fails.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
238 The difference between `cxTreeSetParent()` and `cxTreeAddChildNode()` is,
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
239 that `cxTreeSetParent()` does not increase the tree size, when `child` already had a parent.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
240
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
241 > Use `cxTreeAddChildNode()` to add _new_ nodes to the tree and `cxTreeSetParent()`
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
242 > to relink a subtree of the `tree` with a new parent.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
243 >
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
244 > Using `cxTreeSetParent()` on a `child` which already has a parent in a _different_ tree is a mistake.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
245
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
246 The functions `cxTreeInsert()`, `cxTreeInsertIter()`, and `cxTreeInsertArray()` behave
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
247 like `cx_tree_add()`, `cx_tree_add_iter()`, and `cx_tree_add_array()`.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
248 As creation context `cdata` for the `cx_tree_node_create_func` a pointer to the `CxTree` is passed.
0f21abc52241 complete tree documentation
Mike Becker <universe@uap-core.de>
parents: 1273
diff changeset
249 Instead of returning a `failed` node, like the low-level functions, the high-level functions automatically free the memory for the failed node.
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
250
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
251 ## Size and Depth
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
253 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
254 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
255
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
256 size_t cxTreeSubtreeSize(CxTree *tree, void *subtree_root);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
257
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
258 size_t cxTreeSubtreeDepth(CxTree *tree, void *subtree_root);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
259
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
260 size_t cxTreeDepth(CxTree *tree);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
261 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
262
1255
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
263 The function `cxTreeSubtreeSize()` counts all nodes belonging to the subtree starting with `subtree_root`.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
264
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
265 The function `cxTreeSubtreeDepth()` reports the maximum depth of the subtree starting with `subtree_root`.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
266 If the `subtree_root` does not have any children, this results in a depth of one.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
267
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
268 The function `cxTreeDepth()` is equivalent to `cxTreeSubtreeDepth()` where `subtree_root` is the root node of the entire tree.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
269
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
270 > Passing a `NULL` pointer as `subtree_root` makes those functions return zero.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
271
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
272 > In the current UCX version there is no separate function `cxTreeSize()`, because
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
273 > the size attribute can be directly accessed in the `CxTree` structure.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
274 > The next UCX version is planned to have also a function for accessing that attribute.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
275 >{style="note"}
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
276
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
277 ## Search
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
278
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
279 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
280 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
281
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
282 #define CX_TREE_SEARCH_INFINITE_DEPTH
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
283
1273
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
284 int cx_tree_search_data(const void *root, size_t max_depth,
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
285 const void *data, cx_tree_search_data_func sfunc,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
286 void **result, ptrdiff_t loc_children, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
287
1273
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
288 int cx_tree_search(const void *root, size_t max_depth,
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
289 const void *node, cx_tree_search_func sfunc,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
290 void **result, ptrdiff_t loc_children, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
291
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
292 void *cxTreeFind(CxTree *tree, const void *data);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
293
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
294 void *cxTreeFindInSubtree(CxTree *tree, const void *data,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
295 void *subtree_root, size_t max_depth);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
296 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
297
1273
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
298 The functions `cx_tree_search_data()` and `cx_tree_search()` are equivalent,
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
299 except that `cx_tree_search_data()` compares a currently investigated node against the `data` with the specified `cx_tree_search_data_func`,
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
300 and `cx_tree_search()` compares against a `node` with the specified `cx_tree_search_func`.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
301
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
302 Usually you the latter is rarely needed.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
303 It is used, for example, by `cx_tree_add()` to find the correct position where to add a freshly created node.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
304
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
305 The search proceeds as follows, starting with the `root` node:
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
306
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
307 1. The current node is compared with `data` / `node` using the `sfunc`.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
308 2. If `sfunc` returns zero, a matching node has been found and the pointer to that node is stored at the location given by `result`.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
309 3. If `sfunc` returns a negative number, the entire subtree is skipped.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
310 4. If `sfunc` returns a positive number, the subtree is searched, unless the number is larger than the number of an already searched subtree. The best match will be stored at the location given by `result`.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
311 5. The return value will be the return value of the `sfunc` for node that was stored in the `result`, or a negative number when no match was found
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
312
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
313 > If the `sfunc` implements some kind of metric, the search functions will return the best match in the tree with respect to that metric.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
314 > When a positive number is returned, it means, that a new node with the searched data could be added as a child of the found node.
c35be6dc1667 document tree search functions
Mike Becker <universe@uap-core.de>
parents: 1272
diff changeset
315 > This is exactly how `cx_tree_add()` finds the best position to add a node to the tree.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
316
1255
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
317 The function `cxTreeFind()` uses the `search_data_func` of the `CxTree`
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
318 to find the `data` in the tree, and returns a pointer to the node when the data was found (or `NULL`, otherwise).
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
319
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
320 The function `cxTreeFindInSubtree()` is equivalent, except that it restricts the search to nodes
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
321 in the subtree starting with (and including) `subtree_root`, and skipping all nodes below the `max_depth`.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
322 Note, that the `max_depth` is specified in relation to the `subtree_root` and not in relation to the entire tree.
a9d730c8b94a add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1254
diff changeset
323
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
324 ## Iterator and Visitor
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
325
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
326 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
327 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
328
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
329 CxTreeIterator cx_tree_iterator(void *root, bool visit_on_exit,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
330 ptrdiff_t loc_children, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
331
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
332 CxTreeIterator cxTreeIterate(CxTree *tree, bool visit_on_exit);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
333
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
334 CxTreeIterator cxTreeIterateSubtree(CxTree *tree,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
335 void *node, bool visit_on_exit);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
336
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
337 #define cxTreeIteratorContinue(iter)
1142
9437530176bc add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents: 1141
diff changeset
338
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
339 void cxTreeIteratorDispose(CxTreeIterator *iter);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
340
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
341
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
342 CxTreeVisitor cx_tree_visitor(void *root,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
343 ptrdiff_t loc_children, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
344
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
345 CxTreeVisitor cxTreeVisit(CxTree *tree);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
346
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
347 CxTreeVisitor cxTreeVisitSubtree(CxTree *tree, void *node)
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
348
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
349 #define cxTreeVisitorContinue(visitor)
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
350
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
351 void cxTreeVisitorDispose(CxTreeVisitor *visitor);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
352 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
353
1271
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
354 There are two different kind of iterators for trees.
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
355 The `CxTreeIterator` is performing a depth-first iteration with the capability of visiting a node twice:
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
356 first when the iterator enters the node coming from its parent, and secondly when the iterator tracks back from its last child.
1272
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
357 This behavior is controlled via the `visit_on_exit` argument.
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
358 When set to `true`, the iterators `exiting` flag can be checked during iteration to see whether the iterator is currently entering or leaving the node.
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
359 The above [example](#example-for-wrapping-a-libxml2-tree) for iterating through an XML tree illustrates this.
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
360
1271
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
361 On the other hand, the `CxTreeVisitor` performs a breadth-first iteration and visits every node only once.
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
362
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
363 Since tree iteration needs to keep track of a stack (depth-first) or queue (breadth-frist), internal memory is allocated.
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
364 This memory is _automatically_ disposed when the iteration _completes_.
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
365 If you break from the iteration early, you must call `cxTreeIteratorDispose()` or `cxTreeVisitorDispose()`, respectively, to deallocate the memory.
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
366
1272
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
367 > It is recommended to always invoke the dispose functions, even when it seems not necessary.
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
368 > In the best case it just does nothing, but calling them guarantees that no memory can be leaking, even when your code changes in the future.
1271
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
369 >{style="note"}
e9c0ad327684 add iterator / visitor docu
Mike Becker <universe@uap-core.de>
parents: 1266
diff changeset
370
1272
d016fe8a647c refine parts of the tree documentation
Mike Becker <universe@uap-core.de>
parents: 1271
diff changeset
371 The macros `cxTreeIteratorContinue()` and `cxTreeVisitorContinue()` equivalently instruct the iterator/visitor to skip the subtree below the currently inspected node.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
372
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
373 ## Remove
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
374
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
375 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
376 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
377
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
378 void cx_tree_unlink(void *node, ptrdiff_t loc_parent,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
379 ptrdiff_t loc_children, ptrdiff_t loc_last_child,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
380 ptrdiff_t loc_prev, ptrdiff_t loc_next);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
381
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
382 int cxTreeRemoveNode(CxTree *tree, void *node,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
383 cx_tree_relink_func relink_func);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
384
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
385 void cxTreeRemoveSubtree(CxTree *tree, void *node);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
386 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
387
1265
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
388 The low-level function `cx_tree_unlink()` removes the specified `node`,
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
389 as well as the entire subtree beneath that node, from its parent.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
390 The high-level counterpart is `cxTreeRemoveSubtree()`.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
391
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
392 The function `cxTreeRemoveNode()`, on the other hand, _only_ removes the `node` from the tree,
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
393 links all children of `node` to the former parent of `node`,
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
394 and calls the optional `relink_func` for every former child of `node` which will be relinked to a new parent.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
395 Therefore, calling `cxTreeRemoveNode()` on the `root` node is an error and the function returns non-zero.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
396 In all other cases, the function returns zero.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
397
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
398 > When your tree is storing a scene graph, for example, a possible use-case for the `relink_func` might be updating
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
399 > the world transform matrices in the subtree of the removed node.
1252
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
400
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
401 ## Dispose
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
402
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
403 ```C
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
404 #include <cx/tree.h>
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
405
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
406 int cxTreeDestroyNode(CxTree *tree, void *node,
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
407 cx_tree_relink_func relink_func);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
408
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
409 void cxTreeDestroySubtree(CxTree *tree, void *node);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
410
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
411 void cxTreeClear(CxTree *tree);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
412
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
413 void cxTreeFree(CxTree *tree);
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
414 ```
14c227b28a96 basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents: 1190
diff changeset
415
1265
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
416 The function `cxTreeDestroyNode()` first [removes](#remove) the `node` from the tree, like `cxTreeRemoveNode()`,
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
417 and then invokes the [destructor functions](collection.h.md#destructor-functions).
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
418 It is guaranteed, that the simple destructor is called before the advanced destructor.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
419 If no destructor function is registered at all, the behavior is identical to `cxTreeRemoveNode()`.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
420 That means, this function does not deallocate the memory for the node on its own and leaves that entirely to the destructor functions.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
421
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
422 The function `cxTreeDestroySubtree()` performs the above actions for the entire subtree starting with `node`.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
423 The order in which the destructor functions for the nodes of the subtree are called are determined by a [tree iterator](#iterator-and-visitor).
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
424
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
425 The function `cxTreeClear()` is a shorthand for invoking `cxTreeDestroySubtree()` on the root node of the tree.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
426
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
427 The function `cxTreeFree()` behaves like `cxTreeClear()` and then deallocates the memory for the `CxTree` structure.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
428
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
429 > Although `CxTree` supports the general concept of [destructor functions](collection.h.md#destructor-functions),
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
430 > it is not based on `CX_COLLECTION_BASE`.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
431 > Therefore, the `cxDefineDestructor()` and `cxDefineAdvancedDestructor()` macros cannot be used on a `CxTree` and
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
432 > the fields must be set manually.
07d67421092a document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents: 1255
diff changeset
433 >{style="note"}
1190
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
434
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
435 <seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
436 <category ref="apidoc">
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
437 <a href="https://ucx.sourceforge.io/api/tree_8h.html">tree.h</a>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
438 </category>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
439 </seealso>
a7b913d5d589 bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents: 1143
diff changeset
440

mercurial