1085 */ |
1085 */ |
1086 __attribute__((__nonnull__)) |
1086 __attribute__((__nonnull__)) |
1087 size_t cxTreeDepth(CxTree *tree); |
1087 size_t cxTreeDepth(CxTree *tree); |
1088 |
1088 |
1089 /** |
1089 /** |
|
1090 * Creates a depth-first iterator for the specified tree starting in \p node. |
|
1091 * |
|
1092 * If the node is not part of the tree, the behavior is undefined. |
|
1093 * |
|
1094 * @param tree the tree to iterate |
|
1095 * @param node the node where to start |
|
1096 * @param visit_on_exit true, if the iterator shall visit a node again when |
|
1097 * leaving the sub-tree |
|
1098 * @return a tree iterator (depth-first) |
|
1099 * @see cxTreeVisit() |
|
1100 */ |
|
1101 __attribute__((__nonnull__, __warn_unused_result__)) |
|
1102 static inline CxTreeIterator cxTreeIterateSubtree( |
|
1103 CxTree *tree, |
|
1104 void *node, |
|
1105 bool visit_on_exit |
|
1106 ) { |
|
1107 return cx_tree_iterator( |
|
1108 node, visit_on_exit, |
|
1109 tree->loc_children, tree->loc_next |
|
1110 ); |
|
1111 } |
|
1112 |
|
1113 /** |
|
1114 * Creates a breadth-first iterator for the specified tree starting in \p node. |
|
1115 * |
|
1116 * If the node is not part of the tree, the behavior is undefined. |
|
1117 * |
|
1118 * @param tree the tree to iterate |
|
1119 * @param node the node where to start |
|
1120 * @return a tree visitor (a.k.a. breadth-first iterator) |
|
1121 * @see cxTreeIterate() |
|
1122 */ |
|
1123 __attribute__((__nonnull__, __warn_unused_result__)) |
|
1124 static inline CxTreeVisitor cxTreeVisitSubtree(CxTree *tree, void *node) { |
|
1125 return cx_tree_visitor( |
|
1126 node, tree->loc_children, tree->loc_next |
|
1127 ); |
|
1128 } |
|
1129 |
|
1130 /** |
1090 * Creates a depth-first iterator for the specified tree. |
1131 * Creates a depth-first iterator for the specified tree. |
1091 * |
1132 * |
1092 * @param tree the tree to iterate |
1133 * @param tree the tree to iterate |
1093 * @param visit_on_exit true, if the iterator shall visit a node again when |
1134 * @param visit_on_exit true, if the iterator shall visit a node again when |
1094 * leaving the sub-tree |
1135 * leaving the sub-tree |
1095 * @return a tree iterator (depth-first) |
1136 * @return a tree iterator (depth-first) |
1096 * @see cxTreeVisitor() |
1137 * @see cxTreeVisit() |
1097 */ |
1138 */ |
1098 __attribute__((__nonnull__, __warn_unused_result__)) |
1139 __attribute__((__nonnull__, __warn_unused_result__)) |
1099 static inline CxTreeIterator cxTreeIterator( |
1140 static inline CxTreeIterator cxTreeIterate( |
1100 CxTree *tree, |
1141 CxTree *tree, |
1101 bool visit_on_exit |
1142 bool visit_on_exit |
1102 ) { |
1143 ) { |
1103 return cx_tree_iterator( |
1144 return cxTreeIterateSubtree(tree, tree->root, visit_on_exit); |
1104 tree->root, visit_on_exit, |
|
1105 tree->loc_children, tree->loc_next |
|
1106 ); |
|
1107 } |
1145 } |
1108 |
1146 |
1109 /** |
1147 /** |
1110 * Creates a breadth-first iterator for the specified tree. |
1148 * Creates a breadth-first iterator for the specified tree. |
1111 * |
1149 * |
1112 * @param tree the tree to iterate |
1150 * @param tree the tree to iterate |
1113 * @return a tree visitor (a.k.a. breadth-first iterator) |
1151 * @return a tree visitor (a.k.a. breadth-first iterator) |
1114 * @see cxTreeIterator() |
1152 * @see cxTreeIterate() |
1115 */ |
1153 */ |
1116 __attribute__((__nonnull__, __warn_unused_result__)) |
1154 __attribute__((__nonnull__, __warn_unused_result__)) |
1117 static inline CxTreeVisitor cxTreeVisitor(CxTree *tree) { |
1155 static inline CxTreeVisitor cxTreeVisit(CxTree *tree) { |
1118 return cx_tree_visitor( |
1156 return cxTreeVisitSubtree(tree, tree->root); |
1119 tree->root, tree->loc_children, tree->loc_next |
|
1120 ); |
|
1121 } |
1157 } |
1122 |
1158 |
1123 /** |
1159 /** |
1124 * Adds a new node to the tree. |
1160 * Adds a new node to the tree. |
1125 * |
1161 * |