# HG changeset patch # User Mike Becker # Date 1723886079 -7200 # Node ID 4a220afebad0e8bfb6841c1abe986887b0443f3d # Parent 558ed4c6abd0860e5b58f4da972d4cabec0a513e# Parent 387414a7afd84ba2b4bdf4497c80e6a1e1e882b4 merge changes from default branch diff -r 387414a7afd8 -r 4a220afebad0 src/cx/tree.h --- a/src/cx/tree.h Sun Jul 07 14:56:44 2024 +0200 +++ b/src/cx/tree.h Sat Aug 17 11:14:39 2024 +0200 @@ -410,6 +410,49 @@ ptrdiff_t loc_next ); +/** + * Describes a function that creates a tree node from the specified data. + */ +typedef void (*cx_tree_node_create_fun)(void const*); + +__attribute__((__nonnull__)) +size_t cx_tree_add_iter( + struct cx_iterator_base_s *iter, + cx_tree_search_func sfunc, + cx_tree_node_create_fun cfunc, + void **root, + ptrdiff_t loc_parent, + ptrdiff_t loc_children, + ptrdiff_t loc_prev, + ptrdiff_t loc_next +); + +__attribute__((__nonnull__)) +size_t cx_tree_add_array( + void const *src, + size_t num, + size_t elem_size, + cx_tree_search_func sfunc, + cx_tree_node_create_fun cfunc, + void **root, + ptrdiff_t loc_parent, + ptrdiff_t loc_children, + ptrdiff_t loc_prev, + ptrdiff_t loc_next +); + +__attribute__((__nonnull__)) +void *cx_tree_add( + void const *src, + cx_tree_search_func sfunc, + cx_tree_node_create_fun cfunc, + void **root, + ptrdiff_t loc_parent, + ptrdiff_t loc_children, + ptrdiff_t loc_prev, + ptrdiff_t loc_next +); + #ifdef __cplusplus } // extern "C" #endif diff -r 387414a7afd8 -r 4a220afebad0 src/tree.c --- a/src/tree.c Sun Jul 07 14:56:44 2024 +0200 +++ b/src/tree.c Sat Aug 17 11:14:39 2024 +0200 @@ -426,3 +426,65 @@ return iter; } +void *cx_tree_add( + void const *src, + cx_tree_search_func sfunc, + cx_tree_node_create_fun cfunc, + void **root, + ptrdiff_t loc_parent, + ptrdiff_t loc_children, + ptrdiff_t loc_prev, + ptrdiff_t loc_next +) { + // TODO: implement + return NULL; +} + +size_t cx_tree_add_iter( + struct cx_iterator_base_s *iter, + cx_tree_search_func sfunc, + cx_tree_node_create_fun cfunc, + void **root, + ptrdiff_t loc_parent, + ptrdiff_t loc_children, + ptrdiff_t loc_prev, + ptrdiff_t loc_next +) { + // TODO: implement + return 0; +} + +size_t cx_tree_add_array( + void const *src, + size_t num, + size_t elem_size, + cx_tree_search_func sfunc, + cx_tree_node_create_fun cfunc, + void **root, + ptrdiff_t loc_parent, + ptrdiff_t loc_children, + ptrdiff_t loc_prev, + ptrdiff_t loc_next +) { + // super special case: zero elements + if (num == 0) { + return 0; + } + + // special case: one element does not need an iterator + if (num == 1) { + if (NULL != cx_tree_add( + src, sfunc, cfunc, root, + loc_parent, loc_children, loc_prev, loc_next)) { + return 1; + } else { + return 0; + } + } + + // otherwise, create iterator and hand over to other function + CxIterator iter = cxIterator(src, elem_size, num); + return cx_tree_add_iter(cxIteratorRef(iter), sfunc, cfunc, root, + loc_parent, loc_children, loc_prev, loc_next); +} +