From 353d2d4cc9a57402172c857c4b9864dff74849ef Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Tue, 10 Apr 2018 23:23:36 +0200 Subject: [PATCH 1/2] Fix issue in copy of B*TREE: the _next field wasn't properly set for the deepest nodes. --- m-bptree.h | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/m-bptree.h b/m-bptree.h index 4d5b21e9..d1fcdc4c 100644 --- a/m-bptree.h +++ b/m-bptree.h @@ -204,7 +204,7 @@ b->root = NULL; \ } \ \ - static inline node_t M_C(name, _copy_node)(const node_t o) \ + static inline node_t M_C(name, _copy_node)(const node_t o, const node_t root) \ { \ node_t n = M_C(name, _new_node)(); \ n->num = o->num; \ @@ -221,12 +221,21 @@ ,) \ } else { \ for(int i = 0; i <= num; i++) { \ - n->kind.node[i] = M_C(name, _copy_node)(o->kind.node[i]); \ + n->kind.node[i] = M_C(name, _copy_node)(o->kind.node[i], root); \ } \ for(int i = 0; i < num; i++) { \ - n->kind.node[i]->next = n->kind.node[i+1]; \ + node_t current = n->kind.node[i]; \ + node_t next = n->kind.node[i+1]; \ + current->next = next; \ + while (!M_C(name, _is_leaf)(current)) { \ + assert(!M_C(name, _is_leaf)(next)); \ + current = current->kind.node[current->num]; \ + next = next->kind.node[0]; \ + current->next = next; \ + } \ } \ } \ + BPTREEI_NODE_CONTRACT(N, key_oplist, n, (o==root) ? n : root); \ return n; \ } \ \ @@ -234,7 +243,7 @@ { \ BPTREEI_CONTRACT(N, key_oplist, o); \ assert (b != NULL); \ - b->root = M_C(name, _copy_node)(o->root); \ + b->root = M_C(name, _copy_node)(o->root, o->root); \ b->size = o->size; \ BPTREEI_CONTRACT(N, key_oplist, b); \ } \ @@ -837,7 +846,7 @@ if (!M_GET_EQUAL value_oplist (*ref1->value_ptr, *ref2->value_ptr)) \ return false; \ , \ - if (M_GET_EQUAL key_oplist (*ref1, *ref2) == false) \ + if (!M_GET_EQUAL key_oplist (*ref1, *ref2)) \ return false; \ ) \ M_C(name, _next)(it1); \ From 654521b74c9f5d957bfffdcb5ac308554d6e4269 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Tue, 10 Apr 2018 23:25:04 +0200 Subject: [PATCH 2/2] Add some tests of _equal_p --- tests/test-mbptree.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test-mbptree.c b/tests/test-mbptree.c index 55c1f1cc..87fa3cef 100644 --- a/tests/test-mbptree.c +++ b/tests/test-mbptree.c @@ -204,10 +204,12 @@ static void test4(void) btree_set_at(b1, i, 1000*i); assert(btree_size(b1) == 1000); btree_init_set(b2, b1); - assert(btree_size(b2) == 1000); + assert (btree_size(b2) == 1000); + assert (btree_equal_p(b1, b2)); for(int i = 0; i < 1000; i++) { bool r = btree_remove(b2, i); assert (r == true); + assert (!btree_equal_p(b1, b2)); } assert(btree_size(b2) == 0); @@ -216,6 +218,7 @@ static void test4(void) assert(btree_size(b2) == 5000); btree_set(b2, b1); assert(btree_size(b2) == 1000); + assert (btree_equal_p(b1, b2)); for(int i = 0; i < 1000; i++) { bool r = btree_remove(b2, i); assert (r == true); @@ -224,6 +227,7 @@ static void test4(void) btree_set(b1, b2); assert(btree_size(b1) == 0); + assert (btree_equal_p(b1, b2)); btree_clear(b1); btree_clear(b2);