]> git.eshelyaron.com Git - emacs.git/commitdiff
(itree_insert_gap, itree_delete_gap): Minor optimization
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 7 Nov 2022 05:38:43 +0000 (00:38 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 7 Nov 2022 05:38:43 +0000 (00:38 -0500)
`limit` can get smaller in either of the two children of a node.
It can also happen that the root node itself has a low enough limit
that the loop can be interrupted right away.

The previous code only checked `limit` when going down to a left
child, which is not wrong, but tests suggest that it is also very
common to reach this limit when going to a right child, so move the
test accordingly.

* src/itree.c (itree_insert_gap, itree_delete_gap): Check `limit` for
all nodes, rather than only when following a `left` pointer.

src/itree.c

index d73fbffd2b6e5ef5cdc00be1f6ee780c4e8fe368..989173db4e59ff0277775f7044249b2203128ea0 100644 (file)
@@ -1240,6 +1240,8 @@ itree_insert_gap (struct itree_tree *tree,
        {
          /* Process in pre-order. */
          interval_tree_inherit_offset (tree->otick, node);
+         if (pos > node->limit)
+           continue;
          if (node->right != NULL)
            {
              if (node->begin > pos)
@@ -1251,8 +1253,7 @@ itree_insert_gap (struct itree_tree *tree,
              else
                interval_stack_push (stack, node->right);
            }
-         if (node->left != NULL
-             && pos <= node->left->limit + node->left->offset)
+         if (node->left != NULL)
            interval_stack_push (stack, node->left);
 
          if (before_markers
@@ -1312,6 +1313,8 @@ itree_delete_gap (struct itree_tree *tree,
     {
       node = nav_nodeptr (nav);
       interval_tree_inherit_offset (tree->otick, node);
+      if (pos > node->limit)
+       continue;
       if (node->right != NULL)
        {
          if (node->begin > pos + length)
@@ -1323,8 +1326,7 @@ itree_delete_gap (struct itree_tree *tree,
          else
            interval_stack_push (stack, node->right);
        }
-      if (node->left != NULL
-         && pos <= node->left->limit + node->left->offset)
+      if (node->left != NULL)
        interval_stack_push (stack, node->left);
 
       if (pos < node->begin)