emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/noverlay 009249e0c6: Remove the per-tree null node


From: Gerd Moellmann
Subject: feature/noverlay 009249e0c6: Remove the per-tree null node
Date: Fri, 30 Sep 2022 07:29:48 -0400 (EDT)

branch: feature/noverlay
commit 009249e0c6d3bb6c4a3714a279ae91807d133c77
Author: Gerd Möllmann <gerd@gnu.org>
Commit: Gerd Möllmann <gerd@gnu.org>

    Remove the per-tree null node
    
    "make check" shows 0 unexpcted.
    
    * src/itree.h (itree_null): Declare extern.
    (ITREE_NULL): New macro
    (struct interval_tree): Remove null member.
    * src/alloc.c (mark_overlays): Use ITREE_NULL.
    * src/itree.c: Use ITREE_NULL insteads of a tree's null.
    * src/pdumper.c (dump_buffer): Use ITREE_NULL.
---
 src/alloc.c   |  2 +-
 src/itree.c   | 81 +++++++++++++++++++++++++++++++++++------------------------
 src/itree.h   |  5 +++-
 src/pdumper.c |  3 +--
 4 files changed, 54 insertions(+), 37 deletions(-)

diff --git a/src/alloc.c b/src/alloc.c
index 8dc45659b5..db8f39a60e 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -6519,7 +6519,7 @@ mark_overlays (struct interval_tree *it, struct 
interval_node *in)
      they use the `null` node instead when the overlay is not deleted
      (i.e. is within an overlay tree).  */
   eassert (in);
-  if (in == &it->null)
+  if (in == ITREE_NULL)
     return;
 
   mark_object (in->data);
diff --git a/src/itree.c b/src/itree.c
index 3b354b5640..6d97dd2a71 100644
--- a/src/itree.c
+++ b/src/itree.c
@@ -119,6 +119,14 @@ static inline struct interval_node*
 interval_generator_next (struct interval_generator *g);
 static inline void interval_tree_iter_ensure_space (struct interval_tree *);
 
+/* The sentinel node, the null node.  */
+struct interval_node itree_null;
+
+static void
+init_itree_null (void)
+{
+  itree_null.parent = itree_null.left = itree_null.right = ITREE_NULL;
+}
 
 
 /* 
+------------------------------------------------------------------------------------+
 */
@@ -302,6 +310,11 @@ interval_node_set_region (struct interval_tree *tree,
 struct interval_tree*
 interval_tree_create (void)
 {
+  /* FIXME?  Maybe avoid the initialization of itree_null in the same
+     way that is used to call mem_init in alloc.c?  It's not really
+     important though.  */
+  init_itree_null ();
+
   struct interval_tree *tree = xmalloc (sizeof (*tree));
   interval_tree_clear (tree);
   tree->iter = interval_generator_create (tree);
@@ -313,13 +326,15 @@ interval_tree_create (void)
 void
 interval_tree_clear (struct interval_tree *tree)
 {
-  struct interval_node *null = &tree->null;
+  /* FIXME: Why is this done?  */
+  struct interval_node *null = ITREE_NULL;
   null->left = null->right = null->parent = null;
   null->offset = null->otick = 0;
   null->begin = PTRDIFF_MIN;
   null->end = PTRDIFF_MIN;
   null->limit = PTRDIFF_MIN;     /* => max(x, null.limit) = x */
   null->red = false;
+
   tree->root = null;
   tree->otick = 1;
   tree->size = 0;
@@ -364,15 +379,15 @@ interval_tree_size (struct interval_tree *tree)
 void
 interval_tree_insert (struct interval_tree *tree, struct interval_node *node)
 {
-  eassert (node && node->begin <= node->end && node != &tree->null);
+  eassert (node && node->begin <= node->end && node != ITREE_NULL);
 
-  struct interval_node *parent = &tree->null;
+  struct interval_node *parent = ITREE_NULL;
   struct interval_node *child = tree->root;
   ptrdiff_t offset = 0;
 
   /* Find the insertion point, accumulate node's offset and update
      ancestors limit values. */
-  while (child != &tree->null)
+  while (child != ITREE_NULL)
     {
       parent = child;
       offset += child->offset;
@@ -383,7 +398,7 @@ interval_tree_insert (struct interval_tree *tree, struct 
interval_node *node)
     }
 
   /* Insert the node */
-  if (parent == &tree->null)
+  if (parent == ITREE_NULL)
     tree->root = node;
   else if (node->begin <= parent->begin)
     parent->left = node;
@@ -392,8 +407,8 @@ interval_tree_insert (struct interval_tree *tree, struct 
interval_node *node)
 
   /* Init the node */
   node->parent = parent;
-  node->left = &tree->null;
-  node->right = &tree->null;
+  node->left = ITREE_NULL;
+  node->right = ITREE_NULL;
   node->red = true;
   node->offset = 0;
   node->begin -= offset;
@@ -433,10 +448,10 @@ interval_tree_remove (struct interval_tree *tree, struct 
interval_node *node)
   struct interval_node *broken = NULL;
 
   interval_tree_inherit_offset (tree, node);
-  if (node->left == &tree->null || node->right == &tree->null)
+  if (node->left == ITREE_NULL || node->right == ITREE_NULL)
     {
-      struct interval_node *subst =
-        (node->right == &tree->null) ? node->left : node->right;
+      struct interval_node *subst
+       = node->right == ITREE_NULL ? node->left : node->right;
       if (!node->red)
         broken = subst;
       interval_tree_transplant (tree, subst, node);
@@ -472,7 +487,7 @@ interval_tree_remove (struct interval_tree *tree, struct 
interval_node *node)
   node->right = node->left = node->parent = NULL;
   --tree->size;
 
-  eassert (tree->size == 0 || (tree->size > 0 && tree->root != &tree->null));
+  eassert (tree->size == 0 || (tree->size > 0 && tree->root != ITREE_NULL));
 
   return node;
 }
@@ -481,7 +496,7 @@ static struct interval_node*
 interval_tree_validate (struct interval_tree *tree, struct interval_node *node)
 {
 
-  if (tree->otick == node->otick || node == &tree->null)
+  if (tree->otick == node->otick || node == ITREE_NULL)
     return node;
   if (node != tree->root)
     interval_tree_validate (tree, node->parent);
@@ -625,7 +640,7 @@ interval_tree_insert_gap (struct interval_tree *tree, 
ptrdiff_t pos, ptrdiff_t l
     {
       /* Process in pre-order. */
       interval_tree_inherit_offset (tree, node);
-      if (node->right != &tree->null)
+      if (node->right != ITREE_NULL)
         {
           if (node->begin > pos)
             {
@@ -636,7 +651,7 @@ interval_tree_insert_gap (struct interval_tree *tree, 
ptrdiff_t pos, ptrdiff_t l
           else
             interval_stack_push (stack, node->right);
         }
-      if (node->left != &tree->null
+      if (node->left != ITREE_NULL
           && pos <= node->left->limit + node->left->offset)
         interval_stack_push (stack, node->left);
 
@@ -688,7 +703,7 @@ interval_tree_delete_gap (struct interval_tree *tree, 
ptrdiff_t pos, ptrdiff_t l
     {
       node = nav_nodeptr (nav);
       interval_tree_inherit_offset (tree, node);
-      if (node->right != &tree->null)
+      if (node->right != ITREE_NULL)
         {
           if (node->begin > pos + length)
             {
@@ -699,7 +714,7 @@ interval_tree_delete_gap (struct interval_tree *tree, 
ptrdiff_t pos, ptrdiff_t l
           else
             interval_stack_push (stack, node->right);
         }
-      if (node->left != &tree->null
+      if (node->left != ITREE_NULL
           && pos <= node->left->limit + node->left->offset)
         interval_stack_push (stack, node->left);
 
@@ -783,7 +798,7 @@ interval_generator_next (struct interval_generator *g)
 {
   if (! g) return NULL;
 
-  struct interval_node * const null = &g->tree->null;
+  struct interval_node * const null = ITREE_NULL;
   struct interval_node *node;
 
   /* The `visited` flag stored in each node is used here (and only here):
@@ -879,7 +894,7 @@ static void
 interval_tree_update_limit (const struct interval_tree *tree,
                             struct interval_node *node)
 {
-  if (node == &tree->null)
+  if (node == ITREE_NULL)
     return;
 
   node->limit = max (node->end, max (node->left->limit + node->left->offset,
@@ -903,9 +918,9 @@ interval_tree_inherit_offset (const struct interval_tree 
*tree,
   node->begin += node->offset;
   node->end += node->offset;
   node->limit += node->offset;
-  if (node->left != &tree->null)
+  if (node->left != ITREE_NULL)
     node->left->offset += node->offset;
-  if (node->right != &tree->null)
+  if (node->right != ITREE_NULL)
     node->right->offset += node->offset;
   node->offset = 0;
   if (node == tree->root || node->parent->otick == tree->otick)
@@ -923,9 +938,9 @@ static void
 interval_tree_propagate_limit (const struct interval_tree *tree,
                                struct interval_node *node)
 {
-  if (node == &tree->null)
+  if (node == ITREE_NULL)
     node = node->parent;
-  if (node == &tree->null)
+  if (node == ITREE_NULL)
     return;
 
   while (1) {
@@ -945,7 +960,7 @@ interval_tree_propagate_limit (const struct interval_tree 
*tree,
 static void
 interval_tree_rotate_left (struct interval_tree *tree, struct interval_node 
*node)
 {
-  eassert (node->right != &tree->null);
+  eassert (node->right != ITREE_NULL);
 
   struct interval_node *right = node->right;
 
@@ -954,11 +969,11 @@ interval_tree_rotate_left (struct interval_tree *tree, 
struct interval_node *nod
 
   /* Turn right's left subtree into node's right subtree.  */
   node->right = right->left;
-  if (right->left != &tree->null)
+  if (right->left != ITREE_NULL)
     right->left->parent = node;
 
   /* right's parent was node's parent.  */
-  if (right != &tree->null)
+  if (right != ITREE_NULL)
     right->parent = node->parent;
 
   /* Get the parent to point to right instead of node.  */
@@ -974,7 +989,7 @@ interval_tree_rotate_left (struct interval_tree *tree, 
struct interval_node *nod
 
   /* Put node on right's left.  */
   right->left = node;
-  if (node != &tree->null)
+  if (node != ITREE_NULL)
     node->parent = right;
 
   /* Order matters here. */
@@ -987,7 +1002,7 @@ interval_tree_rotate_left (struct interval_tree *tree, 
struct interval_node *nod
 static void
 interval_tree_rotate_right (struct interval_tree *tree, struct interval_node 
*node)
 {
-  eassert (tree && node && node->left != &tree->null);
+  eassert (tree && node && node->left != ITREE_NULL);
 
   struct interval_node *left = node->left;
 
@@ -995,10 +1010,10 @@ interval_tree_rotate_right (struct interval_tree *tree, 
struct interval_node *no
   interval_tree_inherit_offset (tree, left);
 
   node->left = left->right;
-  if (left->right != &tree->null)
+  if (left->right != ITREE_NULL)
     left->right->parent = node;
 
-  if (left != &tree->null)
+  if (left != ITREE_NULL)
     left->parent = node->parent;
   if (node != tree->root)
     {
@@ -1011,7 +1026,7 @@ interval_tree_rotate_right (struct interval_tree *tree, 
struct interval_node *no
     tree->root = left;
 
   left->right = node;
-  if (node != &tree->null)
+  if (node != ITREE_NULL)
     node->parent = left;
 
   interval_tree_update_limit (tree, left);
@@ -1180,7 +1195,7 @@ static void
 interval_tree_transplant (struct interval_tree *tree, struct interval_node 
*source,
                           struct interval_node *dest)
 {
-  eassert (tree && source && dest && dest != &tree->null);
+  eassert (tree && source && dest && dest != ITREE_NULL);
 
   if (dest == tree->root)
     tree->root = source;
@@ -1196,9 +1211,9 @@ interval_tree_transplant (struct interval_tree *tree, 
struct interval_node *sour
 static struct interval_node*
 interval_tree_subtree_min (const struct interval_tree *tree, struct 
interval_node *node)
 {
-  if (node == &tree->null)
+  if (node == ITREE_NULL)
     return node;
-  while (node->left != &tree->null)
+  while (node->left != ITREE_NULL)
     node = node->left;
   return node;
 }
diff --git a/src/itree.h b/src/itree.h
index f24b12fcf6..f1ef7f9946 100644
--- a/src/itree.h
+++ b/src/itree.h
@@ -50,10 +50,13 @@ struct interval_node
   bool_bf front_advance : 1;    /* Same as for marker and overlays.  */
 };
 
+/* The sentinel node, the null node.  */
+extern struct interval_node itree_null;
+#define ITREE_NULL (&itree_null)
+
 struct interval_tree
 {
   struct interval_node *root;
-  struct interval_node null;    /* The tree's version of NULL. */
   uintmax_t otick;              /* offset tick, compared with node's otick. */
   intmax_t size;                /* Number of nodes in the tree. */
   struct interval_generator *iter;
diff --git a/src/pdumper.c b/src/pdumper.c
index 4c057117b4..e39f5f1109 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2863,8 +2863,7 @@ dump_buffer (struct dump_context *ctx, const struct 
buffer *in_buffer)
   DUMP_FIELD_COPY (out, buffer, inhibit_buffer_hooks);
   DUMP_FIELD_COPY (out, buffer, long_line_optimizations_p);
 
-  if (buffer->overlays
-      && (buffer->overlays->root != &buffer->overlays->null))
+  if (buffer->overlays && buffer->overlays->root != ITREE_NULL)
     /* We haven't implemented the code to dump overlays.  */
     emacs_abort ();
   else



reply via email to

[Prev in Thread] Current Thread [Next in Thread]