Sat, 29 Mar 2025 19:58:41 +0100
wrapping xml tree example
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 | |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
115 | ```C |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
116 | #include <libxml/tree.h> |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
117 | #include <cx/tree.h> |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
118 | |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
119 | CxTree *wrap_xml_tree(xmlNode *root) { |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
120 | return cxTreeCreateWrapped( |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
121 | cxDefaultAllocator, // or you can just write NULL |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
122 | root, |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
123 | offsetof(xmlNode, parent), |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
124 | offsetof(xmlNode, children), |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
125 | offsetof(xmlNode, last), |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
126 | offsetof(xmlNode, prev), |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
127 | offsetof(xmlNode, next) |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
128 | ); |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
129 | } |
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 | 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
|
133 | 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
|
134 | |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
135 | 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
|
136 | |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
137 | ```C |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
138 | // continued from above |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
139 | |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
140 | void print_xml_structure(CxTree *tree) { |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
141 | // specify visit_on_exit argument = true |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
142 | // 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
|
143 | CxTreeIterator iter = cxTreeIterate(tree, true); |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
144 | |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
145 | cx_foreach(xmlNode*, node, iter) { |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
146 | if (node->type == XML_ELEMENT_NODE) { |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
147 | // the exiting field from the iterator indicates |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
148 | // whether we are entring or leaving the subtree |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
149 | // of the current element |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
150 | printf("%s - %s\n", |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
151 | node->name, |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
152 | iter.exiting ? "start" : "end" |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
153 | ); |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
154 | } |
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 | cxTreeIteratorDispose(&iter); |
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 | ``` |
a34373b17e58
wrapping xml tree example
Mike Becker <universe@uap-core.de>
parents:
1265
diff
changeset
|
159 | |
1252
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
160 | ## Add Nodes |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
161 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
162 | ```C |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
163 | #include <cx/tree.h> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
164 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
165 | 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
|
166 | 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
|
167 | 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
|
168 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
169 | 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
|
170 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
171 | 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
|
172 | 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
|
173 | void *cdata, void **failed, void *root, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
174 | ptrdiff_t loc_parent, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
175 | 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
|
176 | 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
|
177 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
178 | 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
|
179 | 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
|
180 | void *cdata, void **failed, void *root, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
181 | ptrdiff_t loc_parent, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
182 | 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
|
183 | 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
|
184 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
185 | int cx_tree_add(const void *src, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
186 | 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
|
187 | void *cdata, void **cnode, void *root, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
188 | ptrdiff_t loc_parent, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
189 | 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
|
190 | 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
|
191 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
192 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
193 | 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
|
194 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
195 | 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
|
196 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
197 | void cxTreeSetParent(CxTree *tree, void *parent, void *child); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
198 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
199 | int cxTreeInsert(CxTree *tree, const void *data); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
200 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
201 | 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
|
202 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
203 | 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
|
204 | size_t elem_size, size_t n); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
205 | ``` |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
206 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
207 | <warning> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
208 | TODO: document |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
209 | </warning> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
210 | |
1252
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
211 | ## Size and Depth |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
212 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
213 | ```C |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
214 | #include <cx/tree.h> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
215 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
216 | 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
|
217 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
218 | 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
|
219 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
220 | size_t cxTreeDepth(CxTree *tree); |
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 | |
1255
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
223 | 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
|
224 | |
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
225 | 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
|
226 | 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
|
227 | |
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
228 | 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
|
229 | |
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
230 | > 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
|
231 | |
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
232 | > 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
|
233 | > 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
|
234 | > 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
|
235 | >{style="note"} |
1252
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
236 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
237 | ## Search |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
238 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
239 | ```C |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
240 | #include <cx/tree.h> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
241 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
242 | #define CX_TREE_SEARCH_INFINITE_DEPTH |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
243 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
244 | int cx_tree_search_data(const void *root, size_t depth, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
245 | 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
|
246 | 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
|
247 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
248 | int cx_tree_search(const void *root, size_t depth, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
249 | 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
|
250 | 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
|
251 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
252 | void *cxTreeFind(CxTree *tree, const void *data); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
253 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
254 | void *cxTreeFindInSubtree(CxTree *tree, const void *data, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
255 | void *subtree_root, size_t max_depth); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
256 | ``` |
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 | <warning> |
1255
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
259 | TODO: document low level functions |
1252
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
260 | </warning> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
261 | |
1255
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
262 | 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
|
263 | 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
|
264 | |
a9d730c8b94a
add some tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1254
diff
changeset
|
265 | 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
|
266 | 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
|
267 | 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
|
268 | |
1252
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
269 | ## Iterator and Visitor |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
270 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
271 | ```C |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
272 | #include <cx/tree.h> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
273 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
274 | 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
|
275 | 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
|
276 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
277 | 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
|
278 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
279 | CxTreeIterator cxTreeIterateSubtree(CxTree *tree, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
280 | void *node, bool visit_on_exit); |
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 cxTreeIteratorContinue(iter) |
1142
9437530176bc
add symbols that need documentation as TODOs
Mike Becker <universe@uap-core.de>
parents:
1141
diff
changeset
|
283 | |
1252
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
284 | void cxTreeIteratorDispose(CxTreeIterator *iter); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
285 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
286 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
287 | CxTreeVisitor cx_tree_visitor(void *root, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
288 | 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
|
289 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
290 | CxTreeVisitor cxTreeVisit(CxTree *tree); |
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 | CxTreeVisitor cxTreeVisitSubtree(CxTree *tree, void *node) |
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 | #define cxTreeVisitorContinue(visitor) |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
295 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
296 | void cxTreeVisitorDispose(CxTreeVisitor *visitor); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
297 | ``` |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
298 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
299 | <warning> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
300 | TODO: document |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
301 | </warning> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
302 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
303 | ## Remove |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
304 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
305 | ```C |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
306 | #include <cx/tree.h> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
307 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
308 | 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
|
309 | 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
|
310 | 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
|
311 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
312 | int cxTreeRemoveNode(CxTree *tree, void *node, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
313 | cx_tree_relink_func relink_func); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
314 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
315 | void cxTreeRemoveSubtree(CxTree *tree, void *node); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
316 | ``` |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
317 | |
1265
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
318 | 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
|
319 | 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
|
320 | The high-level counterpart is `cxTreeRemoveSubtree()`. |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
321 | |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
322 | 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
|
323 | 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
|
324 | 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
|
325 | 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
|
326 | 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
|
327 | |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
328 | > 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
|
329 | > 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
|
330 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
331 | ## Dispose |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
332 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
333 | ```C |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
334 | #include <cx/tree.h> |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
335 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
336 | int cxTreeDestroyNode(CxTree *tree, void *node, |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
337 | cx_tree_relink_func relink_func); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
338 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
339 | void cxTreeDestroySubtree(CxTree *tree, void *node); |
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 | void cxTreeClear(CxTree *tree); |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
342 | |
14c227b28a96
basic structure for tree.h documentation
Mike Becker <universe@uap-core.de>
parents:
1190
diff
changeset
|
343 | void cxTreeFree(CxTree *tree); |
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 | |
1265
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
346 | 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
|
347 | 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
|
348 | 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
|
349 | 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
|
350 | 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
|
351 | |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
352 | 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
|
353 | 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
|
354 | |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
355 | 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
|
356 | |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
357 | 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
|
358 | |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
359 | > 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
|
360 | > 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
|
361 | > 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
|
362 | > the fields must be set manually. |
07d67421092a
document remove and dispose for tree.h
Mike Becker <universe@uap-core.de>
parents:
1255
diff
changeset
|
363 | >{style="note"} |
1190
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
364 | |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
365 | <seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
366 | <category ref="apidoc"> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
367 | <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
|
368 | </category> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
369 | </seealso> |
a7b913d5d589
bring incomplete docs into a shape that can be released
Mike Becker <universe@uap-core.de>
parents:
1143
diff
changeset
|
370 |