From 8639fdbd982443be32c548ac96e5491b02ad2a39 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Tue, 18 Apr 2023 22:56:56 +0200 Subject: [PATCH] Fix issue in tree_remove when it is root node (part 1) --- m-tree.h | 4 ++++ tests/test-mtree.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/m-tree.h b/m-tree.h index 0dcf4d7f..473cee41 100644 --- a/m-tree.h +++ b/m-tree.h @@ -759,6 +759,8 @@ typedef int32_t m_tr33_index_t; if (parent >= 0 && it.tree->tab[parent].child == it.index) { \ M_ASSERT(left == M_TR33_NO_NODE); \ it.tree->tab[parent].child = right; \ + } else if (parent == M_TR33_ROOT_NODE) { \ + it.tree->root_index = right; \ } \ } else { \ /* Merge the child with the current siblings */ \ @@ -782,6 +784,8 @@ typedef int32_t m_tr33_index_t; if (parent >= 0 && it.tree->tab[parent].child == it.index) { \ M_ASSERT(left == M_TR33_NO_NODE); \ it.tree->tab[parent].child = child; \ + } else if (parent == M_TR33_ROOT_NODE) { \ + it.tree->root_index = child; \ } \ } \ /* Free the node to the allocator */ \ diff --git a/tests/test-mtree.c b/tests/test-mtree.c index 43c2c98c..1add3923 100644 --- a/tests/test-mtree.c +++ b/tests/test-mtree.c @@ -424,17 +424,42 @@ static void test_gen(void) tree_init_move(t0, t); tree_init_set(t, t0); assert(tree_equal_p(t, t0)); + + tree_set(t, t0); + tree_it_t it; + for(size_t i = 1; i < tree_size(t0); i++) { + it = tree_it(t); + tree_next(&it); + bool b = tree_remove(it); + assert(b); + assert(tree_size(t)== tree_size(t0) - i); + } + bool b = tree_remove(tree_it(t)); + assert(b); + assert(tree_size(t)== 0); + + tree_set(t, t0); + for(size_t i = 1; i < tree_size(t0); i++) { + it = tree_it(t); + b = tree_remove(it); + assert(b); + assert(tree_size(t)== tree_size(t0) - i); + } + b = tree_remove(tree_it(t)); + assert(b); + assert(tree_size(t)== 0); + for(size_t i = 0; i < tree_size(t0); i++) { tree_set(t, t0); size_t j = 0; - for(tree_it_t it = tree_it(t); j <= i && !tree_end_p(it); tree_next(&it), j++) { + for(it = tree_it(t); j <= i && !tree_end_p(it); tree_next(&it), j++) { if (i ==j) *tree_ref(it) = 147852369; } assert(!tree_equal_p(t, t0)); tree_set(t, t0); j = 0; - for(tree_it_t it = tree_it(t); j <= i && !tree_end_p(it); tree_next(&it), j++) { + for(it = tree_it(t); j <= i && !tree_end_p(it); tree_next(&it), j++) { if (i ==j) tree_remove(it); } @@ -442,6 +467,7 @@ static void test_gen(void) assert(!tree_equal_p(t, t0)); assert(!tree_equal_p(t0, t)); } + tree_move(t, t0); tree_clear(t); }