src/tree.c

branch
feature/tree_add
changeset 868
56a908924510
parent 867
471c714d5b6f
child 869
9e7f0db6a725
equal deleted inserted replaced
867:471c714d5b6f 868:56a908924510
529 ptrdiff_t loc_children, 529 ptrdiff_t loc_children,
530 ptrdiff_t loc_last_child, 530 ptrdiff_t loc_last_child,
531 ptrdiff_t loc_prev, 531 ptrdiff_t loc_prev,
532 ptrdiff_t loc_next 532 ptrdiff_t loc_next
533 ) { 533 ) {
534 // iter not valid? cancel...
535 if (!iter->valid(iter)) return 0;
536
534 size_t processed = 0; 537 size_t processed = 0;
535 void *current_node = *root; 538 void *current_node = *root;
539 void *elem;
540
541 // if there is no root, yet - process the first node from the iter
542 // as the new root node
543 if (current_node == NULL) {
544 elem = *(void **) (iter->current(iter));
545 // no node in tree, yet - add a new one
546 current_node = cfunc(elem, NULL, cdata);
547 // node creation failed - stop processing
548 if (current_node == NULL) return 0;
549 cx_tree_zero_pointers(current_node, cx_tree_ptr_locations);
550 *root = current_node;
551 processed++;
552 iter->next(iter);
553 }
554
536 for (void **eptr; 555 for (void **eptr;
537 iter->valid(iter) && (eptr = iter->current(iter)) != NULL; 556 iter->valid(iter) && (eptr = iter->current(iter)) != NULL;
538 iter->next(iter)) { 557 iter->next(iter)) {
539 void *elem = *eptr; 558 elem = *eptr;
540
541 if (current_node == NULL) {
542 // no node in tree, yet - add a new one
543 current_node = cfunc(elem, NULL, cdata);
544 // node creation failed - stop processing
545 if (current_node == NULL) {
546 // but honestly... nothing should have been processed
547 assert(processed == 0);
548 return 0;
549 }
550 cx_tree_zero_pointers(current_node, cx_tree_ptr_locations);
551 *root = current_node;
552 processed++;
553 continue;
554 }
555 559
556 // start searching from current node 560 // start searching from current node
557 void *match; 561 void *match;
558 int result; 562 int result;
559 unsigned int look_around_retries = cx_tree_add_look_around_depth; 563 unsigned int look_around_retries = cx_tree_add_look_around_depth;

mercurial