diff options
| author | Stefan Monnier | 2022-11-16 16:35:10 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2022-11-16 16:35:10 -0500 |
| commit | f696d27d1ca8e5fe72cd2cd305f5c00b906a00b1 (patch) | |
| tree | 23e51a843346c3424cc0caab6bf812af3f86fb16 /src | |
| parent | 1772d88c1fa811eee235ba9b8b7584bb000ac293 (diff) | |
| download | emacs-f696d27d1ca8e5fe72cd2cd305f5c00b906a00b1.tar.gz emacs-f696d27d1ca8e5fe72cd2cd305f5c00b906a00b1.zip | |
* src/itree.c: Use more uniform names starting with `itree_`
(struct itree_stack, itree_stack_create, itree_stack_destroy)
(itree_stack_clear, itree_stack_push_flagged, interval_stack_push)
(itree_stack_pop): Rename from `interval_stack*`.
(itree_max_height, itree_update_limit, itree_inherit_offset)
(itree_propagate_limit, itree_validate, itree_init)
(itree_rotate_left, itree_rotate_right, itree_insert_fix)
(itree_contains, itree_subtree_min, itree_remove_fix)
(itree_replace_child, itree_transplant): Rename from `interval_tree_*`.
(itree_insert_node): Rename from `interval_tree_insert`.
(itree_node_intersects): Rename from `interval_node_insert`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/itree.c | 228 |
1 files changed, 114 insertions, 114 deletions
diff --git a/src/itree.c b/src/itree.c index ae69c97d6df..da0242905c2 100644 --- a/src/itree.c +++ b/src/itree.c | |||
| @@ -155,7 +155,7 @@ nav_flag (nodeptr_and_flag nav) | |||
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | /* Simple dynamic array. */ | 157 | /* Simple dynamic array. */ |
| 158 | struct interval_stack | 158 | struct itree_stack |
| 159 | { | 159 | { |
| 160 | nodeptr_and_flag *nodes; | 160 | nodeptr_and_flag *nodes; |
| 161 | size_t size; | 161 | size_t size; |
| @@ -164,10 +164,10 @@ struct interval_stack | |||
| 164 | 164 | ||
| 165 | /* This is just a simple dynamic array with stack semantics. */ | 165 | /* This is just a simple dynamic array with stack semantics. */ |
| 166 | 166 | ||
| 167 | static struct interval_stack* | 167 | static struct itree_stack* |
| 168 | interval_stack_create (intmax_t initial_size) | 168 | itree_stack_create (intmax_t initial_size) |
| 169 | { | 169 | { |
| 170 | struct interval_stack *stack = xmalloc (sizeof (struct interval_stack)); | 170 | struct itree_stack *stack = xmalloc (sizeof (struct itree_stack)); |
| 171 | stack->size = max (0, initial_size); | 171 | stack->size = max (0, initial_size); |
| 172 | stack->nodes = xmalloc (stack->size * sizeof (struct itree_node*)); | 172 | stack->nodes = xmalloc (stack->size * sizeof (struct itree_node*)); |
| 173 | stack->length = 0; | 173 | stack->length = 0; |
| @@ -175,7 +175,7 @@ interval_stack_create (intmax_t initial_size) | |||
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | static void | 177 | static void |
| 178 | interval_stack_destroy (struct interval_stack *stack) | 178 | itree_stack_destroy (struct itree_stack *stack) |
| 179 | { | 179 | { |
| 180 | if (! stack) | 180 | if (! stack) |
| 181 | return; | 181 | return; |
| @@ -185,13 +185,13 @@ interval_stack_destroy (struct interval_stack *stack) | |||
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | static void | 187 | static void |
| 188 | interval_stack_clear (struct interval_stack *stack) | 188 | itree_stack_clear (struct itree_stack *stack) |
| 189 | { | 189 | { |
| 190 | stack->length = 0; | 190 | stack->length = 0; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | static inline void | 193 | static inline void |
| 194 | interval_stack_ensure_space (struct interval_stack *stack, uintmax_t nelements) | 194 | itree_stack_ensure_space (struct itree_stack *stack, uintmax_t nelements) |
| 195 | { | 195 | { |
| 196 | if (nelements > stack->size) | 196 | if (nelements > stack->size) |
| 197 | { | 197 | { |
| @@ -204,31 +204,31 @@ interval_stack_ensure_space (struct interval_stack *stack, uintmax_t nelements) | |||
| 204 | /* Push NODE on the STACK, while settings its visited flag to FLAG. */ | 204 | /* Push NODE on the STACK, while settings its visited flag to FLAG. */ |
| 205 | 205 | ||
| 206 | static inline void | 206 | static inline void |
| 207 | interval_stack_push_flagged (struct interval_stack *stack, | 207 | itree_stack_push_flagged (struct itree_stack *stack, |
| 208 | struct itree_node *node, bool flag) | 208 | struct itree_node *node, bool flag) |
| 209 | { | 209 | { |
| 210 | eassert (node); | 210 | eassert (node); |
| 211 | 211 | ||
| 212 | /* FIXME: While the stack used in the iterator is bounded by the tree | 212 | /* FIXME: While the stack used in the iterator is bounded by the tree |
| 213 | depth and could be easily pre-allocated to a large enough size to avoid | 213 | depth and could be easily pre-allocated to a large enough size to avoid |
| 214 | this "ensure" check, `interval_stack_push` is also used elsewhere to | 214 | this "ensure" check, `itree_stack_push` is also used elsewhere to |
| 215 | simply collect some subset of the overlays, where it's only bounded by | 215 | simply collect some subset of the overlays, where it's only bounded by |
| 216 | the total number of overlays in the buffer (which can be large and thus | 216 | the total number of overlays in the buffer (which can be large and thus |
| 217 | preferably not pre-allocated needlessly). */ | 217 | preferably not pre-allocated needlessly). */ |
| 218 | interval_stack_ensure_space (stack, stack->length + 1); | 218 | itree_stack_ensure_space (stack, stack->length + 1); |
| 219 | 219 | ||
| 220 | stack->nodes[stack->length] = make_nav (node, flag); | 220 | stack->nodes[stack->length] = make_nav (node, flag); |
| 221 | stack->length++; | 221 | stack->length++; |
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | static inline void | 224 | static inline void |
| 225 | interval_stack_push (struct interval_stack *stack, struct itree_node *node) | 225 | itree_stack_push (struct itree_stack *stack, struct itree_node *node) |
| 226 | { | 226 | { |
| 227 | interval_stack_push_flagged (stack, node, false); | 227 | itree_stack_push_flagged (stack, node, false); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | static inline nodeptr_and_flag | 230 | static inline nodeptr_and_flag |
| 231 | interval_stack_pop (struct interval_stack *stack) | 231 | itree_stack_pop (struct itree_stack *stack) |
| 232 | { | 232 | { |
| 233 | if (stack->length == 0) | 233 | if (stack->length == 0) |
| 234 | return make_nav (NULL, false); | 234 | return make_nav (NULL, false); |
| @@ -241,7 +241,7 @@ interval_stack_pop (struct interval_stack *stack) | |||
| 241 | /* State used when iterating interval. */ | 241 | /* State used when iterating interval. */ |
| 242 | struct itree_iterator | 242 | struct itree_iterator |
| 243 | { | 243 | { |
| 244 | struct interval_stack *stack; | 244 | struct itree_stack *stack; |
| 245 | ptrdiff_t begin; | 245 | ptrdiff_t begin; |
| 246 | ptrdiff_t end; | 246 | ptrdiff_t end; |
| 247 | 247 | ||
| @@ -261,7 +261,7 @@ struct itree_iterator | |||
| 261 | static struct itree_iterator *iter = NULL; | 261 | static struct itree_iterator *iter = NULL; |
| 262 | 262 | ||
| 263 | static int | 263 | static int |
| 264 | interval_tree_max_height (const struct itree_tree *tree) | 264 | itree_max_height (const struct itree_tree *tree) |
| 265 | { | 265 | { |
| 266 | return 2 * log (tree->size + 1) / log (2) + 0.5; | 266 | return 2 * log (tree->size + 1) / log (2) + 0.5; |
| 267 | } | 267 | } |
| @@ -276,9 +276,9 @@ itree_iterator_create (struct itree_tree *tree) | |||
| 276 | FIXME: Since this stack only needs to be about 2*max_depth | 276 | FIXME: Since this stack only needs to be about 2*max_depth |
| 277 | in the worst case, we could completely pre-allocate it to something | 277 | in the worst case, we could completely pre-allocate it to something |
| 278 | like word-bit-size * 2 and then never worry about growing it. */ | 278 | like word-bit-size * 2 and then never worry about growing it. */ |
| 279 | const int size = (tree ? interval_tree_max_height (tree) : 19) + 1; | 279 | const int size = (tree ? itree_max_height (tree) : 19) + 1; |
| 280 | 280 | ||
| 281 | g->stack = interval_stack_create (size); | 281 | g->stack = itree_stack_create (size); |
| 282 | g->running = false; | 282 | g->running = false; |
| 283 | g->begin = 0; | 283 | g->begin = 0; |
| 284 | g->end = 0; | 284 | g->end = 0; |
| @@ -334,7 +334,7 @@ check_subtree (struct itree_node *node, | |||
| 334 | and <= to its parent's otick. | 334 | and <= to its parent's otick. |
| 335 | 335 | ||
| 336 | Note: we cannot assert that (NODE.otick == NODE.parent.otick) | 336 | Note: we cannot assert that (NODE.otick == NODE.parent.otick) |
| 337 | implies (NODE.offset == 0) because interval_tree_inherit_offset() | 337 | implies (NODE.offset == 0) because itree_inherit_offset() |
| 338 | doesn't always update otick. It could, but it is not clear there | 338 | doesn't always update otick. It could, but it is not clear there |
| 339 | is a need. */ | 339 | is a need. */ |
| 340 | eassert (node->otick <= tree_otick); | 340 | eassert (node->otick <= tree_otick); |
| @@ -438,7 +438,7 @@ itree_newlimit (struct itree_node *node) | |||
| 438 | /* Update NODE's limit attribute according to its children. */ | 438 | /* Update NODE's limit attribute according to its children. */ |
| 439 | 439 | ||
| 440 | static void | 440 | static void |
| 441 | interval_tree_update_limit (struct itree_node *node) | 441 | itree_update_limit (struct itree_node *node) |
| 442 | { | 442 | { |
| 443 | if (node == NULL) | 443 | if (node == NULL) |
| 444 | return; | 444 | return; |
| @@ -453,7 +453,7 @@ interval_tree_update_limit (struct itree_node *node) | |||
| 453 | */ | 453 | */ |
| 454 | 454 | ||
| 455 | static void | 455 | static void |
| 456 | interval_tree_inherit_offset (uintmax_t otick, struct itree_node *node) | 456 | itree_inherit_offset (uintmax_t otick, struct itree_node *node) |
| 457 | { | 457 | { |
| 458 | eassert (node->parent == NULL || node->parent->otick >= node->otick); | 458 | eassert (node->parent == NULL || node->parent->otick >= node->otick); |
| 459 | if (node->otick == otick) | 459 | if (node->otick == otick) |
| @@ -490,7 +490,7 @@ interval_tree_inherit_offset (uintmax_t otick, struct itree_node *node) | |||
| 490 | stable, i.e. new_limit = old_limit. */ | 490 | stable, i.e. new_limit = old_limit. */ |
| 491 | 491 | ||
| 492 | static void | 492 | static void |
| 493 | interval_tree_propagate_limit (struct itree_node *node) | 493 | itree_propagate_limit (struct itree_node *node) |
| 494 | { | 494 | { |
| 495 | ptrdiff_t newlimit; | 495 | ptrdiff_t newlimit; |
| 496 | 496 | ||
| @@ -511,15 +511,15 @@ interval_tree_propagate_limit (struct itree_node *node) | |||
| 511 | } | 511 | } |
| 512 | 512 | ||
| 513 | static struct itree_node* | 513 | static struct itree_node* |
| 514 | interval_tree_validate (struct itree_tree *tree, struct itree_node *node) | 514 | itree_validate (struct itree_tree *tree, struct itree_node *node) |
| 515 | { | 515 | { |
| 516 | 516 | ||
| 517 | if (tree->otick == node->otick || node == NULL) | 517 | if (tree->otick == node->otick || node == NULL) |
| 518 | return node; | 518 | return node; |
| 519 | if (node != tree->root) | 519 | if (node != tree->root) |
| 520 | interval_tree_validate (tree, node->parent); | 520 | itree_validate (tree, node->parent); |
| 521 | 521 | ||
| 522 | interval_tree_inherit_offset (tree->otick, node); | 522 | itree_inherit_offset (tree->otick, node); |
| 523 | return node; | 523 | return node; |
| 524 | } | 524 | } |
| 525 | 525 | ||
| @@ -550,7 +550,7 @@ ptrdiff_t | |||
| 550 | itree_node_begin (struct itree_tree *tree, | 550 | itree_node_begin (struct itree_tree *tree, |
| 551 | struct itree_node *node) | 551 | struct itree_node *node) |
| 552 | { | 552 | { |
| 553 | interval_tree_validate (tree, node); | 553 | itree_validate (tree, node); |
| 554 | return node->begin; | 554 | return node->begin; |
| 555 | } | 555 | } |
| 556 | 556 | ||
| @@ -560,7 +560,7 @@ ptrdiff_t | |||
| 560 | itree_node_end (struct itree_tree *tree, | 560 | itree_node_end (struct itree_tree *tree, |
| 561 | struct itree_node *node) | 561 | struct itree_node *node) |
| 562 | { | 562 | { |
| 563 | interval_tree_validate (tree, node); | 563 | itree_validate (tree, node); |
| 564 | return node->end; | 564 | return node->end; |
| 565 | } | 565 | } |
| 566 | 566 | ||
| @@ -588,7 +588,7 @@ itree_clear (struct itree_tree *tree) | |||
| 588 | /* Initialize a pre-allocated tree (presumably on the stack). */ | 588 | /* Initialize a pre-allocated tree (presumably on the stack). */ |
| 589 | 589 | ||
| 590 | static void | 590 | static void |
| 591 | interval_tree_init (struct itree_tree *tree) | 591 | itree_init (struct itree_tree *tree) |
| 592 | { | 592 | { |
| 593 | itree_clear (tree); | 593 | itree_clear (tree); |
| 594 | } | 594 | } |
| @@ -613,15 +613,15 @@ itree_size (struct itree_tree *tree) | |||
| 613 | /* Perform the familiar left-rotation on node NODE. */ | 613 | /* Perform the familiar left-rotation on node NODE. */ |
| 614 | 614 | ||
| 615 | static void | 615 | static void |
| 616 | interval_tree_rotate_left (struct itree_tree *tree, | 616 | itree_rotate_left (struct itree_tree *tree, |
| 617 | struct itree_node *node) | 617 | struct itree_node *node) |
| 618 | { | 618 | { |
| 619 | eassert (node->right != NULL); | 619 | eassert (node->right != NULL); |
| 620 | 620 | ||
| 621 | struct itree_node *right = node->right; | 621 | struct itree_node *right = node->right; |
| 622 | 622 | ||
| 623 | interval_tree_inherit_offset (tree->otick, node); | 623 | itree_inherit_offset (tree->otick, node); |
| 624 | interval_tree_inherit_offset (tree->otick, right); | 624 | itree_inherit_offset (tree->otick, right); |
| 625 | 625 | ||
| 626 | /* Turn right's left subtree into node's right subtree. */ | 626 | /* Turn right's left subtree into node's right subtree. */ |
| 627 | node->right = right->left; | 627 | node->right = right->left; |
| @@ -649,22 +649,22 @@ interval_tree_rotate_left (struct itree_tree *tree, | |||
| 649 | node->parent = right; | 649 | node->parent = right; |
| 650 | 650 | ||
| 651 | /* Order matters here. */ | 651 | /* Order matters here. */ |
| 652 | interval_tree_update_limit (node); | 652 | itree_update_limit (node); |
| 653 | interval_tree_update_limit (right); | 653 | itree_update_limit (right); |
| 654 | } | 654 | } |
| 655 | 655 | ||
| 656 | /* Perform the familiar right-rotation on node NODE. */ | 656 | /* Perform the familiar right-rotation on node NODE. */ |
| 657 | 657 | ||
| 658 | static void | 658 | static void |
| 659 | interval_tree_rotate_right (struct itree_tree *tree, | 659 | itree_rotate_right (struct itree_tree *tree, |
| 660 | struct itree_node *node) | 660 | struct itree_node *node) |
| 661 | { | 661 | { |
| 662 | eassert (tree && node && node->left != NULL); | 662 | eassert (tree && node && node->left != NULL); |
| 663 | 663 | ||
| 664 | struct itree_node *left = node->left; | 664 | struct itree_node *left = node->left; |
| 665 | 665 | ||
| 666 | interval_tree_inherit_offset (tree->otick, node); | 666 | itree_inherit_offset (tree->otick, node); |
| 667 | interval_tree_inherit_offset (tree->otick, left); | 667 | itree_inherit_offset (tree->otick, left); |
| 668 | 668 | ||
| 669 | node->left = left->right; | 669 | node->left = left->right; |
| 670 | if (left->right != NULL) | 670 | if (left->right != NULL) |
| @@ -686,8 +686,8 @@ interval_tree_rotate_right (struct itree_tree *tree, | |||
| 686 | if (node != NULL) | 686 | if (node != NULL) |
| 687 | node->parent = left; | 687 | node->parent = left; |
| 688 | 688 | ||
| 689 | interval_tree_update_limit (left); | 689 | itree_update_limit (left); |
| 690 | interval_tree_update_limit (node); | 690 | itree_update_limit (node); |
| 691 | } | 691 | } |
| 692 | 692 | ||
| 693 | /* Repair the tree after an insertion. | 693 | /* Repair the tree after an insertion. |
| @@ -695,7 +695,7 @@ interval_tree_rotate_right (struct itree_tree *tree, | |||
| 695 | Rebalance the parents as needed to re-establish the RB invariants. */ | 695 | Rebalance the parents as needed to re-establish the RB invariants. */ |
| 696 | 696 | ||
| 697 | static void | 697 | static void |
| 698 | interval_tree_insert_fix (struct itree_tree *tree, | 698 | itree_insert_fix (struct itree_tree *tree, |
| 699 | struct itree_node *node) | 699 | struct itree_node *node) |
| 700 | { | 700 | { |
| 701 | eassert (tree->root->red == false); | 701 | eassert (tree->root->red == false); |
| @@ -729,12 +729,12 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 729 | if (node == node->parent->right) /* case 2.a */ | 729 | if (node == node->parent->right) /* case 2.a */ |
| 730 | { | 730 | { |
| 731 | node = node->parent; | 731 | node = node->parent; |
| 732 | interval_tree_rotate_left (tree, node); | 732 | itree_rotate_left (tree, node); |
| 733 | } | 733 | } |
| 734 | /* case 3.a */ | 734 | /* case 3.a */ |
| 735 | node->parent->red = false; | 735 | node->parent->red = false; |
| 736 | node->parent->parent->red = true; | 736 | node->parent->parent->red = true; |
| 737 | interval_tree_rotate_right (tree, node->parent->parent); | 737 | itree_rotate_right (tree, node->parent->parent); |
| 738 | } | 738 | } |
| 739 | } | 739 | } |
| 740 | else | 740 | else |
| @@ -754,12 +754,12 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 754 | if (node == node->parent->left) /* case 2.b */ | 754 | if (node == node->parent->left) /* case 2.b */ |
| 755 | { | 755 | { |
| 756 | node = node->parent; | 756 | node = node->parent; |
| 757 | interval_tree_rotate_right (tree, node); | 757 | itree_rotate_right (tree, node); |
| 758 | } | 758 | } |
| 759 | /* case 3.b */ | 759 | /* case 3.b */ |
| 760 | node->parent->red = false; | 760 | node->parent->red = false; |
| 761 | node->parent->parent->red = true; | 761 | node->parent->parent->red = true; |
| 762 | interval_tree_rotate_left (tree, node->parent->parent); | 762 | itree_rotate_left (tree, node->parent->parent); |
| 763 | } | 763 | } |
| 764 | } | 764 | } |
| 765 | } | 765 | } |
| @@ -774,7 +774,7 @@ interval_tree_insert_fix (struct itree_tree *tree, | |||
| 774 | Note, that inserting a node twice results in undefined behavior. */ | 774 | Note, that inserting a node twice results in undefined behavior. */ |
| 775 | 775 | ||
| 776 | static void | 776 | static void |
| 777 | interval_tree_insert (struct itree_tree *tree, struct itree_node *node) | 777 | itree_insert_node (struct itree_tree *tree, struct itree_node *node) |
| 778 | { | 778 | { |
| 779 | eassert (node && node->begin <= node->end); | 779 | eassert (node && node->begin <= node->end); |
| 780 | /* FIXME: The assertion below fails because `delete_all_overlays` | 780 | /* FIXME: The assertion below fails because `delete_all_overlays` |
| @@ -794,7 +794,7 @@ interval_tree_insert (struct itree_tree *tree, struct itree_node *node) | |||
| 794 | ancestors limit values. */ | 794 | ancestors limit values. */ |
| 795 | while (child != NULL) | 795 | while (child != NULL) |
| 796 | { | 796 | { |
| 797 | interval_tree_inherit_offset (otick, child); | 797 | itree_inherit_offset (otick, child); |
| 798 | parent = child; | 798 | parent = child; |
| 799 | eassert (child->offset == 0); | 799 | eassert (child->offset == 0); |
| 800 | child->limit = max (child->limit, node->end); | 800 | child->limit = max (child->limit, node->end); |
| @@ -827,7 +827,7 @@ interval_tree_insert (struct itree_tree *tree, struct itree_node *node) | |||
| 827 | { | 827 | { |
| 828 | node->red = true; | 828 | node->red = true; |
| 829 | eassert (check_tree (tree, false)); /* FIXME: Too expensive. */ | 829 | eassert (check_tree (tree, false)); /* FIXME: Too expensive. */ |
| 830 | interval_tree_insert_fix (tree, node); | 830 | itree_insert_fix (tree, node); |
| 831 | } | 831 | } |
| 832 | } | 832 | } |
| 833 | 833 | ||
| @@ -838,7 +838,7 @@ itree_insert (struct itree_tree *tree, struct itree_node *node, | |||
| 838 | node->begin = begin; | 838 | node->begin = begin; |
| 839 | node->end = end; | 839 | node->end = end; |
| 840 | node->otick = tree->otick; | 840 | node->otick = tree->otick; |
| 841 | interval_tree_insert (tree, node); | 841 | itree_insert_node (tree, node); |
| 842 | } | 842 | } |
| 843 | 843 | ||
| 844 | /* Safely modify a node's interval. */ | 844 | /* Safely modify a node's interval. */ |
| @@ -848,26 +848,26 @@ itree_node_set_region (struct itree_tree *tree, | |||
| 848 | struct itree_node *node, | 848 | struct itree_node *node, |
| 849 | ptrdiff_t begin, ptrdiff_t end) | 849 | ptrdiff_t begin, ptrdiff_t end) |
| 850 | { | 850 | { |
| 851 | interval_tree_validate (tree, node); | 851 | itree_validate (tree, node); |
| 852 | if (begin != node->begin) | 852 | if (begin != node->begin) |
| 853 | { | 853 | { |
| 854 | itree_remove (tree, node); | 854 | itree_remove (tree, node); |
| 855 | node->begin = min (begin, PTRDIFF_MAX - 1); | 855 | node->begin = min (begin, PTRDIFF_MAX - 1); |
| 856 | node->end = max (node->begin, end); | 856 | node->end = max (node->begin, end); |
| 857 | interval_tree_insert (tree, node); | 857 | itree_insert_node (tree, node); |
| 858 | } | 858 | } |
| 859 | else if (end != node->end) | 859 | else if (end != node->end) |
| 860 | { | 860 | { |
| 861 | node->end = max (node->begin, end); | 861 | node->end = max (node->begin, end); |
| 862 | eassert (node != NULL); | 862 | eassert (node != NULL); |
| 863 | interval_tree_propagate_limit (node); | 863 | itree_propagate_limit (node); |
| 864 | } | 864 | } |
| 865 | } | 865 | } |
| 866 | 866 | ||
| 867 | /* Return true, if NODE is a member of TREE. */ | 867 | /* Return true, if NODE is a member of TREE. */ |
| 868 | 868 | ||
| 869 | static bool | 869 | static bool |
| 870 | interval_tree_contains (struct itree_tree *tree, struct itree_node *node) | 870 | itree_contains (struct itree_tree *tree, struct itree_node *node) |
| 871 | { | 871 | { |
| 872 | eassert (iter && node); | 872 | eassert (iter && node); |
| 873 | struct itree_node *other; | 873 | struct itree_node *other; |
| @@ -891,11 +891,11 @@ itree_limit_is_stable (struct itree_node *node) | |||
| 891 | } | 891 | } |
| 892 | 892 | ||
| 893 | static struct itree_node* | 893 | static struct itree_node* |
| 894 | interval_tree_subtree_min (uintmax_t otick, struct itree_node *node) | 894 | itree_subtree_min (uintmax_t otick, struct itree_node *node) |
| 895 | { | 895 | { |
| 896 | if (node == NULL) | 896 | if (node == NULL) |
| 897 | return node; | 897 | return node; |
| 898 | while ((interval_tree_inherit_offset (otick, node), | 898 | while ((itree_inherit_offset (otick, node), |
| 899 | node->left != NULL)) | 899 | node->left != NULL)) |
| 900 | node = node->left; | 900 | node = node->left; |
| 901 | return node; | 901 | return node; |
| @@ -906,7 +906,7 @@ interval_tree_subtree_min (uintmax_t otick, struct itree_node *node) | |||
| 906 | so re-balance the parents to re-establish the RB invariants. */ | 906 | so re-balance the parents to re-establish the RB invariants. */ |
| 907 | 907 | ||
| 908 | static void | 908 | static void |
| 909 | interval_tree_remove_fix (struct itree_tree *tree, | 909 | itree_remove_fix (struct itree_tree *tree, |
| 910 | struct itree_node *node, | 910 | struct itree_node *node, |
| 911 | struct itree_node *parent) | 911 | struct itree_node *parent) |
| 912 | { | 912 | { |
| @@ -927,7 +927,7 @@ interval_tree_remove_fix (struct itree_tree *tree, | |||
| 927 | { | 927 | { |
| 928 | other->red = false; | 928 | other->red = false; |
| 929 | parent->red = true; | 929 | parent->red = true; |
| 930 | interval_tree_rotate_left (tree, parent); | 930 | itree_rotate_left (tree, parent); |
| 931 | other = parent->right; | 931 | other = parent->right; |
| 932 | } | 932 | } |
| 933 | eassume (other != NULL); | 933 | eassume (other != NULL); |
| @@ -946,13 +946,13 @@ interval_tree_remove_fix (struct itree_tree *tree, | |||
| 946 | { | 946 | { |
| 947 | other->left->red = false; | 947 | other->left->red = false; |
| 948 | other->red = true; | 948 | other->red = true; |
| 949 | interval_tree_rotate_right (tree, other); | 949 | itree_rotate_right (tree, other); |
| 950 | other = parent->right; | 950 | other = parent->right; |
| 951 | } | 951 | } |
| 952 | other->red = parent->red; /* 4.a */ | 952 | other->red = parent->red; /* 4.a */ |
| 953 | parent->red = false; | 953 | parent->red = false; |
| 954 | other->right->red = false; | 954 | other->right->red = false; |
| 955 | interval_tree_rotate_left (tree, parent); | 955 | itree_rotate_left (tree, parent); |
| 956 | node = tree->root; | 956 | node = tree->root; |
| 957 | parent = NULL; | 957 | parent = NULL; |
| 958 | } | 958 | } |
| @@ -965,7 +965,7 @@ interval_tree_remove_fix (struct itree_tree *tree, | |||
| 965 | { | 965 | { |
| 966 | other->red = false; | 966 | other->red = false; |
| 967 | parent->red = true; | 967 | parent->red = true; |
| 968 | interval_tree_rotate_right (tree, parent); | 968 | itree_rotate_right (tree, parent); |
| 969 | other = parent->left; | 969 | other = parent->left; |
| 970 | } | 970 | } |
| 971 | eassume (other != NULL); | 971 | eassume (other != NULL); |
| @@ -984,14 +984,14 @@ interval_tree_remove_fix (struct itree_tree *tree, | |||
| 984 | { | 984 | { |
| 985 | other->right->red = false; | 985 | other->right->red = false; |
| 986 | other->red = true; | 986 | other->red = true; |
| 987 | interval_tree_rotate_left (tree, other); | 987 | itree_rotate_left (tree, other); |
| 988 | other = parent->left; | 988 | other = parent->left; |
| 989 | } | 989 | } |
| 990 | 990 | ||
| 991 | other->red = parent->red; /* 4.b */ | 991 | other->red = parent->red; /* 4.b */ |
| 992 | parent->red = false; | 992 | parent->red = false; |
| 993 | other->left->red = false; | 993 | other->left->red = false; |
| 994 | interval_tree_rotate_right (tree, parent); | 994 | itree_rotate_right (tree, parent); |
| 995 | node = tree->root; | 995 | node = tree->root; |
| 996 | parent = NULL; | 996 | parent = NULL; |
| 997 | } | 997 | } |
| @@ -1024,7 +1024,7 @@ itree_total_offset (struct itree_node *node) | |||
| 1024 | unchanged. Caller is responsible for recalculation of `limit`. | 1024 | unchanged. Caller is responsible for recalculation of `limit`. |
| 1025 | Requires both nodes to be using the same effective `offset`. */ | 1025 | Requires both nodes to be using the same effective `offset`. */ |
| 1026 | static void | 1026 | static void |
| 1027 | interval_tree_replace_child (struct itree_tree *tree, | 1027 | itree_replace_child (struct itree_tree *tree, |
| 1028 | struct itree_node *source, | 1028 | struct itree_node *source, |
| 1029 | struct itree_node *dest) | 1029 | struct itree_node *dest) |
| 1030 | { | 1030 | { |
| @@ -1050,11 +1050,11 @@ interval_tree_replace_child (struct itree_tree *tree, | |||
| 1050 | recalculation of `limit`. Requires both nodes to be using the same | 1050 | recalculation of `limit`. Requires both nodes to be using the same |
| 1051 | effective `offset`. */ | 1051 | effective `offset`. */ |
| 1052 | static void | 1052 | static void |
| 1053 | interval_tree_transplant (struct itree_tree *tree, | 1053 | itree_transplant (struct itree_tree *tree, |
| 1054 | struct itree_node *source, | 1054 | struct itree_node *source, |
| 1055 | struct itree_node *dest) | 1055 | struct itree_node *dest) |
| 1056 | { | 1056 | { |
| 1057 | interval_tree_replace_child (tree, source, dest); | 1057 | itree_replace_child (tree, source, dest); |
| 1058 | source->left = dest->left; | 1058 | source->left = dest->left; |
| 1059 | if (source->left != NULL) | 1059 | if (source->left != NULL) |
| 1060 | source->left->parent = source; | 1060 | source->left->parent = source; |
| @@ -1069,17 +1069,17 @@ interval_tree_transplant (struct itree_tree *tree, | |||
| 1069 | struct itree_node* | 1069 | struct itree_node* |
| 1070 | itree_remove (struct itree_tree *tree, struct itree_node *node) | 1070 | itree_remove (struct itree_tree *tree, struct itree_node *node) |
| 1071 | { | 1071 | { |
| 1072 | eassert (interval_tree_contains (tree, node)); | 1072 | eassert (itree_contains (tree, node)); |
| 1073 | eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ | 1073 | eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ |
| 1074 | 1074 | ||
| 1075 | /* Find `splice`, the leaf node to splice out of the tree. When | 1075 | /* Find `splice`, the leaf node to splice out of the tree. When |
| 1076 | `node` has at most one child this is `node` itself. Otherwise, | 1076 | `node` has at most one child this is `node` itself. Otherwise, |
| 1077 | it is the in order successor of `node`. */ | 1077 | it is the in order successor of `node`. */ |
| 1078 | interval_tree_inherit_offset (tree->otick, node); | 1078 | itree_inherit_offset (tree->otick, node); |
| 1079 | struct itree_node *splice | 1079 | struct itree_node *splice |
| 1080 | = (node->left == NULL || node->right == NULL) | 1080 | = (node->left == NULL || node->right == NULL) |
| 1081 | ? node | 1081 | ? node |
| 1082 | : interval_tree_subtree_min (tree->otick, node->right); | 1082 | : itree_subtree_min (tree->otick, node->right); |
| 1083 | 1083 | ||
| 1084 | /* Find `subtree`, the only child of `splice` (may be NULL). Note: | 1084 | /* Find `subtree`, the only child of `splice` (may be NULL). Note: |
| 1085 | `subtree` will not be modified other than changing its parent to | 1085 | `subtree` will not be modified other than changing its parent to |
| @@ -1100,7 +1100,7 @@ itree_remove (struct itree_tree *tree, struct itree_node *node) | |||
| 1100 | `splice` is black, this creates a red-red violation, so remember | 1100 | `splice` is black, this creates a red-red violation, so remember |
| 1101 | this now as the field can be overwritten when splice is | 1101 | this now as the field can be overwritten when splice is |
| 1102 | transplanted below. */ | 1102 | transplanted below. */ |
| 1103 | interval_tree_replace_child (tree, subtree, splice); | 1103 | itree_replace_child (tree, subtree, splice); |
| 1104 | bool removed_black = !splice->red; | 1104 | bool removed_black = !splice->red; |
| 1105 | 1105 | ||
| 1106 | /* Replace `node` with `splice` in the tree and propagate limit | 1106 | /* Replace `node` with `splice` in the tree and propagate limit |
| @@ -1109,18 +1109,18 @@ itree_remove (struct itree_tree *tree, struct itree_node *node) | |||
| 1109 | has a new child. */ | 1109 | has a new child. */ |
| 1110 | if (splice != node) | 1110 | if (splice != node) |
| 1111 | { | 1111 | { |
| 1112 | interval_tree_transplant (tree, splice, node); | 1112 | itree_transplant (tree, splice, node); |
| 1113 | interval_tree_propagate_limit (subtree_parent); | 1113 | itree_propagate_limit (subtree_parent); |
| 1114 | if (splice != subtree_parent) | 1114 | if (splice != subtree_parent) |
| 1115 | interval_tree_update_limit (splice); | 1115 | itree_update_limit (splice); |
| 1116 | } | 1116 | } |
| 1117 | interval_tree_propagate_limit (splice->parent); | 1117 | itree_propagate_limit (splice->parent); |
| 1118 | 1118 | ||
| 1119 | --tree->size; | 1119 | --tree->size; |
| 1120 | 1120 | ||
| 1121 | /* Fix any black height violation caused by removing a black node. */ | 1121 | /* Fix any black height violation caused by removing a black node. */ |
| 1122 | if (removed_black) | 1122 | if (removed_black) |
| 1123 | interval_tree_remove_fix (tree, subtree, subtree_parent); | 1123 | itree_remove_fix (tree, subtree, subtree_parent); |
| 1124 | 1124 | ||
| 1125 | eassert ((tree->size == 0) == (tree->root == NULL)); | 1125 | eassert ((tree->size == 0) == (tree->root == NULL)); |
| 1126 | eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ | 1126 | eassert (check_tree (tree, true)); /* FIXME: Too expensive. */ |
| @@ -1164,14 +1164,14 @@ itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin, | |||
| 1164 | iter->end = end; | 1164 | iter->end = end; |
| 1165 | iter->otick = tree->otick; | 1165 | iter->otick = tree->otick; |
| 1166 | iter->order = order; | 1166 | iter->order = order; |
| 1167 | interval_stack_clear (iter->stack); | 1167 | itree_stack_clear (iter->stack); |
| 1168 | if (begin <= end && tree->root != NULL) | 1168 | if (begin <= end && tree->root != NULL) |
| 1169 | interval_stack_push_flagged (iter->stack, tree->root, false); | 1169 | itree_stack_push_flagged (iter->stack, tree->root, false); |
| 1170 | iter->file = file; | 1170 | iter->file = file; |
| 1171 | iter->line = line; | 1171 | iter->line = line; |
| 1172 | iter->running = true; | 1172 | iter->running = true; |
| 1173 | /* interval_stack_ensure_space (iter->stack, | 1173 | /* itree_stack_ensure_space (iter->stack, |
| 1174 | 2 * interval_tree_max_height (tree)); */ | 1174 | 2 * itree_max_height (tree)); */ |
| 1175 | return iter; | 1175 | return iter; |
| 1176 | } | 1176 | } |
| 1177 | 1177 | ||
| @@ -1210,7 +1210,7 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1210 | order, so we need to remove them first. This doesn't apply for | 1210 | order, so we need to remove them first. This doesn't apply for |
| 1211 | `before_markers` since in that case, all positions move identically | 1211 | `before_markers` since in that case, all positions move identically |
| 1212 | regardless of `front_advance` or `rear_advance`. */ | 1212 | regardless of `front_advance` or `rear_advance`. */ |
| 1213 | struct interval_stack *saved = interval_stack_create (0); | 1213 | struct itree_stack *saved = itree_stack_create (0); |
| 1214 | struct itree_node *node = NULL; | 1214 | struct itree_node *node = NULL; |
| 1215 | if (!before_markers) | 1215 | if (!before_markers) |
| 1216 | { | 1216 | { |
| @@ -1221,7 +1221,7 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1221 | the overlay is empty, make sure we don't move | 1221 | the overlay is empty, make sure we don't move |
| 1222 | begin past end by pretending it's !front_advance. */ | 1222 | begin past end by pretending it's !front_advance. */ |
| 1223 | && (node->begin != node->end || node->rear_advance)) | 1223 | && (node->begin != node->end || node->rear_advance)) |
| 1224 | interval_stack_push (saved, node); | 1224 | itree_stack_push (saved, node); |
| 1225 | } | 1225 | } |
| 1226 | } | 1226 | } |
| 1227 | for (size_t i = 0; i < saved->length; ++i) | 1227 | for (size_t i = 0; i < saved->length; ++i) |
| @@ -1231,15 +1231,15 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1231 | narrow AND shift some subtree at the same time. */ | 1231 | narrow AND shift some subtree at the same time. */ |
| 1232 | if (tree->root != NULL) | 1232 | if (tree->root != NULL) |
| 1233 | { | 1233 | { |
| 1234 | const int size = interval_tree_max_height (tree) + 1; | 1234 | const int size = itree_max_height (tree) + 1; |
| 1235 | struct interval_stack *stack = interval_stack_create (size); | 1235 | struct itree_stack *stack = itree_stack_create (size); |
| 1236 | interval_stack_push (stack, tree->root); | 1236 | itree_stack_push (stack, tree->root); |
| 1237 | nodeptr_and_flag nav; | 1237 | nodeptr_and_flag nav; |
| 1238 | while ((nav = interval_stack_pop (stack), | 1238 | while ((nav = itree_stack_pop (stack), |
| 1239 | node = nav_nodeptr (nav))) | 1239 | node = nav_nodeptr (nav))) |
| 1240 | { | 1240 | { |
| 1241 | /* Process in pre-order. */ | 1241 | /* Process in pre-order. */ |
| 1242 | interval_tree_inherit_offset (tree->otick, node); | 1242 | itree_inherit_offset (tree->otick, node); |
| 1243 | if (pos > node->limit) | 1243 | if (pos > node->limit) |
| 1244 | continue; | 1244 | continue; |
| 1245 | if (node->right != NULL) | 1245 | if (node->right != NULL) |
| @@ -1251,10 +1251,10 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1251 | ++tree->otick; | 1251 | ++tree->otick; |
| 1252 | } | 1252 | } |
| 1253 | else | 1253 | else |
| 1254 | interval_stack_push (stack, node->right); | 1254 | itree_stack_push (stack, node->right); |
| 1255 | } | 1255 | } |
| 1256 | if (node->left != NULL) | 1256 | if (node->left != NULL) |
| 1257 | interval_stack_push (stack, node->left); | 1257 | itree_stack_push (stack, node->left); |
| 1258 | 1258 | ||
| 1259 | if (before_markers | 1259 | if (before_markers |
| 1260 | ? node->begin >= pos | 1260 | ? node->begin >= pos |
| @@ -1265,16 +1265,16 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1265 | { | 1265 | { |
| 1266 | node->end += length; | 1266 | node->end += length; |
| 1267 | eassert (node != NULL); | 1267 | eassert (node != NULL); |
| 1268 | interval_tree_propagate_limit (node); | 1268 | itree_propagate_limit (node); |
| 1269 | } | 1269 | } |
| 1270 | } | 1270 | } |
| 1271 | interval_stack_destroy (stack); | 1271 | itree_stack_destroy (stack); |
| 1272 | } | 1272 | } |
| 1273 | 1273 | ||
| 1274 | /* Reinsert nodes starting at POS having front-advance. */ | 1274 | /* Reinsert nodes starting at POS having front-advance. */ |
| 1275 | uintmax_t notick = tree->otick; | 1275 | uintmax_t notick = tree->otick; |
| 1276 | nodeptr_and_flag nav; | 1276 | nodeptr_and_flag nav; |
| 1277 | while ((nav = interval_stack_pop (saved), | 1277 | while ((nav = itree_stack_pop (saved), |
| 1278 | node = nav_nodeptr (nav))) | 1278 | node = nav_nodeptr (nav))) |
| 1279 | { | 1279 | { |
| 1280 | eassert (node->otick == ootick); | 1280 | eassert (node->otick == ootick); |
| @@ -1283,10 +1283,10 @@ itree_insert_gap (struct itree_tree *tree, | |||
| 1283 | node->begin += length; | 1283 | node->begin += length; |
| 1284 | node->end += length; | 1284 | node->end += length; |
| 1285 | node->otick = notick; | 1285 | node->otick = notick; |
| 1286 | interval_tree_insert (tree, node); | 1286 | itree_insert_node (tree, node); |
| 1287 | } | 1287 | } |
| 1288 | 1288 | ||
| 1289 | interval_stack_destroy (saved); | 1289 | itree_stack_destroy (saved); |
| 1290 | } | 1290 | } |
| 1291 | 1291 | ||
| 1292 | /* Delete a gap at POS of length LENGTH, contracting all intervals | 1292 | /* Delete a gap at POS of length LENGTH, contracting all intervals |
| @@ -1303,16 +1303,16 @@ itree_delete_gap (struct itree_tree *tree, | |||
| 1303 | 1303 | ||
| 1304 | /* Can't use the iterator here, because by decrementing begin, we | 1304 | /* Can't use the iterator here, because by decrementing begin, we |
| 1305 | might unintentionally bring shifted nodes back into our search space. */ | 1305 | might unintentionally bring shifted nodes back into our search space. */ |
| 1306 | const int size = interval_tree_max_height (tree) + 1; | 1306 | const int size = itree_max_height (tree) + 1; |
| 1307 | struct interval_stack *stack = interval_stack_create (size); | 1307 | struct itree_stack *stack = itree_stack_create (size); |
| 1308 | struct itree_node *node; | 1308 | struct itree_node *node; |
| 1309 | 1309 | ||
| 1310 | interval_stack_push (stack, tree->root); | 1310 | itree_stack_push (stack, tree->root); |
| 1311 | nodeptr_and_flag nav; | 1311 | nodeptr_and_flag nav; |
| 1312 | while ((nav = interval_stack_pop (stack))) | 1312 | while ((nav = itree_stack_pop (stack))) |
| 1313 | { | 1313 | { |
| 1314 | node = nav_nodeptr (nav); | 1314 | node = nav_nodeptr (nav); |
| 1315 | interval_tree_inherit_offset (tree->otick, node); | 1315 | itree_inherit_offset (tree->otick, node); |
| 1316 | if (pos > node->limit) | 1316 | if (pos > node->limit) |
| 1317 | continue; | 1317 | continue; |
| 1318 | if (node->right != NULL) | 1318 | if (node->right != NULL) |
| @@ -1324,10 +1324,10 @@ itree_delete_gap (struct itree_tree *tree, | |||
| 1324 | ++tree->otick; | 1324 | ++tree->otick; |
| 1325 | } | 1325 | } |
| 1326 | else | 1326 | else |
| 1327 | interval_stack_push (stack, node->right); | 1327 | itree_stack_push (stack, node->right); |
| 1328 | } | 1328 | } |
| 1329 | if (node->left != NULL) | 1329 | if (node->left != NULL) |
| 1330 | interval_stack_push (stack, node->left); | 1330 | itree_stack_push (stack, node->left); |
| 1331 | 1331 | ||
| 1332 | if (pos < node->begin) | 1332 | if (pos < node->begin) |
| 1333 | node->begin = max (pos, node->begin - length); | 1333 | node->begin = max (pos, node->begin - length); |
| @@ -1335,10 +1335,10 @@ itree_delete_gap (struct itree_tree *tree, | |||
| 1335 | { | 1335 | { |
| 1336 | node->end = max (pos , node->end - length); | 1336 | node->end = max (pos , node->end - length); |
| 1337 | eassert (node != NULL); | 1337 | eassert (node != NULL); |
| 1338 | interval_tree_propagate_limit (node); | 1338 | itree_propagate_limit (node); |
| 1339 | } | 1339 | } |
| 1340 | } | 1340 | } |
| 1341 | interval_stack_destroy (stack); | 1341 | itree_stack_destroy (stack); |
| 1342 | } | 1342 | } |
| 1343 | 1343 | ||
| 1344 | 1344 | ||
| @@ -1356,7 +1356,7 @@ itree_delete_gap (struct itree_tree *tree, | |||
| 1356 | a NODE2 strictly bigger than NODE1 should also be included). */ | 1356 | a NODE2 strictly bigger than NODE1 should also be included). */ |
| 1357 | 1357 | ||
| 1358 | static inline bool | 1358 | static inline bool |
| 1359 | interval_node_intersects (const struct itree_node *node, | 1359 | itree_node_intersects (const struct itree_node *node, |
| 1360 | ptrdiff_t begin, ptrdiff_t end) | 1360 | ptrdiff_t begin, ptrdiff_t end) |
| 1361 | { | 1361 | { |
| 1362 | return (begin < node->end && node->begin < end) | 1362 | return (begin < node->end && node->begin < end) |
| @@ -1388,7 +1388,7 @@ itree_iterator_next (struct itree_iterator *g) | |||
| 1388 | { | 1388 | { |
| 1389 | nodeptr_and_flag nav; | 1389 | nodeptr_and_flag nav; |
| 1390 | bool visited; | 1390 | bool visited; |
| 1391 | while ((nav = interval_stack_pop (g->stack), | 1391 | while ((nav = itree_stack_pop (g->stack), |
| 1392 | node = nav_nodeptr (nav), | 1392 | node = nav_nodeptr (nav), |
| 1393 | visited = nav_flag (nav), | 1393 | visited = nav_flag (nav), |
| 1394 | node && !visited)) | 1394 | node && !visited)) |
| @@ -1396,40 +1396,40 @@ itree_iterator_next (struct itree_iterator *g) | |||
| 1396 | struct itree_node *const left = node->left; | 1396 | struct itree_node *const left = node->left; |
| 1397 | struct itree_node *const right = node->right; | 1397 | struct itree_node *const right = node->right; |
| 1398 | 1398 | ||
| 1399 | interval_tree_inherit_offset (g->otick, node); | 1399 | itree_inherit_offset (g->otick, node); |
| 1400 | eassert (itree_limit_is_stable (node)); | 1400 | eassert (itree_limit_is_stable (node)); |
| 1401 | switch (g->order) | 1401 | switch (g->order) |
| 1402 | { | 1402 | { |
| 1403 | case ITREE_ASCENDING: | 1403 | case ITREE_ASCENDING: |
| 1404 | if (right != null && node->begin <= g->end) | 1404 | if (right != null && node->begin <= g->end) |
| 1405 | interval_stack_push_flagged (g->stack, right, false); | 1405 | itree_stack_push_flagged (g->stack, right, false); |
| 1406 | if (interval_node_intersects (node, g->begin, g->end)) | 1406 | if (itree_node_intersects (node, g->begin, g->end)) |
| 1407 | interval_stack_push_flagged (g->stack, node, true); | 1407 | itree_stack_push_flagged (g->stack, node, true); |
| 1408 | /* Node's children may still be off-set and we need to add it. */ | 1408 | /* Node's children may still be off-set and we need to add it. */ |
| 1409 | if (left != null && g->begin <= left->limit + left->offset) | 1409 | if (left != null && g->begin <= left->limit + left->offset) |
| 1410 | interval_stack_push_flagged (g->stack, left, false); | 1410 | itree_stack_push_flagged (g->stack, left, false); |
| 1411 | break; | 1411 | break; |
| 1412 | case ITREE_DESCENDING: | 1412 | case ITREE_DESCENDING: |
| 1413 | if (left != null && g->begin <= left->limit + left->offset) | 1413 | if (left != null && g->begin <= left->limit + left->offset) |
| 1414 | interval_stack_push_flagged (g->stack, left, false); | 1414 | itree_stack_push_flagged (g->stack, left, false); |
| 1415 | if (interval_node_intersects (node, g->begin, g->end)) | 1415 | if (itree_node_intersects (node, g->begin, g->end)) |
| 1416 | interval_stack_push_flagged (g->stack, node, true); | 1416 | itree_stack_push_flagged (g->stack, node, true); |
| 1417 | if (right != null && node->begin <= g->end) | 1417 | if (right != null && node->begin <= g->end) |
| 1418 | interval_stack_push_flagged (g->stack, right, false); | 1418 | itree_stack_push_flagged (g->stack, right, false); |
| 1419 | break; | 1419 | break; |
| 1420 | case ITREE_PRE_ORDER: | 1420 | case ITREE_PRE_ORDER: |
| 1421 | if (right != null && node->begin <= g->end) | 1421 | if (right != null && node->begin <= g->end) |
| 1422 | interval_stack_push_flagged (g->stack, right, false); | 1422 | itree_stack_push_flagged (g->stack, right, false); |
| 1423 | if (left != null && g->begin <= left->limit + left->offset) | 1423 | if (left != null && g->begin <= left->limit + left->offset) |
| 1424 | interval_stack_push_flagged (g->stack, left, false); | 1424 | itree_stack_push_flagged (g->stack, left, false); |
| 1425 | if (interval_node_intersects (node, g->begin, g->end)) | 1425 | if (itree_node_intersects (node, g->begin, g->end)) |
| 1426 | interval_stack_push_flagged (g->stack, node, true); | 1426 | itree_stack_push_flagged (g->stack, node, true); |
| 1427 | break; | 1427 | break; |
| 1428 | } | 1428 | } |
| 1429 | } | 1429 | } |
| 1430 | /* Node may have been invalidated by itree_iterator_narrow | 1430 | /* Node may have been invalidated by itree_iterator_narrow |
| 1431 | after it was pushed: Check if it still intersects. */ | 1431 | after it was pushed: Check if it still intersects. */ |
| 1432 | } while (node && ! interval_node_intersects (node, g->begin, g->end)); | 1432 | } while (node && ! itree_node_intersects (node, g->begin, g->end)); |
| 1433 | 1433 | ||
| 1434 | return node; | 1434 | return node; |
| 1435 | } | 1435 | } |