397 iter.base.current = cx_tree_visitor_current; |
397 iter.base.current = cx_tree_visitor_current; |
398 |
398 |
399 return iter; |
399 return iter; |
400 } |
400 } |
401 |
401 |
|
402 void *cx_tree_add( |
|
403 void const *src, |
|
404 cx_tree_search_func sfunc, |
|
405 cx_tree_node_create_fun cfunc, |
|
406 void **root, |
|
407 ptrdiff_t loc_parent, |
|
408 ptrdiff_t loc_children, |
|
409 ptrdiff_t loc_prev, |
|
410 ptrdiff_t loc_next |
|
411 ) { |
|
412 // TODO: implement |
|
413 return NULL; |
|
414 } |
|
415 |
|
416 size_t cx_tree_add_iter( |
|
417 struct cx_iterator_base_s *iter, |
|
418 cx_tree_search_func sfunc, |
|
419 cx_tree_node_create_fun cfunc, |
|
420 void **root, |
|
421 ptrdiff_t loc_parent, |
|
422 ptrdiff_t loc_children, |
|
423 ptrdiff_t loc_prev, |
|
424 ptrdiff_t loc_next |
|
425 ) { |
|
426 // TODO: implement |
|
427 return 0; |
|
428 } |
|
429 |
|
430 size_t cx_tree_add_array( |
|
431 void const *src, |
|
432 size_t num, |
|
433 size_t elem_size, |
|
434 cx_tree_search_func sfunc, |
|
435 cx_tree_node_create_fun cfunc, |
|
436 void **root, |
|
437 ptrdiff_t loc_parent, |
|
438 ptrdiff_t loc_children, |
|
439 ptrdiff_t loc_prev, |
|
440 ptrdiff_t loc_next |
|
441 ) { |
|
442 // super special case: zero elements |
|
443 if (num == 0) { |
|
444 return 0; |
|
445 } |
|
446 |
|
447 // special case: one element does not need an iterator |
|
448 if (num == 1) { |
|
449 if (NULL != cx_tree_add( |
|
450 src, sfunc, cfunc, root, |
|
451 loc_parent, loc_children, loc_prev, loc_next)) { |
|
452 return 1; |
|
453 } else { |
|
454 return 0; |
|
455 } |
|
456 } |
|
457 |
|
458 // otherwise, create iterator and hand over to other function |
|
459 CxIterator iter = cxIterator(src, elem_size, num); |
|
460 return cx_tree_add_iter(cxIteratorRef(iter), sfunc, cfunc, root, |
|
461 loc_parent, loc_children, loc_prev, loc_next); |
|
462 } |
|
463 |