| 47 /** |
47 /** |
| 48 * A depth-first tree iterator. |
48 * A depth-first tree iterator. |
| 49 * |
49 * |
| 50 * This iterator is not position-aware in a strict sense, as it does not assume |
50 * This iterator is not position-aware in a strict sense, as it does not assume |
| 51 * a particular order of elements in the tree. However, the iterator keeps track |
51 * a particular order of elements in the tree. However, the iterator keeps track |
| 52 * of the number of nodes it has passed in a counter variable. |
52 * of the number of nodes it has passed in a counter-variable. |
| 53 * Each node, regardless of the number of passes, is counted only once. |
53 * Each node, regardless of the number of passes, is counted only once. |
| 54 * |
54 * |
| 55 * @note Objects that are pointed to by an iterator are mutable through that |
55 * @note Objects that are pointed to by an iterator are mutable through that |
| 56 * iterator. However, if the |
56 * iterator. However, if the |
| 57 * underlying data structure is mutated by other means than this iterator (e.g. |
57 * underlying data structure is mutated by other means than this iterator (e.g., |
| 58 * elements added or removed), the iterator becomes invalid (regardless of what |
58 * elements added or removed), the iterator becomes invalid (regardless of what |
| 59 * cxIteratorValid() returns). |
59 * cxIteratorValid() returns). |
| 60 * |
60 * |
| 61 * @see CxIterator |
61 * @see CxIterator |
| 62 */ |
62 */ |
| 153 * If you want to discard the iterator before, you MUST manually call |
153 * If you want to discard the iterator before, you MUST manually call |
| 154 * cxTreeVisitorDispose(). |
154 * cxTreeVisitorDispose(). |
| 155 * |
155 * |
| 156 * This iterator is not position-aware in a strict sense, as it does not assume |
156 * This iterator is not position-aware in a strict sense, as it does not assume |
| 157 * a particular order of elements in the tree. However, the iterator keeps track |
157 * a particular order of elements in the tree. However, the iterator keeps track |
| 158 * of the number of nodes it has passed in a counter variable. |
158 * of the number of nodes it has passed in a counter-variable. |
| 159 * Each node, regardless of the number of passes, is counted only once. |
159 * Each node, regardless of the number of passes, is counted only once. |
| 160 * |
160 * |
| 161 * @note Objects that are pointed to by an iterator are mutable through that |
161 * @note Objects that are pointed to by an iterator are mutable through that |
| 162 * iterator. However, if the |
162 * iterator. However, if the |
| 163 * underlying data structure is mutated by other means than this iterator (e.g. |
163 * underlying data structure is mutated by other means than this iterator (e.g., |
| 164 * elements added or removed), the iterator becomes invalid (regardless of what |
164 * elements added or removed), the iterator becomes invalid (regardless of what |
| 165 * cxIteratorValid() returns). |
165 * cxIteratorValid() returns). |
| 166 * |
166 * |
| 167 * @see CxIterator |
167 * @see CxIterator |
| 168 */ |
168 */ |
| 248 #define cxTreeVisitorContinue(visitor) cxTreeIteratorContinue(visitor) |
248 #define cxTreeVisitorContinue(visitor) cxTreeIteratorContinue(visitor) |
| 249 |
249 |
| 250 /** |
250 /** |
| 251 * Links a node to a (new) parent. |
251 * Links a node to a (new) parent. |
| 252 * |
252 * |
| 253 * If the node has already a parent, it is unlinked, first. |
253 * If the node already has a parent, it is unlinked, first. |
| 254 * If the parent has children already, the node is @em appended to the list |
254 * If the parent has children already, the node is @em appended to the list |
| 255 * of all currently existing children. |
255 * of all currently existing children. |
| 256 * |
256 * |
| 257 * @param parent the parent node |
257 * @param parent the parent node |
| 258 * @param node the node that shall be linked |
258 * @param node the node that shall be linked |
| 316 * The function should use the returned integer to indicate how close the |
316 * The function should use the returned integer to indicate how close the |
| 317 * match is, where a negative number means that it does not match at all. |
317 * match is, where a negative number means that it does not match at all. |
| 318 * Zero means exact match and a positive number is an implementation defined |
318 * Zero means exact match and a positive number is an implementation defined |
| 319 * measure for the distance to an exact match. |
319 * measure for the distance to an exact match. |
| 320 * |
320 * |
| 321 * For example if a tree stores file path information, a node that is |
321 * For example, consider a tree that stores file path information. |
| 322 * describing a parent directory of a filename that is searched, shall |
322 * A node which is describing a parent directory of a searched file shall |
| 323 * return a positive number to indicate that a child node might contain the |
323 * return a positive number to indicate that a child node might contain the |
| 324 * searched item. On the other hand, if the node denotes a path that is not a |
324 * searched item. On the other hand, if the node denotes a path that is not a |
| 325 * prefix of the searched filename, the function would return -1 to indicate |
325 * prefix of the searched filename, the function would return -1 to indicate |
| 326 * that the search does not need to be continued in that branch. |
326 * that the search does not need to be continued in that branch. |
| 327 * |
327 * |
| 328 * @param node the node that is currently investigated |
328 * @param node the node that is currently investigated |
| 329 * @param data the data that is searched for |
329 * @param data the data that is searched for |
| 330 * |
330 * |
| 331 * @return 0 if the node contains the data, |
331 * @return 0 if the node contains the data, |
| 332 * positive if one of the children might contain the data, |
332 * positive if one of the children might contain the data, |
| 333 * negative if neither the node, nor the children contains the data |
333 * negative if neither the node nor the children contains the data |
| 334 */ |
334 */ |
| 335 cx_attr_nonnull |
335 cx_attr_nonnull |
| 336 typedef int (*cx_tree_search_data_func)(const void *node, const void *data); |
336 typedef int (*cx_tree_search_data_func)(const void *node, const void *data); |
| 337 |
337 |
| 338 |
338 |
| 346 * The function should use the returned integer to indicate how close the |
346 * The function should use the returned integer to indicate how close the |
| 347 * match is, where a negative number means that it does not match at all. |
347 * match is, where a negative number means that it does not match at all. |
| 348 * Zero means exact match and a positive number is an implementation defined |
348 * Zero means exact match and a positive number is an implementation defined |
| 349 * measure for the distance to an exact match. |
349 * measure for the distance to an exact match. |
| 350 * |
350 * |
| 351 * For example if a tree stores file path information, a node that is |
351 * For example, consider a tree that stores file path information. |
| 352 * describing a parent directory of a filename that is searched, shall |
352 * A node which is describing a parent directory of a searched file shall |
| 353 * return a positive number to indicate that a child node might contain the |
353 * return a positive number to indicate that a child node might contain the |
| 354 * searched item. On the other hand, if the node denotes a path that is not a |
354 * searched item. On the other hand, if the node denotes a path that is not a |
| 355 * prefix of the searched filename, the function would return -1 to indicate |
355 * prefix of the searched filename, the function would return -1 to indicate |
| 356 * that the search does not need to be continued in that branch. |
356 * that the search does not need to be continued in that branch. |
| 357 * |
357 * |
| 358 * @param node the node that is currently investigated |
358 * @param node the node that is currently investigated |
| 359 * @param new_node a new node with the information which is searched |
359 * @param new_node a new node with the information which is searched |
| 360 * |
360 * |
| 361 * @return 0 if @p node contains the same data as @p new_node, |
361 * @return 0 if @p node contains the same data as @p new_node, |
| 362 * positive if one of the children might contain the data, |
362 * positive if one of the children might contain the data, |
| 363 * negative if neither the node, nor the children contains the data |
363 * negative if neither the node nor the children contains the data |
| 364 */ |
364 */ |
| 365 cx_attr_nonnull |
365 cx_attr_nonnull |
| 366 typedef int (*cx_tree_search_func)(const void *node, const void *new_node); |
366 typedef int (*cx_tree_search_func)(const void *node, const void *new_node); |
| 367 |
367 |
| 368 /** |
368 /** |
| 369 * Searches for data in a tree. |
369 * Searches for data in a tree. |
| 370 * |
370 * |
| 371 * When the data cannot be found exactly, the search function might return a |
371 * When the data cannot be found exactly, the search function might return the |
| 372 * closest result which might be a good starting point for adding a new node |
372 * closest result, which might be a good starting point for adding a new node |
| 373 * to the tree (see also #cx_tree_add()). |
373 * to the tree (see also #cx_tree_add()). |
| 374 * |
374 * |
| 375 * Depending on the tree structure it is not necessarily guaranteed that the |
375 * Depending on the tree structure, it is not necessarily guaranteed that the |
| 376 * "closest" match is uniquely defined. This function will search for a node |
376 * "closest" match is uniquely defined. This function will search for a node |
| 377 * with the best match according to the @p sfunc (meaning: the return value of |
377 * with the best match according to the @p sfunc (meaning: the return value of |
| 378 * @p sfunc which is closest to zero). If that is also ambiguous, an arbitrary |
378 * @p sfunc which is closest to zero). If that is also ambiguous, an arbitrary |
| 379 * node matching the criteria is returned. |
379 * node matching the criteria is returned. |
| 380 * |
380 * |
| 404 |
404 |
| 405 /** |
405 /** |
| 406 * Searches for a node in a tree. |
406 * Searches for a node in a tree. |
| 407 * |
407 * |
| 408 * When no node with the same data can be found, the search function might |
408 * When no node with the same data can be found, the search function might |
| 409 * return a closest result which might be a good starting point for adding the |
409 * return the closest result, which might be a good starting point for adding the |
| 410 * new node to the tree (see also #cx_tree_add()). |
410 * new node to the tree (see also #cx_tree_add()). |
| 411 * |
411 * |
| 412 * Depending on the tree structure it is not necessarily guaranteed that the |
412 * Depending on the tree structure, it is not necessarily guaranteed that the |
| 413 * "closest" match is uniquely defined. This function will search for a node |
413 * "closest" match is uniquely defined. This function will search for a node |
| 414 * with the best match according to the @p sfunc (meaning: the return value of |
414 * with the best match according to the @p sfunc (meaning: the return value of |
| 415 * @p sfunc which is closest to zero). If that is also ambiguous, an arbitrary |
415 * @p sfunc which is closest to zero). If that is also ambiguous, an arbitrary |
| 416 * node matching the criteria is returned. |
416 * node matching the criteria is returned. |
| 417 * |
417 * |
| 494 ptrdiff_t loc_next |
494 ptrdiff_t loc_next |
| 495 ); |
495 ); |
| 496 |
496 |
| 497 /** |
497 /** |
| 498 * Describes a function that creates a tree node from the specified data. |
498 * Describes a function that creates a tree node from the specified data. |
| 499 * The first argument points to the data the node shall contain and |
499 * The first argument points to the data the node shall contain, and |
| 500 * the second argument may be used for additional data (e.g. an allocator). |
500 * the second argument may be used for additional data (e.g., an allocator). |
| 501 * Functions of this type shall either return a new pointer to a newly |
501 * Functions of this type shall either return a new pointer to a newly |
| 502 * created node or @c NULL when allocation fails. |
502 * created node or @c NULL when allocation fails. |
| 503 * |
503 * |
| 504 * @note the function may leave the node pointers in the struct uninitialized. |
504 * @note the function may leave the node pointers in the struct uninitialized. |
| 505 * The caller is responsible to set them according to the intended use case. |
505 * The caller is responsible to set them according to the intended use case. |
| 635 * specified @p sfunc. |
635 * specified @p sfunc. |
| 636 * |
636 * |
| 637 * When a location is found, the @p cfunc will be invoked with @p cdata. |
637 * When a location is found, the @p cfunc will be invoked with @p cdata. |
| 638 * |
638 * |
| 639 * The node returned by @p cfunc will be linked into the tree. |
639 * The node returned by @p cfunc will be linked into the tree. |
| 640 * When @p sfunc returned a positive integer, the new node will be linked as a |
640 * When @p sfunc returns a positive integer, the new node will be linked as a |
| 641 * child. The other children (now siblings of the new node) are then checked |
641 * child. The other children (now siblings of the new node) are then checked |
| 642 * with @p sfunc, whether they could be children of the new node and re-linked |
642 * with @p sfunc, whether they could be children of the new node and re-linked |
| 643 * accordingly. |
643 * accordingly. |
| 644 * |
644 * |
| 645 * When @p sfunc returned zero and the found node has a parent, the new |
645 * When @p sfunc returns zero and the found node has a parent, the new |
| 646 * node will be added as sibling - otherwise, the new node will be added |
646 * node will be added as a sibling - otherwise, the new node will be added |
| 647 * as a child. |
647 * as a child. |
| 648 * |
648 * |
| 649 * When @p sfunc returned a negative value, the new node will not be added to |
649 * When @p sfunc returns a negative value, the new node will not be added to |
| 650 * the tree and this function returns a non-zero value. |
650 * the tree, and this function returns a non-zero value. |
| 651 * The caller should check if @p cnode contains a node pointer and deal with the |
651 * The caller should check if @p cnode contains a node pointer and deal with the |
| 652 * node that could not be added. |
652 * node that could not be added. |
| 653 * |
653 * |
| 654 * This function also returns a non-zero value when @p cfunc tries to allocate |
654 * This function also returns a non-zero value when @p cfunc tries to allocate |
| 655 * a new node but fails to do so. In that case, the pointer stored to @p cnode |
655 * a new node but fails to do so. In that case, the pointer stored to @p cnode |
| 856 ); |
856 ); |
| 857 |
857 |
| 858 /** |
858 /** |
| 859 * Member function for inserting multiple elements. |
859 * Member function for inserting multiple elements. |
| 860 * |
860 * |
| 861 * Implementations SHALL avoid to perform a full search in the tree for |
861 * Implementations SHALL avoid performing a full search in the tree for |
| 862 * every element even though the source data MAY be unsorted. |
862 * every element even though the source data MAY be unsorted. |
| 863 */ |
863 */ |
| 864 size_t (*insert_many)( |
864 size_t (*insert_many)( |
| 865 struct cx_tree_s *tree, |
865 struct cx_tree_s *tree, |
| 866 struct cx_iterator_base_s *iter, |
866 struct cx_iterator_base_s *iter, |
| 919 * This is a convenience macro for invoking #cxTreeDestroySubtree() on the |
919 * This is a convenience macro for invoking #cxTreeDestroySubtree() on the |
| 920 * root node of the tree. |
920 * root node of the tree. |
| 921 * |
921 * |
| 922 * @attention Be careful when calling this function when no destructor function |
922 * @attention Be careful when calling this function when no destructor function |
| 923 * is registered that actually frees the memory of nodes. In that case you will |
923 * is registered that actually frees the memory of nodes. In that case you will |
| 924 * need a reference to the (former) root node of the tree somewhere or |
924 * need a reference to the (former) root node of the tree somewhere, or |
| 925 * otherwise you will be leaking memory. |
925 * otherwise you will be leaking memory. |
| 926 * |
926 * |
| 927 * @param tree the tree |
927 * @param tree the tree |
| 928 * @see cxTreeDestroySubtree() |
928 * @see cxTreeDestroySubtree() |
| 929 */ |
929 */ |
| 990 ); |
990 ); |
| 991 |
991 |
| 992 /** |
992 /** |
| 993 * Creates a new tree structure based on a default layout. |
993 * Creates a new tree structure based on a default layout. |
| 994 * |
994 * |
| 995 * Nodes created by @p create_func MUST contain #cx_tree_node_base_s as first |
995 * Nodes created by @p create_func MUST contain #cx_tree_node_base_s as the first |
| 996 * member (or at least respect the default offsets specified in the tree |
996 * member (or at least respect the default offsets specified in the tree |
| 997 * struct) and they MUST be allocated with the specified allocator. |
997 * struct), and they MUST be allocated with the specified allocator. |
| 998 * |
998 * |
| 999 * @note This function will also register an advanced destructor which |
999 * @note This function will also register an advanced destructor which |
| 1000 * will free the nodes with the allocator's free() method. |
1000 * will free the nodes with the allocator's free() method. |
| 1001 * |
1001 * |
| 1002 * @param allocator (@c CxAllocator*) the allocator that shall be used |
1002 * @param allocator (@c CxAllocator*) the allocator that shall be used |
| 1017 * The specified @p allocator will be used for creating the tree struct. |
1017 * The specified @p allocator will be used for creating the tree struct. |
| 1018 * |
1018 * |
| 1019 * @attention This function will create an incompletely defined tree structure |
1019 * @attention This function will create an incompletely defined tree structure |
| 1020 * where neither the create function, the search function, nor a destructor |
1020 * where neither the create function, the search function, nor a destructor |
| 1021 * will be set. If you wish to use any of this functionality for the wrapped |
1021 * will be set. If you wish to use any of this functionality for the wrapped |
| 1022 * tree, you need to specify those functions afterwards. |
1022 * tree, you need to specify those functions afterward. |
| 1023 * |
1023 * |
| 1024 * @param allocator the allocator that was used for nodes of the wrapped tree |
1024 * @param allocator the allocator that was used for nodes of the wrapped tree |
| 1025 * (if @c NULL, the cxDefaultAllocator is assumed) |
1025 * (if @c NULL, the cxDefaultAllocator is assumed) |
| 1026 * @param root the root node of the tree that shall be wrapped |
1026 * @param root the root node of the tree that shall be wrapped |
| 1027 * @param loc_parent offset in the node struct for the parent pointer |
1027 * @param loc_parent offset in the node struct for the parent pointer |
| 1306 ); |
1306 ); |
| 1307 |
1307 |
| 1308 /** |
1308 /** |
| 1309 * Adds a new node to the tree. |
1309 * Adds a new node to the tree. |
| 1310 * |
1310 * |
| 1311 * If the @p child is already member of the tree, the behavior is undefined. |
1311 * If the @p child is already a member of the tree, the behavior is undefined. |
| 1312 * Use #cxTreeSetParent() if you want to move a subtree to another location. |
1312 * Use #cxTreeSetParent() if you want to move a subtree to another location. |
| 1313 * |
1313 * |
| 1314 * @attention The node may be externally created, but MUST obey the same rules |
1314 * @attention The node may be externally created, but MUST obey the same rules |
| 1315 * as if it was created by the tree itself with #cxTreeAddChild() (e.g. use |
1315 * as if it was created by the tree itself with #cxTreeAddChild() (e.g., use |
| 1316 * the same allocator). |
1316 * the same allocator). |
| 1317 * |
1317 * |
| 1318 * @param tree the tree |
1318 * @param tree the tree |
| 1319 * @param parent the parent of the node to add |
1319 * @param parent the parent of the node to add |
| 1320 * @param child the node to add |
1320 * @param child the node to add |
| 1334 * With this function you can decide where exactly the new node shall be added. |
1334 * With this function you can decide where exactly the new node shall be added. |
| 1335 * If you specified an appropriate search function, you may want to consider |
1335 * If you specified an appropriate search function, you may want to consider |
| 1336 * leaving this task to the tree by using #cxTreeInsert(). |
1336 * leaving this task to the tree by using #cxTreeInsert(). |
| 1337 * |
1337 * |
| 1338 * Be aware that adding nodes at arbitrary locations in the tree might cause |
1338 * Be aware that adding nodes at arbitrary locations in the tree might cause |
| 1339 * wrong or undesired results when subsequently invoking #cxTreeInsert() and |
1339 * wrong or undesired results when subsequently invoking #cxTreeInsert(), and |
| 1340 * the invariant imposed by the search function does not hold any longer. |
1340 * the invariant imposed by the search function does not hold any longer. |
| 1341 * |
1341 * |
| 1342 * @param tree the tree |
1342 * @param tree the tree |
| 1343 * @param parent the parent node of the new node |
1343 * @param parent the parent node of the new node |
| 1344 * @param data the data that will be submitted to the create function |
1344 * @param data the data that will be submitted to the create function |
| 1393 void *node, |
1393 void *node, |
| 1394 cx_tree_relink_func relink_func |
1394 cx_tree_relink_func relink_func |
| 1395 ); |
1395 ); |
| 1396 |
1396 |
| 1397 /** |
1397 /** |
| 1398 * Removes a node and it's subtree from the tree. |
1398 * Removes a node and its subtree from the tree. |
| 1399 * |
1399 * |
| 1400 * If the node is not part of the tree, the behavior is undefined. |
1400 * If the node is not part of the tree, the behavior is undefined. |
| 1401 * |
1401 * |
| 1402 * @note The destructor function, if any, will @em not be invoked. That means |
1402 * @note The destructor function, if any, will @em not be invoked. That means |
| 1403 * you will need to free the removed subtree by yourself, eventually. |
1403 * you will need to free the removed subtree by yourself, eventually. |