WIP for multimap / multiset.
This commit is contained in:
1 parent
ef2dbf89ee
commit
9a4c6ba0d5
1 file changed
+7
-7
+7
-7
@@ -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); \
|
||||||
} \
|
} \
|
||||||
|
|||||||
Reference in new issue
Block a user