aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2022-11-16 16:35:10 -0500
committerStefan Monnier2022-11-16 16:35:10 -0500
commitf696d27d1ca8e5fe72cd2cd305f5c00b906a00b1 (patch)
tree23e51a843346c3424cc0caab6bf812af3f86fb16 /src
parent1772d88c1fa811eee235ba9b8b7584bb000ac293 (diff)
downloademacs-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.c228
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. */
158struct interval_stack 158struct 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
167static struct interval_stack* 167static struct itree_stack*
168interval_stack_create (intmax_t initial_size) 168itree_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
177static void 177static void
178interval_stack_destroy (struct interval_stack *stack) 178itree_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
187static void 187static void
188interval_stack_clear (struct interval_stack *stack) 188itree_stack_clear (struct itree_stack *stack)
189{ 189{
190 stack->length = 0; 190 stack->length = 0;
191} 191}
192 192
193static inline void 193static inline void
194interval_stack_ensure_space (struct interval_stack *stack, uintmax_t nelements) 194itree_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
206static inline void 206static inline void
207interval_stack_push_flagged (struct interval_stack *stack, 207itree_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
224static inline void 224static inline void
225interval_stack_push (struct interval_stack *stack, struct itree_node *node) 225itree_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
230static inline nodeptr_and_flag 230static inline nodeptr_and_flag
231interval_stack_pop (struct interval_stack *stack) 231itree_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. */
242struct itree_iterator 242struct 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
261static struct itree_iterator *iter = NULL; 261static struct itree_iterator *iter = NULL;
262 262
263static int 263static int
264interval_tree_max_height (const struct itree_tree *tree) 264itree_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
440static void 440static void
441interval_tree_update_limit (struct itree_node *node) 441itree_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
455static void 455static void
456interval_tree_inherit_offset (uintmax_t otick, struct itree_node *node) 456itree_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
492static void 492static void
493interval_tree_propagate_limit (struct itree_node *node) 493itree_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
513static struct itree_node* 513static struct itree_node*
514interval_tree_validate (struct itree_tree *tree, struct itree_node *node) 514itree_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
550itree_node_begin (struct itree_tree *tree, 550itree_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
560itree_node_end (struct itree_tree *tree, 560itree_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
590static void 590static void
591interval_tree_init (struct itree_tree *tree) 591itree_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
615static void 615static void
616interval_tree_rotate_left (struct itree_tree *tree, 616itree_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
658static void 658static void
659interval_tree_rotate_right (struct itree_tree *tree, 659itree_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
697static void 697static void
698interval_tree_insert_fix (struct itree_tree *tree, 698itree_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
776static void 776static void
777interval_tree_insert (struct itree_tree *tree, struct itree_node *node) 777itree_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
869static bool 869static bool
870interval_tree_contains (struct itree_tree *tree, struct itree_node *node) 870itree_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
893static struct itree_node* 893static struct itree_node*
894interval_tree_subtree_min (uintmax_t otick, struct itree_node *node) 894itree_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
908static void 908static void
909interval_tree_remove_fix (struct itree_tree *tree, 909itree_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`. */
1026static void 1026static void
1027interval_tree_replace_child (struct itree_tree *tree, 1027itree_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`. */
1052static void 1052static void
1053interval_tree_transplant (struct itree_tree *tree, 1053itree_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,
1069struct itree_node* 1069struct itree_node*
1070itree_remove (struct itree_tree *tree, struct itree_node *node) 1070itree_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
1358static inline bool 1358static inline bool
1359interval_node_intersects (const struct itree_node *node, 1359itree_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}