[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
feature/noverlay a154259bfa 3/5: Simplify itree_null initialization
From: |
Stefan Monnier |
Subject: |
feature/noverlay a154259bfa 3/5: Simplify itree_null initialization |
Date: |
Tue, 11 Oct 2022 11:17:52 -0400 (EDT) |
branch: feature/noverlay
commit a154259bfacf7f1406794a952e80a8197b9a83fb
Author: Matt Armstrong <matt@rfc20.org>
Commit: Matt Armstrong <matt@rfc20.org>
Simplify itree_null initialization
* src/itree.c (null_is_sane): call eassert directly, check
REAR_ADVANCE, FRONT_ADVANCE. Add FIXME that PARENT is still
read/write.
(itree_null): initialize statically
(itree_init): remove initialization code, call eassert(null_is_sane())
(check_tree_common): call eassert (null_is_sane())
---
src/itree.c | 52 ++++++++++++++++++++++++++++++++++++----------------
1 file changed, 36 insertions(+), 16 deletions(-)
diff --git a/src/itree.c b/src/itree.c
index 7ac400398b..d9f9ec8cd6 100644
--- a/src/itree.c
+++ b/src/itree.c
@@ -145,19 +145,42 @@ static struct interval_generator*
interval_generator_create (struct interval_tre
static void interval_tree_insert (struct interval_tree *, struct interval_node
*);
/* The sentinel node, the null node. */
-struct interval_node itree_null;
+struct interval_node itree_null = {
+ .parent = &itree_null,
+ .left = &itree_null,
+ .right = &itree_null,
+ .begin = PTRDIFF_MIN,
+ .end = PTRDIFF_MIN,
+ .limit = PTRDIFF_MIN, /* => max(x, null.limit) = x */
+ .offset = 0,
+ .otick = 0,
+ .red = false,
+ .rear_advance = false,
+ .front_advance = false,
+};
static bool
null_is_sane (void)
{
- /* The sentinel node has most of its fields read-only, except for `parent`,
- `left`, `right` which are write only. */
- return itree_null.red == false
- && itree_null.otick == 0
- && itree_null.offset == 0
- && itree_null.begin == PTRDIFF_MIN
- && itree_null.end == PTRDIFF_MIN
- && itree_null.limit == PTRDIFF_MIN;
+ /* The sentinel node has most of its fields read-only.
+
+ FIXME: PARENT is still read/write. It is written to
+ ininterval_tree_transplant, and later read. --matt
+ */
+ /* eassert (itree_null.parent == &itree_null); */
+ eassert (itree_null.left == &itree_null);
+ eassert (itree_null.right == &itree_null);
+ eassert (itree_null.begin == PTRDIFF_MIN);
+ eassert (itree_null.end == PTRDIFF_MIN);
+ eassert (itree_null.limit == PTRDIFF_MIN);
+ eassert (itree_null.offset == 0);
+ eassert (itree_null.otick == 0);
+ eassert (itree_null.red == false);
+ eassert (itree_null.rear_advance == false);
+ eassert (itree_null.front_advance == false);
+
+ /* if we get this far things must be good */
+ return true;
}
/*
+------------------------------------------------------------------------------------+
*/
@@ -195,13 +218,8 @@ static struct interval_generator *iter;
static void
itree_init (void)
{
- 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;
+ eassert (null_is_sane ());
+
iter = interval_generator_create (NULL);
}
@@ -327,6 +345,8 @@ static bool
check_tree_common (struct interval_tree *tree,
bool check_red_black_invariants)
{
+ eassert (null_is_sane ());
+
eassert (tree != NULL);
eassert (tree->size >= 0);
eassert ((tree->size == 0) == (tree->root == ITREE_NULL));