diff options
| author | Po Lu | 2022-10-29 08:47:16 +0800 |
|---|---|---|
| committer | Po Lu | 2022-10-29 08:47:16 +0800 |
| commit | 7ca456da7f72feeeec571ece3c373e2b3a3d327b (patch) | |
| tree | d767d8a50694441012dff3b85c7876f29f6d7466 /src | |
| parent | 8562a23fc6a382367351a1471d8585279d12605a (diff) | |
| download | emacs-7ca456da7f72feeeec571ece3c373e2b3a3d327b.tar.gz emacs-7ca456da7f72feeeec571ece3c373e2b3a3d327b.zip | |
Fix coding style of latest feature branch merge
* src/itree.c (interval_stack_ensure_space)
(interval_stack_push_flagged, struct itree_iterator)
(struct check_subtree_result, check_subtree, check_tree)
(itree_newlimit, interval_tree_inherit_offset)
(interval_tree_propagate_limit, itree_node_init, itree_node_begin)
(itree_node_end, itree_create, interval_tree_rotate_left)
(interval_tree_rotate_right, interval_tree_insert_fix)
(interval_tree_insert, itree_insert, itree_node_set_region)
(interval_tree_contains, interval_tree_subtree_min)
(interval_tree_remove_fix, interval_tree_replace_child)
(interval_tree_transplant, itree_remove, itree_iterator_start)
(itree_insert_gap, itree_delete_gap, interval_node_intersects)
(itree_iterator_next, itree_iterator_narrow): Tabify. Fix
comment and code coding style.
Diffstat (limited to 'src')
| -rw-r--r-- | src/itree.c | 411 |
1 files changed, 211 insertions, 200 deletions
diff --git a/src/itree.c b/src/itree.c index e824f2c8914..18eb390e352 100644 --- a/src/itree.c +++ b/src/itree.c | |||
| @@ -125,8 +125,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 125 | remember the fact, that a node's path to the root has no offsets | 125 | remember the fact, that a node's path to the root has no offsets |
| 126 | applied (i.e. its values are up to date). This is the case if some | 126 | applied (i.e. its values are up to date). This is the case if some |
| 127 | node's value differs from the tree's one, the later of which is | 127 | node's value differs from the tree's one, the later of which is |
| 128 | incremented whenever some node's offset has changed. | 128 | incremented whenever some node's offset has changed. */ |
| 129 | */ | ||
| 130 | 129 | ||
| 131 | /* +=======================================================================+ | 130 | /* +=======================================================================+ |
| 132 | * | Stack | 131 | * | Stack |
| @@ -198,7 +197,7 @@ interval_stack_ensure_space (struct interval_stack *stack, intmax_t nelements) | |||
| 198 | { | 197 | { |
| 199 | stack->size = (nelements + 1) * 2; | 198 | stack->size = (nelements + 1) * 2; |
| 200 | stack->nodes = xrealloc (stack->nodes, | 199 | stack->nodes = xrealloc (stack->nodes, |
| 201 | stack->size * sizeof (*stack->nodes)); | 200 | stack->size * sizeof (*stack->nodes)); |
| 202 | } | 201 | } |
| 203 | } | 202 | } |
| 204 | 203 | ||
| @@ -206,7 +205,7 @@ interval_stack_ensure_space (struct interval_stack *stack, intmax_t nelements) | |||
| 206 | 205 | ||
| 207 | static inline void | 206 | static inline void |
| 208 | interval_stack_push_flagged (struct interval_stack *stack, | 207 | interval_stack_push_flagged (struct interval_stack *stack, |
| 209 | struct itree_node *node, bool flag) | 208 | struct itree_node *node, bool flag) |
| 210 | { | 209 | { |
| 211 | eassert (node && node != NULL); | 210 | eassert (node && node != NULL); |
| 212 | 211 | ||
| @@ -245,10 +244,12 @@ struct itree_iterator | |||
| 245 | struct interval_stack *stack; | 244 | struct interval_stack *stack; |
| 246 | ptrdiff_t begin; | 245 | ptrdiff_t begin; |
| 247 | ptrdiff_t end; | 246 | ptrdiff_t end; |
| 248 | uintmax_t otick; /* A copy of the tree's `otick`. */ | 247 | |
| 248 | /* A copy of the tree's `otick`. */ | ||
| 249 | uintmax_t otick; | ||
| 249 | enum itree_order order; | 250 | enum itree_order order; |
| 250 | bool running; | 251 | bool running; |
| 251 | const char* file; | 252 | const char file; |
| 252 | int line; | 253 | int line; |
| 253 | }; | 254 | }; |
| 254 | 255 | ||
| @@ -294,20 +295,25 @@ itree_init (void) | |||
| 294 | 295 | ||
| 295 | struct check_subtree_result | 296 | struct check_subtree_result |
| 296 | { | 297 | { |
| 297 | int size; /* Node count of the tree. */ | 298 | /* Node count of the tree. */ |
| 298 | ptrdiff_t limit; /* Limit of the tree (max END). */ | 299 | int size; |
| 299 | int black_height; /* Black height of the tree. */ | 300 | |
| 301 | /* Limit of the tree (max END). */ | ||
| 302 | ptrdiff_t limit; | ||
| 303 | |||
| 304 | /* Black height of the tree. */ | ||
| 305 | int black_height; | ||
| 300 | }; | 306 | }; |
| 301 | 307 | ||
| 302 | static struct check_subtree_result | 308 | static struct check_subtree_result |
| 303 | check_subtree (struct itree_node *node, | 309 | check_subtree (struct itree_node *node, |
| 304 | bool check_red_black_invariants, uintmax_t tree_otick, | 310 | bool check_red_black_invariants, uintmax_t tree_otick, |
| 305 | ptrdiff_t offset, ptrdiff_t min_begin, | 311 | ptrdiff_t offset, ptrdiff_t min_begin, |
| 306 | ptrdiff_t max_begin) | 312 | ptrdiff_t max_begin) |
| 307 | { | 313 | { |
| 308 | struct check_subtree_result result = { .size = 0, | 314 | struct check_subtree_result result = { .size = 0, |
| 309 | .limit = PTRDIFF_MIN, | 315 | .limit = PTRDIFF_MIN, |
| 310 | .black_height = 0 }; | 316 | .black_height = 0 }; |
| 311 | if (node == NULL) | 317 | if (node == NULL) |
| 312 | return result; | 318 | return result; |
| 313 | 319 | ||
| @@ -338,10 +344,10 @@ check_subtree (struct itree_node *node, | |||
| 338 | 344 | ||
| 339 | struct check_subtree_result left_result | 345 | struct check_subtree_result left_result |
| 340 | = check_subtree (node->left, check_red_black_invariants, | 346 | = check_subtree (node->left, check_red_black_invariants, |
| 341 | tree_otick, offset, min_begin, begin); | 347 | tree_otick, offset, min_begin, begin); |
| 342 | struct check_subtree_result right_result | 348 | struct check_subtree_result right_result |
| 343 | = check_subtree (node->right, check_red_black_invariants, | 349 | = check_subtree (node->right, check_red_black_invariants, |
| 344 | tree_otick, offset, begin, max_begin); | 350 | tree_otick, offset, begin, max_begin); |
| 345 | 351 | ||
| 346 | eassert (left_result.limit <= limit); | 352 | eassert (left_result.limit <= limit); |
| 347 | eassert (right_result.limit <= limit); | 353 | eassert (right_result.limit <= limit); |
| @@ -370,7 +376,7 @@ check_subtree (struct itree_node *node, | |||
| 370 | */ | 376 | */ |
| 371 | static bool | 377 | static bool |
| 372 | check_tree (struct itree_tree *tree, | 378 | check_tree (struct itree_tree *tree, |
| 373 | bool check_red_black_invariants) | 379 | bool check_red_black_invariants) |
| 374 | { | 380 | { |
| 375 | eassert (tree != NULL); | 381 | eassert (tree != NULL); |
| 376 | eassert (tree->size >= 0); | 382 | eassert (tree->size >= 0); |
| @@ -383,8 +389,8 @@ check_tree (struct itree_tree *tree, | |||
| 383 | struct itree_node *node = tree->root; | 389 | struct itree_node *node = tree->root; |
| 384 | struct check_subtree_result result | 390 | struct check_subtree_result result |
| 385 | = check_subtree (node, check_red_black_invariants, tree->otick, | 391 | = check_subtree (node, check_red_black_invariants, tree->otick, |
| 386 | node->offset, PTRDIFF_MIN, | 392 | node->offset, PTRDIFF_MIN, |
| 387 | PTRDIFF_MAX); | 393 | PTRDIFF_MAX); |
| 388 | eassert (result.size == tree->size); | 394 | eassert (result.size == tree->size); |
| 389 | 395 | ||
| 390 | /* The only way this function fails is eassert(). */ | 396 | /* The only way this function fails is eassert(). */ |
| @@ -412,12 +418,12 @@ itree_newlimit (struct itree_node *node) | |||
| 412 | { | 418 | { |
| 413 | eassert (node != NULL); | 419 | eassert (node != NULL); |
| 414 | return max (node->end, | 420 | return max (node->end, |
| 415 | max (node->left == NULL | 421 | max (node->left == NULL |
| 416 | ? PTRDIFF_MIN | 422 | ? PTRDIFF_MIN |
| 417 | : node->left->limit + node->left->offset, | 423 | : node->left->limit + node->left->offset, |
| 418 | node->right == NULL | 424 | node->right == NULL |
| 419 | ? PTRDIFF_MIN | 425 | ? PTRDIFF_MIN |
| 420 | : node->right->limit + node->right->offset)); | 426 | : node->right->limit + node->right->offset)); |
| 421 | } | 427 | } |
| 422 | 428 | ||
| 423 | /* Update NODE's limit attribute according to its children. */ | 429 | /* Update NODE's limit attribute according to its children. */ |
| @@ -459,9 +465,9 @@ interval_tree_inherit_offset (uintmax_t otick, struct itree_node *node) | |||
| 459 | node->end += node->offset; | 465 | node->end += node->offset; |
| 460 | node->limit += node->offset; | 466 | node->limit += node->offset; |
| 461 | if (node->left != NULL) | 467 | if (node->left != NULL) |
| 462 | node->left->offset += node->offset; | 468 | node->left->offset += node->offset; |
| 463 | if (node->right != NULL) | 469 | if (node->right != NULL) |
| 464 | node->right->offset += node->offset; | 470 | node->right->offset += node->offset; |
| 465 | node->offset = 0; | 471 | node->offset = 0; |
| 466 | } | 472 | } |
| 467 | /* The only thing that matters about `otick` is whether it's equal to | 473 | /* The only thing that matters about `otick` is whether it's equal to |
| @@ -477,18 +483,22 @@ interval_tree_inherit_offset (uintmax_t otick, struct itree_node *node) | |||
| 477 | static void | 483 | static void |
| 478 | interval_tree_propagate_limit (struct itree_node *node) | 484 | interval_tree_propagate_limit (struct itree_node *node) |
| 479 | { | 485 | { |
| 486 | ptrdiff_t newlimit; | ||
| 487 | |||
| 480 | if (node == NULL) | 488 | if (node == NULL) |
| 481 | return; | 489 | return; |
| 482 | 490 | ||
| 483 | while (1) { | 491 | while (1) |
| 484 | ptrdiff_t newlimit = itree_newlimit (node); | 492 | { |
| 485 | if (newlimit == node->limit) | 493 | newlimit = itree_newlimit (node); |
| 486 | break; | 494 | |
| 487 | node->limit = newlimit; | 495 | if (newlimit == node->limit) |
| 488 | if (node->parent == NULL) | 496 | break; |
| 489 | break; | 497 | node->limit = newlimit; |
| 490 | node = node->parent; | 498 | if (node->parent == NULL) |
| 491 | } | 499 | break; |
| 500 | node = node->parent; | ||
| 501 | } | ||
| 492 | } | 502 | } |
| 493 | 503 | ||
| 494 | static struct itree_node* | 504 | static struct itree_node* |
| @@ -512,8 +522,8 @@ interval_tree_validate (struct itree_tree *tree, struct itree_node *node) | |||
| 512 | 522 | ||
| 513 | void | 523 | void |
| 514 | itree_node_init (struct itree_node *node, | 524 | itree_node_init (struct itree_node *node, |
| 515 | bool front_advance, bool rear_advance, | 525 | bool front_advance, bool rear_advance, |
| 516 | Lisp_Object data) | 526 | Lisp_Object data) |
| 517 | { | 527 | { |
| 518 | node->parent = NULL; | 528 | node->parent = NULL; |
| 519 | node->left = NULL; | 529 | node->left = NULL; |
| @@ -529,7 +539,7 @@ itree_node_init (struct itree_node *node, | |||
| 529 | 539 | ||
| 530 | ptrdiff_t | 540 | ptrdiff_t |
| 531 | itree_node_begin (struct itree_tree *tree, | 541 | itree_node_begin (struct itree_tree *tree, |
| 532 | struct itree_node *node) | 542 | struct itree_node *node) |
| 533 | { | 543 | { |
| 534 | interval_tree_validate (tree, node); | 544 | interval_tree_validate (tree, node); |
| 535 | return node->begin; | 545 | return node->begin; |
| @@ -539,7 +549,7 @@ itree_node_begin (struct itree_tree *tree, | |||
| 539 | 549 | ||
| 540 | ptrdiff_t | 550 | ptrdiff_t |
| 541 | itree_node_end (struct itree_tree *tree, | 551 | itree_node_end (struct itree_tree *tree, |
| 542 | struct itree_node *node) | 552 | struct itree_node *node) |
| 543 | { | 553 | { |
| 544 | interval_tree_validate (tree, node); | 554 | interval_tree_validate (tree, node); |
| 545 | return node->end; | 555 | return node->end; |
| @@ -547,7 +557,7 @@ itree_node_end (struct itree_tree *tree, | |||
| 547 | 557 | ||
| 548 | /* Allocate an interval_tree. Free with interval_tree_destroy. */ | 558 | /* Allocate an interval_tree. Free with interval_tree_destroy. */ |
| 549 | 559 | ||
| 550 | struct itree_tree* | 560 | struct itree_tree * |
| 551 | itree_create (void) | 561 | itree_create (void) |
| 552 | { | 562 | { |
| 553 | /* FIXME? Maybe avoid the initialization of itree_null in the same | 563 | /* FIXME? Maybe avoid the initialization of itree_null in the same |
| @@ -603,7 +613,7 @@ itree_size (struct itree_tree *tree) | |||
| 603 | 613 | ||
| 604 | static void | 614 | static void |
| 605 | interval_tree_rotate_left (struct itree_tree *tree, | 615 | interval_tree_rotate_left (struct itree_tree *tree, |
| 606 | struct itree_node *node) | 616 | struct itree_node *node) |
| 607 | { | 617 | { |
| 608 | eassert (node->right != NULL); | 618 | eassert (node->right != NULL); |
| 609 | 619 | ||
| @@ -646,7 +656,7 @@ interval_tree_rotate_left (struct itree_tree *tree, | |||
| 646 | 656 | ||
| 647 | static void | 657 | static void |
| 648 | interval_tree_rotate_right (struct itree_tree *tree, | 658 | interval_tree_rotate_right (struct itree_tree *tree, |
| 649 | struct itree_node *node) | 659 | struct itree_node *node) |
| 650 | { | 660 | { |
| 651 | eassert (tree && node && node->left != NULL); | 661 | eassert (tree && node && node->left != NULL); |
| 652 | 662 | ||
| @@ -685,7 +695,7 @@ interval_tree_rotate_right (struct itree_tree *tree, | |||
| 685 | 695 | ||
| 686 | static void | 696 | static void |
| 687 | interval_tree_insert_fix (struct itree_tree *tree, | 697 | interval_tree_insert_fix (struct itree_tree *tree, |
| 688 | struct itree_node *node) | 698 | struct itree_node *node) |
| 689 | { | 699 | { |
| 690 | eassert (tree->root->red == false); | 700 | eassert (tree->root->red == false); |
| 691 | 701 | ||
| @@ -701,7 +711,7 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 701 | our "uncle". */ | 711 | our "uncle". */ |
| 702 | struct itree_node *uncle = node->parent->parent->right; | 712 | struct itree_node *uncle = node->parent->parent->right; |
| 703 | 713 | ||
| 704 | if (null_safe_is_red (uncle)) /* case 1.a */ | 714 | if (null_safe_is_red (uncle)) /* case 1.a */ |
| 705 | { | 715 | { |
| 706 | /* Uncle and parent are red but should be black because | 716 | /* Uncle and parent are red but should be black because |
| 707 | NODE is red. Change the colors accordingly and | 717 | NODE is red. Change the colors accordingly and |
| @@ -710,7 +720,7 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 710 | uncle->red = false; | 720 | uncle->red = false; |
| 711 | node->parent->parent->red = true; | 721 | node->parent->parent->red = true; |
| 712 | node = node->parent->parent; | 722 | node = node->parent->parent; |
| 713 | } | 723 | } |
| 714 | else | 724 | else |
| 715 | { | 725 | { |
| 716 | /* Parent and uncle have different colors; parent is | 726 | /* Parent and uncle have different colors; parent is |
| @@ -719,25 +729,25 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 719 | { | 729 | { |
| 720 | node = node->parent; | 730 | node = node->parent; |
| 721 | interval_tree_rotate_left (tree, node); | 731 | interval_tree_rotate_left (tree, node); |
| 722 | } | 732 | } |
| 723 | /* case 3.a */ | 733 | /* case 3.a */ |
| 724 | node->parent->red = false; | 734 | node->parent->red = false; |
| 725 | node->parent->parent->red = true; | 735 | node->parent->parent->red = true; |
| 726 | interval_tree_rotate_right (tree, node->parent->parent); | 736 | interval_tree_rotate_right (tree, node->parent->parent); |
| 727 | } | 737 | } |
| 728 | } | 738 | } |
| 729 | else | 739 | else |
| 730 | { | 740 | { |
| 731 | /* This is the symmetrical case of above. */ | 741 | /* This is the symmetrical case of above. */ |
| 732 | struct itree_node *uncle = node->parent->parent->left; | 742 | struct itree_node *uncle = node->parent->parent->left; |
| 733 | 743 | ||
| 734 | if (null_safe_is_red (uncle)) /* case 1.b */ | 744 | if (null_safe_is_red (uncle)) /* case 1.b */ |
| 735 | { | 745 | { |
| 736 | node->parent->red = false; | 746 | node->parent->red = false; |
| 737 | uncle->red = false; | 747 | uncle->red = false; |
| 738 | node->parent->parent->red = true; | 748 | node->parent->parent->red = true; |
| 739 | node = node->parent->parent; | 749 | node = node->parent->parent; |
| 740 | } | 750 | } |
| 741 | else | 751 | else |
| 742 | { | 752 | { |
| 743 | if (node == node->parent->left) /* case 2.b */ | 753 | if (node == node->parent->left) /* case 2.b */ |
| @@ -745,12 +755,12 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 745 | node = node->parent; | 755 | node = node->parent; |
| 746 | interval_tree_rotate_right (tree, node); | 756 | interval_tree_rotate_right (tree, node); |
| 747 | } | 757 | } |
| 748 | /* case 3.b */ | 758 | /* case 3.b */ |
| 749 | node->parent->red = false; | 759 | node->parent->red = false; |
| 750 | node->parent->parent->red = true; | 760 | node->parent->parent->red = true; |
| 751 | interval_tree_rotate_left (tree, node->parent->parent); | 761 | interval_tree_rotate_left (tree, node->parent->parent); |
| 752 | } | 762 | } |
| 753 | } | 763 | } |
| 754 | } | 764 | } |
| 755 | 765 | ||
| 756 | /* The root may have been changed to red due to the algorithm. | 766 | /* The root may have been changed to red due to the algorithm. |
| @@ -769,7 +779,7 @@ interval_tree_insert (struct itree_tree *tree, struct itree_node *node) | |||
| 769 | /* FIXME: The assertion below fails because `delete_all_overlays` | 779 | /* FIXME: The assertion below fails because `delete_all_overlays` |
| 770 | doesn't set left/right/parent to NULL. */ | 780 | doesn't set left/right/parent to NULL. */ |
| 771 | /* eassert (node->left == NULL && node->right == NULL | 781 | /* eassert (node->left == NULL && node->right == NULL |
| 772 | && node->parent == NULL) */; | 782 | && node->parent == NULL) */; |
| 773 | eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ | 783 | eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ |
| 774 | 784 | ||
| 775 | struct itree_node *parent = NULL; | 785 | struct itree_node *parent = NULL; |
| @@ -788,7 +798,7 @@ interval_tree_insert (struct itree_tree *tree, struct itree_node *node) | |||
| 788 | eassert (child->offset == 0); | 798 | eassert (child->offset == 0); |
| 789 | child->limit = max (child->limit, node->end); | 799 | child->limit = max (child->limit, node->end); |
| 790 | /* This suggests that nodes in the right subtree are strictly | 800 | /* This suggests that nodes in the right subtree are strictly |
| 791 | greater. But this is not true due to later rotations. */ | 801 | greater. But this is not true due to later rotations. */ |
| 792 | child = node->begin <= child->begin ? child->left : child->right; | 802 | child = node->begin <= child->begin ? child->left : child->right; |
| 793 | } | 803 | } |
| 794 | 804 | ||
| @@ -822,7 +832,7 @@ interval_tree_insert (struct itree_tree *tree, struct itree_node *node) | |||
| 822 | 832 | ||
| 823 | void | 833 | void |
| 824 | itree_insert (struct itree_tree *tree, struct itree_node *node, | 834 | itree_insert (struct itree_tree *tree, struct itree_node *node, |
| 825 | ptrdiff_t begin, ptrdiff_t end) | 835 | ptrdiff_t begin, ptrdiff_t end) |
| 826 | { | 836 | { |
| 827 | node->begin = begin; | 837 | node->begin = begin; |
| 828 | node->end = end; | 838 | node->end = end; |
| @@ -834,8 +844,8 @@ itree_insert (struct itree_tree *tree, struct itree_node *node, | |||
| 834 | 844 | ||
| 835 | void | 845 | void |
| 836 | itree_node_set_region (struct itree_tree *tree, | 846 | itree_node_set_region (struct itree_tree *tree, |
| 837 | struct itree_node *node, | 847 | struct itree_node *node, |
| 838 | ptrdiff_t begin, ptrdiff_t end) | 848 | ptrdiff_t begin, ptrdiff_t end) |
| 839 | { | 849 | { |
| 840 | interval_tree_validate (tree, node); | 850 | interval_tree_validate (tree, node); |
| 841 | if (begin != node->begin) | 851 | if (begin != node->begin) |
| @@ -863,8 +873,8 @@ interval_tree_contains (struct itree_tree *tree, struct itree_node *node) | |||
| 863 | ITREE_FOREACH (other, tree, node->begin, PTRDIFF_MAX, ASCENDING) | 873 | ITREE_FOREACH (other, tree, node->begin, PTRDIFF_MAX, ASCENDING) |
| 864 | if (other == node) | 874 | if (other == node) |
| 865 | { | 875 | { |
| 866 | ITREE_FOREACH_ABORT (); | 876 | ITREE_FOREACH_ABORT (); |
| 867 | return true; | 877 | return true; |
| 868 | } | 878 | } |
| 869 | 879 | ||
| 870 | return false; | 880 | return false; |
| @@ -885,7 +895,7 @@ interval_tree_subtree_min (uintmax_t otick, struct itree_node *node) | |||
| 885 | if (node == NULL) | 895 | if (node == NULL) |
| 886 | return node; | 896 | return node; |
| 887 | while ((interval_tree_inherit_offset (otick, node), | 897 | while ((interval_tree_inherit_offset (otick, node), |
| 888 | node->left != NULL)) | 898 | node->left != NULL)) |
| 889 | node = node->left; | 899 | node = node->left; |
| 890 | return node; | 900 | return node; |
| 891 | } | 901 | } |
| @@ -896,8 +906,8 @@ interval_tree_subtree_min (uintmax_t otick, struct itree_node *node) | |||
| 896 | 906 | ||
| 897 | static void | 907 | static void |
| 898 | interval_tree_remove_fix (struct itree_tree *tree, | 908 | interval_tree_remove_fix (struct itree_tree *tree, |
| 899 | struct itree_node *node, | 909 | struct itree_node *node, |
| 900 | struct itree_node *parent) | 910 | struct itree_node *parent) |
| 901 | { | 911 | { |
| 902 | if (parent == NULL) | 912 | if (parent == NULL) |
| 903 | eassert (node == tree->root); | 913 | eassert (node == tree->root); |
| @@ -912,70 +922,70 @@ interval_tree_remove_fix (struct itree_tree *tree, | |||
| 912 | { | 922 | { |
| 913 | struct itree_node *other = parent->right; | 923 | struct itree_node *other = parent->right; |
| 914 | 924 | ||
| 915 | if (null_safe_is_red (other)) /* case 1.a */ | 925 | if (null_safe_is_red (other)) /* case 1.a */ |
| 916 | { | 926 | { |
| 917 | other->red = false; | 927 | other->red = false; |
| 918 | parent->red = true; | 928 | parent->red = true; |
| 919 | interval_tree_rotate_left (tree, parent); | 929 | interval_tree_rotate_left (tree, parent); |
| 920 | other = parent->right; | 930 | other = parent->right; |
| 921 | } | 931 | } |
| 922 | eassume (other != NULL); | 932 | eassume (other != NULL); |
| 923 | 933 | ||
| 924 | if (null_safe_is_black (other->left) /* 2.a */ | 934 | if (null_safe_is_black (other->left) /* 2.a */ |
| 925 | && null_safe_is_black (other->right)) | 935 | && null_safe_is_black (other->right)) |
| 926 | { | 936 | { |
| 927 | other->red = true; | 937 | other->red = true; |
| 928 | node = parent; | 938 | node = parent; |
| 929 | eassert (node != NULL); | 939 | eassert (node != NULL); |
| 930 | parent = node->parent; | 940 | parent = node->parent; |
| 931 | } | 941 | } |
| 932 | else | 942 | else |
| 933 | { | 943 | { |
| 934 | if (null_safe_is_black (other->right)) /* 3.a */ | 944 | if (null_safe_is_black (other->right)) /* 3.a */ |
| 935 | { | 945 | { |
| 936 | other->left->red = false; | 946 | other->left->red = false; |
| 937 | other->red = true; | 947 | other->red = true; |
| 938 | interval_tree_rotate_right (tree, other); | 948 | interval_tree_rotate_right (tree, other); |
| 939 | other = parent->right; | 949 | other = parent->right; |
| 940 | } | 950 | } |
| 941 | other->red = parent->red; /* 4.a */ | 951 | other->red = parent->red; /* 4.a */ |
| 942 | parent->red = false; | 952 | parent->red = false; |
| 943 | other->right->red = false; | 953 | other->right->red = false; |
| 944 | interval_tree_rotate_left (tree, parent); | 954 | interval_tree_rotate_left (tree, parent); |
| 945 | node = tree->root; | 955 | node = tree->root; |
| 946 | parent = NULL; | 956 | parent = NULL; |
| 947 | } | 957 | } |
| 948 | } | 958 | } |
| 949 | else | 959 | else |
| 950 | { | 960 | { |
| 951 | struct itree_node *other = parent->left; | 961 | struct itree_node *other = parent->left; |
| 952 | 962 | ||
| 953 | if (null_safe_is_red (other)) /* 1.b */ | 963 | if (null_safe_is_red (other)) /* 1.b */ |
| 954 | { | 964 | { |
| 955 | other->red = false; | 965 | other->red = false; |
| 956 | parent->red = true; | 966 | parent->red = true; |
| 957 | interval_tree_rotate_right (tree, parent); | 967 | interval_tree_rotate_right (tree, parent); |
| 958 | other = parent->left; | 968 | other = parent->left; |
| 959 | } | 969 | } |
| 960 | eassume (other != NULL); | 970 | eassume (other != NULL); |
| 961 | 971 | ||
| 962 | if (null_safe_is_black (other->right) /* 2.b */ | 972 | if (null_safe_is_black (other->right) /* 2.b */ |
| 963 | && null_safe_is_black (other->left)) | 973 | && null_safe_is_black (other->left)) |
| 964 | { | 974 | { |
| 965 | other->red = true; | 975 | other->red = true; |
| 966 | node = parent; | 976 | node = parent; |
| 967 | eassert (node != NULL); | 977 | eassert (node != NULL); |
| 968 | parent = node->parent; | 978 | parent = node->parent; |
| 969 | } | 979 | } |
| 970 | else | 980 | else |
| 971 | { | 981 | { |
| 972 | if (null_safe_is_black (other->left)) /* 3.b */ | 982 | if (null_safe_is_black (other->left)) /* 3.b */ |
| 973 | { | 983 | { |
| 974 | other->right->red = false; | 984 | other->right->red = false; |
| 975 | other->red = true; | 985 | other->red = true; |
| 976 | interval_tree_rotate_left (tree, other); | 986 | interval_tree_rotate_left (tree, other); |
| 977 | other = parent->left; | 987 | other = parent->left; |
| 978 | } | 988 | } |
| 979 | 989 | ||
| 980 | other->red = parent->red; /* 4.b */ | 990 | other->red = parent->red; /* 4.b */ |
| 981 | parent->red = false; | 991 | parent->red = false; |
| @@ -983,12 +993,12 @@ interval_tree_remove_fix (struct itree_tree *tree, | |||
| 983 | interval_tree_rotate_right (tree, parent); | 993 | interval_tree_rotate_right (tree, parent); |
| 984 | node = tree->root; | 994 | node = tree->root; |
| 985 | parent = NULL; | 995 | parent = NULL; |
| 986 | } | 996 | } |
| 987 | } | 997 | } |
| 988 | } | 998 | } |
| 989 | 999 | ||
| 990 | if (node != NULL) | 1000 | if (node != NULL) |
| 991 | node->red = false; | 1001 | node->red = false; |
| 992 | } | 1002 | } |
| 993 | 1003 | ||
| 994 | /* Return accumulated offsets of NODE's parents. */ | 1004 | /* Return accumulated offsets of NODE's parents. */ |
| @@ -1014,12 +1024,12 @@ itree_total_offset (struct itree_node *node) | |||
| 1014 | Requires both nodes to be using the same effective `offset`. */ | 1024 | Requires both nodes to be using the same effective `offset`. */ |
| 1015 | static void | 1025 | static void |
| 1016 | interval_tree_replace_child (struct itree_tree *tree, | 1026 | interval_tree_replace_child (struct itree_tree *tree, |
| 1017 | struct itree_node *source, | 1027 | struct itree_node *source, |
| 1018 | struct itree_node *dest) | 1028 | struct itree_node *dest) |
| 1019 | { | 1029 | { |
| 1020 | eassert (tree && dest != NULL); | 1030 | eassert (tree && dest != NULL); |
| 1021 | eassert (source == NULL | 1031 | eassert (source == NULL |
| 1022 | || itree_total_offset (source) == itree_total_offset (dest)); | 1032 | || itree_total_offset (source) == itree_total_offset (dest)); |
| 1023 | 1033 | ||
| 1024 | if (dest == tree->root) | 1034 | if (dest == tree->root) |
| 1025 | tree->root = source; | 1035 | tree->root = source; |
| @@ -1040,8 +1050,8 @@ interval_tree_replace_child (struct itree_tree *tree, | |||
| 1040 | effective `offset`. */ | 1050 | effective `offset`. */ |
| 1041 | static void | 1051 | static void |
| 1042 | interval_tree_transplant (struct itree_tree *tree, | 1052 | interval_tree_transplant (struct itree_tree *tree, |
| 1043 | struct itree_node *source, | 1053 | struct itree_node *source, |
| 1044 | struct itree_node *dest) | 1054 | struct itree_node *dest) |
| 1045 | { | 1055 | { |
| 1046 | interval_tree_replace_child (tree, source, dest); | 1056 | interval_tree_replace_child (tree, source, dest); |
| 1047 | source->left = dest->left; | 1057 | source->left = dest->left; |
| @@ -1067,8 +1077,8 @@ itree_remove (struct itree_tree *tree, struct itree_node *node) | |||
| 1067 | interval_tree_inherit_offset (tree->otick, node); | 1077 | interval_tree_inherit_offset (tree->otick, node); |
| 1068 | struct itree_node *splice | 1078 | struct itree_node *splice |
| 1069 | = (node->left == NULL || node->right == NULL) | 1079 | = (node->left == NULL || node->right == NULL) |
| 1070 | ? node | 1080 | ? node |
| 1071 | : interval_tree_subtree_min (tree->otick, node->right); | 1081 | : interval_tree_subtree_min (tree->otick, node->right); |
| 1072 | 1082 | ||
| 1073 | /* Find `subtree`, the only child of `splice` (may be NULL). Note: | 1083 | /* Find `subtree`, the only child of `splice` (may be NULL). Note: |
| 1074 | `subtree` will not be modified other than changing its parent to | 1084 | `subtree` will not be modified other than changing its parent to |
| @@ -1101,7 +1111,7 @@ itree_remove (struct itree_tree *tree, struct itree_node *node) | |||
| 1101 | interval_tree_transplant (tree, splice, node); | 1111 | interval_tree_transplant (tree, splice, node); |
| 1102 | interval_tree_propagate_limit (subtree_parent); | 1112 | interval_tree_propagate_limit (subtree_parent); |
| 1103 | if (splice != subtree_parent) | 1113 | if (splice != subtree_parent) |
| 1104 | interval_tree_update_limit (splice); | 1114 | interval_tree_update_limit (splice); |
| 1105 | } | 1115 | } |
| 1106 | interval_tree_propagate_limit (splice->parent); | 1116 | interval_tree_propagate_limit (splice->parent); |
| 1107 | 1117 | ||
| @@ -1138,15 +1148,15 @@ itree_iterator_busy_p (void) | |||
| 1138 | 1148 | ||
| 1139 | struct itree_iterator * | 1149 | struct itree_iterator * |
| 1140 | itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin, | 1150 | itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin, |
| 1141 | ptrdiff_t end, enum itree_order order, | 1151 | ptrdiff_t end, enum itree_order order, |
| 1142 | const char *file, int line) | 1152 | const char *file, int line) |
| 1143 | { | 1153 | { |
| 1144 | /* struct itree_iterator *iter = tree->iter; */ | 1154 | /* struct itree_iterator *iter = tree->iter; */ |
| 1145 | if (iter->running) | 1155 | if (iter->running) |
| 1146 | { | 1156 | { |
| 1147 | fprintf (stderr, | 1157 | fprintf (stderr, |
| 1148 | "Detected nested iteration!\nOuter: %s:%d\nInner: %s:%d\n", | 1158 | "Detected nested iteration!\nOuter: %s:%d\nInner: %s:%d\n", |
| 1149 | iter->file, iter->line, file, line); | 1159 | iter->file, iter->line, file, line); |
| 1150 | emacs_abort (); | 1160 | emacs_abort (); |
| 1151 | } | 1161 | } |
| 1152 | iter->begin = begin; | 1162 | iter->begin = begin; |
| @@ -1160,7 +1170,7 @@ itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin, | |||
| 1160 | iter->line = line; | 1170 | iter->line = line; |
| 1161 | iter->running = true; | 1171 | iter->running = true; |
| 1162 | /* interval_stack_ensure_space (iter->stack, | 1172 | /* interval_stack_ensure_space (iter->stack, |
| 1163 | 2 * interval_tree_max_height (tree)); */ | 1173 | 2 * interval_tree_max_height (tree)); */ |
| 1164 | return iter; | 1174 | return iter; |
| 1165 | } | 1175 | } |
| 1166 | 1176 | ||
| @@ -1184,7 +1194,7 @@ itree_iterator_finish (struct itree_iterator *iter) | |||
| 1184 | 1194 | ||
| 1185 | void | 1195 | void |
| 1186 | itree_insert_gap (struct itree_tree *tree, | 1196 | itree_insert_gap (struct itree_tree *tree, |
| 1187 | ptrdiff_t pos, ptrdiff_t length) | 1197 | ptrdiff_t pos, ptrdiff_t length) |
| 1188 | { | 1198 | { |
| 1189 | if (length <= 0 || tree->root == NULL) | 1199 | if (length <= 0 || tree->root == NULL) |
| 1190 | return; | 1200 | return; |
| @@ -1199,8 +1209,8 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1199 | ITREE_FOREACH (node, tree, pos, pos + 1, PRE_ORDER) | 1209 | ITREE_FOREACH (node, tree, pos, pos + 1, PRE_ORDER) |
| 1200 | { | 1210 | { |
| 1201 | if (node->begin == pos && node->front_advance | 1211 | if (node->begin == pos && node->front_advance |
| 1202 | && (node->begin != node->end || node->rear_advance)) | 1212 | && (node->begin != node->end || node->rear_advance)) |
| 1203 | interval_stack_push (saved, node); | 1213 | interval_stack_push (saved, node); |
| 1204 | } | 1214 | } |
| 1205 | for (int i = 0; i < saved->length; ++i) | 1215 | for (int i = 0; i < saved->length; ++i) |
| 1206 | itree_remove (tree, nav_nodeptr (saved->nodes[i])); | 1216 | itree_remove (tree, nav_nodeptr (saved->nodes[i])); |
| @@ -1214,35 +1224,35 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1214 | interval_stack_push (stack, tree->root); | 1224 | interval_stack_push (stack, tree->root); |
| 1215 | nodeptr_and_flag nav; | 1225 | nodeptr_and_flag nav; |
| 1216 | while ((nav = interval_stack_pop (stack), | 1226 | while ((nav = interval_stack_pop (stack), |
| 1217 | node = nav_nodeptr (nav))) | 1227 | node = nav_nodeptr (nav))) |
| 1218 | { | 1228 | { |
| 1219 | /* Process in pre-order. */ | 1229 | /* Process in pre-order. */ |
| 1220 | interval_tree_inherit_offset (tree->otick, node); | 1230 | interval_tree_inherit_offset (tree->otick, node); |
| 1221 | if (node->right != NULL) | 1231 | if (node->right != NULL) |
| 1222 | { | 1232 | { |
| 1223 | if (node->begin > pos) | 1233 | if (node->begin > pos) |
| 1224 | { | 1234 | { |
| 1225 | /* All nodes in this subtree are shifted by length. */ | 1235 | /* All nodes in this subtree are shifted by length. */ |
| 1226 | node->right->offset += length; | 1236 | node->right->offset += length; |
| 1227 | ++tree->otick; | 1237 | ++tree->otick; |
| 1228 | } | 1238 | } |
| 1229 | else | 1239 | else |
| 1230 | interval_stack_push (stack, node->right); | 1240 | interval_stack_push (stack, node->right); |
| 1231 | } | 1241 | } |
| 1232 | if (node->left != NULL | 1242 | if (node->left != NULL |
| 1233 | && pos <= node->left->limit + node->left->offset) | 1243 | && pos <= node->left->limit + node->left->offset) |
| 1234 | interval_stack_push (stack, node->left); | 1244 | interval_stack_push (stack, node->left); |
| 1235 | 1245 | ||
| 1236 | /* node->begin == pos implies no front-advance. */ | 1246 | /* node->begin == pos implies no front-advance. */ |
| 1237 | if (node->begin > pos) | 1247 | if (node->begin > pos) |
| 1238 | node->begin += length; | 1248 | node->begin += length; |
| 1239 | if (node->end > pos || (node->end == pos && node->rear_advance)) | 1249 | if (node->end > pos || (node->end == pos && node->rear_advance)) |
| 1240 | { | 1250 | { |
| 1241 | node->end += length; | 1251 | node->end += length; |
| 1242 | eassert (node != NULL); | 1252 | eassert (node != NULL); |
| 1243 | interval_tree_propagate_limit (node); | 1253 | interval_tree_propagate_limit (node); |
| 1244 | } | 1254 | } |
| 1245 | } | 1255 | } |
| 1246 | interval_stack_destroy (stack); | 1256 | interval_stack_destroy (stack); |
| 1247 | } | 1257 | } |
| 1248 | 1258 | ||
| @@ -1250,12 +1260,12 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1250 | uintmax_t notick = tree->otick; | 1260 | uintmax_t notick = tree->otick; |
| 1251 | nodeptr_and_flag nav; | 1261 | nodeptr_and_flag nav; |
| 1252 | while ((nav = interval_stack_pop (saved), | 1262 | while ((nav = interval_stack_pop (saved), |
| 1253 | node = nav_nodeptr (nav))) | 1263 | node = nav_nodeptr (nav))) |
| 1254 | { | 1264 | { |
| 1255 | eassert (node->otick == ootick); | 1265 | eassert (node->otick == ootick); |
| 1256 | node->begin += length; | 1266 | node->begin += length; |
| 1257 | if (node->end != pos || node->rear_advance) | 1267 | if (node->end != pos || node->rear_advance) |
| 1258 | node->end += length; | 1268 | node->end += length; |
| 1259 | node->otick = notick; | 1269 | node->otick = notick; |
| 1260 | interval_tree_insert (tree, node); | 1270 | interval_tree_insert (tree, node); |
| 1261 | } | 1271 | } |
| @@ -1268,7 +1278,7 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1268 | 1278 | ||
| 1269 | void | 1279 | void |
| 1270 | itree_delete_gap (struct itree_tree *tree, | 1280 | itree_delete_gap (struct itree_tree *tree, |
| 1271 | ptrdiff_t pos, ptrdiff_t length) | 1281 | ptrdiff_t pos, ptrdiff_t length) |
| 1272 | { | 1282 | { |
| 1273 | if (length <= 0 || tree->root == NULL) | 1283 | if (length <= 0 || tree->root == NULL) |
| 1274 | return; | 1284 | return; |
| @@ -1288,28 +1298,28 @@ itree_delete_gap (struct itree_tree *tree, | |||
| 1288 | node = nav_nodeptr (nav); | 1298 | node = nav_nodeptr (nav); |
| 1289 | interval_tree_inherit_offset (tree->otick, node); | 1299 | interval_tree_inherit_offset (tree->otick, node); |
| 1290 | if (node->right != NULL) | 1300 | if (node->right != NULL) |
| 1291 | { | 1301 | { |
| 1292 | if (node->begin > pos + length) | 1302 | if (node->begin > pos + length) |
| 1293 | { | 1303 | { |
| 1294 | /* Shift right subtree to the left. */ | 1304 | /* Shift right subtree to the left. */ |
| 1295 | node->right->offset -= length; | 1305 | node->right->offset -= length; |
| 1296 | ++tree->otick; | 1306 | ++tree->otick; |
| 1297 | } | 1307 | } |
| 1298 | else | 1308 | else |
| 1299 | interval_stack_push (stack, node->right); | 1309 | interval_stack_push (stack, node->right); |
| 1300 | } | 1310 | } |
| 1301 | if (node->left != NULL | 1311 | if (node->left != NULL |
| 1302 | && pos <= node->left->limit + node->left->offset) | 1312 | && pos <= node->left->limit + node->left->offset) |
| 1303 | interval_stack_push (stack, node->left); | 1313 | interval_stack_push (stack, node->left); |
| 1304 | 1314 | ||
| 1305 | if (pos < node->begin) | 1315 | if (pos < node->begin) |
| 1306 | node->begin = max (pos, node->begin - length); | 1316 | node->begin = max (pos, node->begin - length); |
| 1307 | if (node->end > pos) | 1317 | if (node->end > pos) |
| 1308 | { | 1318 | { |
| 1309 | node->end = max (pos , node->end - length); | 1319 | node->end = max (pos , node->end - length); |
| 1310 | eassert (node != NULL); | 1320 | eassert (node != NULL); |
| 1311 | interval_tree_propagate_limit (node); | 1321 | interval_tree_propagate_limit (node); |
| 1312 | } | 1322 | } |
| 1313 | } | 1323 | } |
| 1314 | interval_stack_destroy (stack); | 1324 | interval_stack_destroy (stack); |
| 1315 | } | 1325 | } |
| @@ -1330,7 +1340,7 @@ itree_delete_gap (struct itree_tree *tree, | |||
| 1330 | 1340 | ||
| 1331 | static inline bool | 1341 | static inline bool |
| 1332 | interval_node_intersects (const struct itree_node *node, | 1342 | interval_node_intersects (const struct itree_node *node, |
| 1333 | ptrdiff_t begin, ptrdiff_t end) | 1343 | ptrdiff_t begin, ptrdiff_t end) |
| 1334 | { | 1344 | { |
| 1335 | return (begin < node->end && node->begin < end) | 1345 | return (begin < node->end && node->begin < end) |
| 1336 | || (node->begin == node->end && begin == node->begin); | 1346 | || (node->begin == node->end && begin == node->begin); |
| @@ -1344,7 +1354,7 @@ itree_iterator_next (struct itree_iterator *g) | |||
| 1344 | { | 1354 | { |
| 1345 | eassert (g->running); | 1355 | eassert (g->running); |
| 1346 | 1356 | ||
| 1347 | struct itree_node * const null = NULL; | 1357 | const struct itree_node *null = NULL; |
| 1348 | struct itree_node *node; | 1358 | struct itree_node *node; |
| 1349 | 1359 | ||
| 1350 | /* The `visited` flag stored in each node is used here (and only here): | 1360 | /* The `visited` flag stored in each node is used here (and only here): |
| @@ -1357,51 +1367,52 @@ itree_iterator_next (struct itree_iterator *g) | |||
| 1357 | needs to be considered but we haven't yet decided whether it's included | 1367 | needs to be considered but we haven't yet decided whether it's included |
| 1358 | in the iterator's output. */ | 1368 | in the iterator's output. */ |
| 1359 | 1369 | ||
| 1360 | do { | 1370 | do |
| 1361 | nodeptr_and_flag nav; | 1371 | { |
| 1362 | bool visited; | 1372 | nodeptr_and_flag nav; |
| 1363 | while ((nav = interval_stack_pop (g->stack), | 1373 | bool visited; |
| 1364 | node = nav_nodeptr (nav), | 1374 | while ((nav = interval_stack_pop (g->stack), |
| 1365 | visited = nav_flag (nav), | 1375 | node = nav_nodeptr (nav), |
| 1366 | node && !visited)) | 1376 | visited = nav_flag (nav), |
| 1367 | { | 1377 | node && !visited)) |
| 1368 | struct itree_node * const left = node->left; | 1378 | { |
| 1369 | struct itree_node * const right = node->right; | 1379 | const struct itree_node *left = node->left; |
| 1370 | 1380 | const struct itree_node *right = node->right; | |
| 1371 | interval_tree_inherit_offset (g->otick, node); | 1381 | |
| 1372 | eassert (itree_limit_is_stable (node)); | 1382 | interval_tree_inherit_offset (g->otick, node); |
| 1373 | switch (g->order) | 1383 | eassert (itree_limit_is_stable (node)); |
| 1374 | { | 1384 | switch (g->order) |
| 1375 | case ITREE_ASCENDING: | 1385 | { |
| 1376 | if (right != null && node->begin <= g->end) | 1386 | case ITREE_ASCENDING: |
| 1377 | interval_stack_push_flagged (g->stack, right, false); | 1387 | if (right != null && node->begin <= g->end) |
| 1378 | if (interval_node_intersects (node, g->begin, g->end)) | 1388 | interval_stack_push_flagged (g->stack, right, false); |
| 1379 | interval_stack_push_flagged (g->stack, node, true); | 1389 | if (interval_node_intersects (node, g->begin, g->end)) |
| 1380 | /* Node's children may still be off-set and we need to add it. */ | 1390 | interval_stack_push_flagged (g->stack, node, true); |
| 1381 | if (left != null && g->begin <= left->limit + left->offset) | 1391 | /* Node's children may still be off-set and we need to add it. */ |
| 1382 | interval_stack_push_flagged (g->stack, left, false); | 1392 | if (left != null && g->begin <= left->limit + left->offset) |
| 1383 | break; | 1393 | interval_stack_push_flagged (g->stack, left, false); |
| 1384 | case ITREE_DESCENDING: | 1394 | break; |
| 1385 | if (left != null && g->begin <= left->limit + left->offset) | 1395 | case ITREE_DESCENDING: |
| 1386 | interval_stack_push_flagged (g->stack, left, false); | 1396 | if (left != null && g->begin <= left->limit + left->offset) |
| 1387 | if (interval_node_intersects (node, g->begin, g->end)) | 1397 | interval_stack_push_flagged (g->stack, left, false); |
| 1388 | interval_stack_push_flagged (g->stack, node, true); | 1398 | if (interval_node_intersects (node, g->begin, g->end)) |
| 1389 | if (right != null && node->begin <= g->end) | 1399 | interval_stack_push_flagged (g->stack, node, true); |
| 1390 | interval_stack_push_flagged (g->stack, right, false); | 1400 | if (right != null && node->begin <= g->end) |
| 1391 | break; | 1401 | interval_stack_push_flagged (g->stack, right, false); |
| 1392 | case ITREE_PRE_ORDER: | 1402 | break; |
| 1393 | if (right != null && node->begin <= g->end) | 1403 | case ITREE_PRE_ORDER: |
| 1394 | interval_stack_push_flagged (g->stack, right, false); | 1404 | if (right != null && node->begin <= g->end) |
| 1395 | if (left != null && g->begin <= left->limit + left->offset) | 1405 | interval_stack_push_flagged (g->stack, right, false); |
| 1396 | interval_stack_push_flagged (g->stack, left, false); | 1406 | if (left != null && g->begin <= left->limit + left->offset) |
| 1397 | if (interval_node_intersects (node, g->begin, g->end)) | 1407 | interval_stack_push_flagged (g->stack, left, false); |
| 1398 | interval_stack_push_flagged (g->stack, node, true); | 1408 | if (interval_node_intersects (node, g->begin, g->end)) |
| 1399 | break; | 1409 | interval_stack_push_flagged (g->stack, node, true); |
| 1400 | } | 1410 | break; |
| 1401 | } | 1411 | } |
| 1402 | /* Node may have been invalidated by itree_iterator_narrow | 1412 | } |
| 1403 | after it was pushed: Check if it still intersects. */ | 1413 | /* Node may have been invalidated by itree_iterator_narrow |
| 1404 | } while (node && ! interval_node_intersects (node, g->begin, g->end)); | 1414 | after it was pushed: Check if it still intersects. */ |
| 1415 | } while (node && ! interval_node_intersects (node, g->begin, g->end)); | ||
| 1405 | 1416 | ||
| 1406 | return node; | 1417 | return node; |
| 1407 | } | 1418 | } |
| @@ -1411,7 +1422,7 @@ itree_iterator_next (struct itree_iterator *g) | |||
| 1411 | 1422 | ||
| 1412 | void | 1423 | void |
| 1413 | itree_iterator_narrow (struct itree_iterator *g, | 1424 | itree_iterator_narrow (struct itree_iterator *g, |
| 1414 | ptrdiff_t begin, ptrdiff_t end) | 1425 | ptrdiff_t begin, ptrdiff_t end) |
| 1415 | { | 1426 | { |
| 1416 | eassert (g->running); | 1427 | eassert (g->running); |
| 1417 | eassert (begin >= g->begin); | 1428 | eassert (begin >= g->begin); |