427 } |
427 } |
428 |
428 |
429 void *cx_tree_add( |
429 void *cx_tree_add( |
430 void const *src, |
430 void const *src, |
431 cx_tree_search_func sfunc, |
431 cx_tree_search_func sfunc, |
432 cx_tree_node_create_fun cfunc, |
432 cx_tree_node_create_func cfunc, |
|
433 void *cdata, |
433 void **root, |
434 void **root, |
434 ptrdiff_t loc_parent, |
435 ptrdiff_t loc_parent, |
435 ptrdiff_t loc_children, |
436 ptrdiff_t loc_children, |
|
437 ptrdiff_t loc_last_child, |
436 ptrdiff_t loc_prev, |
438 ptrdiff_t loc_prev, |
437 ptrdiff_t loc_next |
439 ptrdiff_t loc_next |
438 ) { |
440 ) { |
439 // TODO: implement |
441 // TODO: implement |
440 return NULL; |
442 return NULL; |
441 } |
443 } |
|
444 |
|
445 unsigned int cx_tree_add_look_around_depth = 3; |
442 |
446 |
443 size_t cx_tree_add_iter( |
447 size_t cx_tree_add_iter( |
444 struct cx_iterator_base_s *iter, |
448 struct cx_iterator_base_s *iter, |
445 cx_tree_search_func sfunc, |
449 cx_tree_search_func sfunc, |
446 cx_tree_node_create_fun cfunc, |
450 cx_tree_node_create_func cfunc, |
|
451 void *cdata, |
447 void **root, |
452 void **root, |
448 ptrdiff_t loc_parent, |
453 ptrdiff_t loc_parent, |
449 ptrdiff_t loc_children, |
454 ptrdiff_t loc_children, |
|
455 ptrdiff_t loc_last_child, |
450 ptrdiff_t loc_prev, |
456 ptrdiff_t loc_prev, |
451 ptrdiff_t loc_next |
457 ptrdiff_t loc_next |
452 ) { |
458 ) { |
453 // TODO: implement |
459 // TODO: implement |
454 return 0; |
460 return 0; |
457 size_t cx_tree_add_array( |
463 size_t cx_tree_add_array( |
458 void const *src, |
464 void const *src, |
459 size_t num, |
465 size_t num, |
460 size_t elem_size, |
466 size_t elem_size, |
461 cx_tree_search_func sfunc, |
467 cx_tree_search_func sfunc, |
462 cx_tree_node_create_fun cfunc, |
468 cx_tree_node_create_func cfunc, |
|
469 void *cdata, |
463 void **root, |
470 void **root, |
464 ptrdiff_t loc_parent, |
471 ptrdiff_t loc_parent, |
465 ptrdiff_t loc_children, |
472 ptrdiff_t loc_children, |
|
473 ptrdiff_t loc_last_child, |
466 ptrdiff_t loc_prev, |
474 ptrdiff_t loc_prev, |
467 ptrdiff_t loc_next |
475 ptrdiff_t loc_next |
468 ) { |
476 ) { |
469 // super special case: zero elements |
477 // super special case: zero elements |
470 if (num == 0) { |
478 if (num == 0) { |
472 } |
480 } |
473 |
481 |
474 // special case: one element does not need an iterator |
482 // special case: one element does not need an iterator |
475 if (num == 1) { |
483 if (num == 1) { |
476 if (NULL != cx_tree_add( |
484 if (NULL != cx_tree_add( |
477 src, sfunc, cfunc, root, |
485 src, sfunc, cfunc, cdata, root, |
478 loc_parent, loc_children, loc_prev, loc_next)) { |
486 loc_parent, loc_children, loc_last_child, |
|
487 loc_prev, loc_next)) { |
479 return 1; |
488 return 1; |
480 } else { |
489 } else { |
481 return 0; |
490 return 0; |
482 } |
491 } |
483 } |
492 } |
484 |
493 |
485 // otherwise, create iterator and hand over to other function |
494 // otherwise, create iterator and hand over to other function |
486 CxIterator iter = cxIterator(src, elem_size, num); |
495 CxIterator iter = cxIterator(src, elem_size, num); |
487 return cx_tree_add_iter(cxIteratorRef(iter), sfunc, cfunc, root, |
496 return cx_tree_add_iter(cxIteratorRef(iter), sfunc, cfunc, cdata, root, |
488 loc_parent, loc_children, loc_prev, loc_next); |
497 loc_parent, loc_children, loc_last_child, |
489 } |
498 loc_prev, loc_next); |
490 |
499 } |
|
500 |