aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-10-29 08:47:16 +0800
committerPo Lu2022-10-29 08:47:16 +0800
commit7ca456da7f72feeeec571ece3c373e2b3a3d327b (patch)
treed767d8a50694441012dff3b85c7876f29f6d7466 /src
parent8562a23fc6a382367351a1471d8585279d12605a (diff)
downloademacs-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.c411
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
207static inline void 206static inline void
208interval_stack_push_flagged (struct interval_stack *stack, 207interval_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
295struct check_subtree_result 296struct 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
302static struct check_subtree_result 308static struct check_subtree_result
303check_subtree (struct itree_node *node, 309check_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*/
371static bool 377static bool
372check_tree (struct itree_tree *tree, 378check_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)
477static void 483static void
478interval_tree_propagate_limit (struct itree_node *node) 484interval_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
494static struct itree_node* 504static struct itree_node*
@@ -512,8 +522,8 @@ interval_tree_validate (struct itree_tree *tree, struct itree_node *node)
512 522
513void 523void
514itree_node_init (struct itree_node *node, 524itree_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
530ptrdiff_t 540ptrdiff_t
531itree_node_begin (struct itree_tree *tree, 541itree_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
540ptrdiff_t 550ptrdiff_t
541itree_node_end (struct itree_tree *tree, 551itree_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
550struct itree_tree* 560struct itree_tree *
551itree_create (void) 561itree_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
604static void 614static void
605interval_tree_rotate_left (struct itree_tree *tree, 615interval_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
647static void 657static void
648interval_tree_rotate_right (struct itree_tree *tree, 658interval_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
686static void 696static void
687interval_tree_insert_fix (struct itree_tree *tree, 697interval_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
823void 833void
824itree_insert (struct itree_tree *tree, struct itree_node *node, 834itree_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
835void 845void
836itree_node_set_region (struct itree_tree *tree, 846itree_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
897static void 907static void
898interval_tree_remove_fix (struct itree_tree *tree, 908interval_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`. */
1015static void 1025static void
1016interval_tree_replace_child (struct itree_tree *tree, 1026interval_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`. */
1041static void 1051static void
1042interval_tree_transplant (struct itree_tree *tree, 1052interval_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
1139struct itree_iterator * 1149struct itree_iterator *
1140itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin, 1150itree_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
1185void 1195void
1186itree_insert_gap (struct itree_tree *tree, 1196itree_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
1269void 1279void
1270itree_delete_gap (struct itree_tree *tree, 1280itree_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
1331static inline bool 1341static inline bool
1332interval_node_intersects (const struct itree_node *node, 1342interval_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
1412void 1423void
1413itree_iterator_narrow (struct itree_iterator *g, 1424itree_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);