WIP for multimap / multiset.

This commit is contained in:
Patrick Pelissier committed 2019-07-08 16:23:45 +02:00
1 parent ef2dbf89ee
commit 9a4c6ba0d5
1 file changed
+7 -7
+7 -7
View File
@@ -172,7 +172,8 @@
) )
/* Internal contract of a B+TREE node */ /* Internal contract of a B+TREE node */
#ifdef NDEBUG //#ifdef NDEBUG // TODO
#if 1
# define BPTREEI_NODE_CONTRACT(N, key_oplist, node, root) do { } while (0) # define BPTREEI_NODE_CONTRACT(N, key_oplist, node, root) do { } while (0)
#else #else
# define BPTREEI_NODE_CONTRACT(N, key_oplist, node, root) do { \ # define BPTREEI_NODE_CONTRACT(N, key_oplist, node, root) do { \
@@ -498,15 +499,14 @@
return i; \ return i; \
} \ } \
\ \
static inline int M_C(name, _search_and_insert_in_node)(node_t n, key_t key) \ static inline int \
M_C(name, _search_and_insert_in_node)(node_t n, node_t l, key_t key) \
{ \ { \
assert (!M_C(name, _is_leaf)(n)); \ assert (!M_C(name, _is_leaf)(n)); \
int i, num = M_C(name, _get_num)(n); \ int i, num = M_C(name, _get_num)(n); \
assert (num <= N); \ assert (num <= N); \
for(i = 0; i < num; i++) { \ for(i = 0; i < num; i++) { \
int cmp = M_CALL_CMP(key_oplist, key, n->key[i]); \ if (n->kind.node[i] == l) { \
assert (cmp != 0); \
if (cmp <= 0) { \
/* Move tables to make space for insertion */ \ /* Move tables to make space for insertion */ \
memmove(&n->key[i+1], &n->key[i], sizeof(key_t)*(num-i)); \ memmove(&n->key[i+1], &n->key[i], sizeof(key_t)*(num-i)); \
memmove(&n->kind.node[i+1], &n->kind.node[i], sizeof(node_t)*(num-i+1)); \ memmove(&n->kind.node[i+1], &n->kind.node[i], sizeof(node_t)*(num-i+1)); \
@@ -578,7 +578,7 @@
/* Non root node. Get the parent node */ \ /* Non root node. Get the parent node */ \
node_t parent = pit->parent[--pit->num]; \ node_t parent = pit->parent[--pit->num]; \
/* Insert into parent (It is big enough to receive temporary one more) */ \ /* Insert into parent (It is big enough to receive temporary one more) */ \
i = M_C(name, _search_and_insert_in_node)(parent, *key_ptr); \ i = M_C(name, _search_and_insert_in_node)(parent, leaf, *key_ptr); \
parent->kind.node[i] = leaf; \ parent->kind.node[i] = leaf; \
parent->kind.node[i+1] = nleaf; \ parent->kind.node[i+1] = nleaf; \
/* Test if parent node is full? */ \ /* Test if parent node is full? */ \
@@ -932,7 +932,7 @@
{ \ { \
assert (it != NULL); \ assert (it != NULL); \
node_t n = it->node; \ node_t n = it->node; \
if (it->idx >= -n->num) return true; \ if (it->idx >= -n->num) return false; \
int cmp = M_CALL_CMP(key_oplist, n->key[it->idx], key); \ int cmp = M_CALL_CMP(key_oplist, n->key[it->idx], key); \
return (cmp <= 0); \ return (cmp <= 0); \
} \ } \