Add macros

BPTREE_DEF2_AS
BPTREE_DEF_AS
BPTREE_MULTI_DEF2_AS
BPTREE_MULTI_DEF_AS
This commit is contained in:
Patrick Pelissier committed 2020-10-03 14:07:14 +02:00
1 parent c180981768
commit c039f07f2d
2 files changed
+115 -29

No files matched your search

+57 -2
View File
@@ -42,6 +42,21 @@
M_END_PROTECTED_CODE
/* Define a B+tree of size 'N' that maps a 'key' to a 'value'
as the given name name_t with its associated functions.
USAGE:
BPTREE_DEF2_AS(name, name_t, it_t, itref_t, N, key_t, key_oplist, value_t, value_oplist)
OR
BPTREE_DEF2_AS(name, name_t, it_t, itref_t, N, key_t, value_t)
*/
#define BPTREE_DEF2_AS(name, name_t, it_t, itref_t, N, key_type, ...) \
M_BEGIN_PROTECTED_CODE \
BPTREEI_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
((name, N, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), 1, 0, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, itref_t ), \
(name, N, key_type, __VA_ARGS__, 1, 0, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, itref_t ))) \
M_END_PROTECTED_CODE
/* Define a B+tree of a given type, of size N.
with its associated functions
USAGE: BPTREE_DEF(name, N, type, [, oplist_of_the_type]) */
@@ -53,6 +68,17 @@
M_END_PROTECTED_CODE
/* Define a B+tree of a given type, of size N.
as the given name name_t with its associated functions
USAGE: BPTREE_DEF_AS(name, name_t, it_t, N, type, [, oplist_of_the_type]) */
#define BPTREE_DEF_AS(name, name_t, it_t, N, ...) \
M_BEGIN_PROTECTED_CODE \
BPTREEI_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
((name, N, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), 0, 0, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, M_C(name, _type_ct) ), \
(name, N, __VA_ARGS__, __VA_ARGS__, 0, 0, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, M_C(name, _type_ct) ))) \
M_END_PROTECTED_CODE
/* Define a B+tree of size 'N' that maps a 'key' to a 'value',
allowing multiple equal keys to exist,
with its associated functions.
@@ -69,6 +95,22 @@
M_END_PROTECTED_CODE
/* Define a B+tree of size 'N' that maps a 'key' to a 'value',
allowing multiple equal keys to exist,
as the given name name_t with its associated functions.
USAGE:
BPTREE_MULTI_DEF2_AS(name, name_t, it_t, itref_t, N, key_t, key_oplist, value_t, value_oplist)
OR
BPTREE_MULTI_DEF2_AS(name, name_t, it_t, itref_t, N, key_t, value_t)
*/
#define BPTREE_MULTI_DEF2_AS(name, name_t, it_t, itref_t, N, key_type, ...) \
M_BEGIN_PROTECTED_CODE \
BPTREEI_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
((name, N, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), 1, 1, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, itref_t ), \
(name, N, key_type, __VA_ARGS__, 1, 1, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, itref_t ))) \
M_END_PROTECTED_CODE
/* Define a B+tree of a given type, of size N.
allowing multiple equal keys to exist,
with its associated functions
@@ -81,8 +123,19 @@
M_BEGIN_PROTECTED_CODE
/* Define a B+tree of a given type, of size N.
allowing multiple equal keys to exist,
as the given name name_t with its associated functions
USAGE: BPTREE_MULTI_DEF_AS(name, name_t, it_t, N, type, [, oplist_of_the_type]) */
#define BPTREE_MULTI_DEF_AS(name, name_t, it_t, N, ...) \
M_BEGIN_PROTECTED_CODE \
BPTREEI_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
((name, N, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), 0, 1, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, M_C(name, _type_ct) ), \
(name, N, __VA_ARGS__, __VA_ARGS__, 0, 1, name_t, M_C(name, _node_ct), M_C(name, _pit_ct), it_t, M_C(name, _type_ct) ))) \
M_BEGIN_PROTECTED_CODE
/* Define the oplist of a rbtree of type (from BPTREE_DEF).
/* Define the oplist of a B+TREE used as a set of type (from BPTREE_DEF).
USAGE: BPTREE_OPLIST(name [, oplist_of_the_type]) */
#define BPTREE_OPLIST(...) \
BPTREEI_KEY_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
@@ -90,7 +143,7 @@
(__VA_ARGS__ )))
/* Define the oplist of a rbtree of type (from BPTREE_DEF2).
/* Define the oplist of a B+TREE used as a map of a key type to a value type (from BPTREE_DEF2).
USAGE: BPTREE_OPLIST2(name[, key_oplist, value_oplist])
NOTE: IT_REF is not exported so that the contained appears as not modifiable
by algorithm.
@@ -120,6 +173,7 @@
#define BPTREEI_KEY_OPLIST_P3(name, oplist) \
(INIT(M_C(name, _init)), \
INIT_SET(M_C(name, _init_set)), \
INIT_WITH(API_1(M_INIT_VAI)), \
SET(M_C(name, _set)), \
CLEAR(M_C(name, _clear)), \
INIT_MOVE(M_C(name, _init_move)), \
@@ -169,6 +223,7 @@
#define BPTREEI_OPLIST2_P4(name, key_oplist, value_oplist) \
(INIT(M_C(name, _init)), \
INIT_SET(M_C(name, _init_set)), \
INIT_WITH(API_1(M_INIT_KEY_VAI)), \
SET(M_C(name, _set)), \
CLEAR(M_C(name, _clear)), \
INIT_MOVE(M_C(name, _init_move)), \
+58 -27
View File
@@ -40,7 +40,16 @@ BPTREE_DEF(btree_myset, 15, testobj_t, TESTOBJ_CMP_OPLIST)
BPTREE_MULTI_DEF2(multimap, 3, int, M_DEFAULT_OPLIST, int, M_DEFAULT_OPLIST)
BPTREE_MULTI_DEF(multiset, 6, int, M_DEFAULT_OPLIST)
BPTREE_DEF2_AS(MapDouble, MapDouble, MapDoubleIt, MapDoubleItRef, 4, double, double)
#define M_OPL_MapDouble() BPTREE_OPLIST2(MapDouble, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST)
BPTREE_DEF_AS(SetDouble, SetDouble, SetDoubleIt, 7, double)
#define M_OPL_SetDouble() BPTREE_OPLIST(SetDouble, M_DEFAULT_OPLIST)
BPTREE_MULTI_DEF2_AS(MultiMapDouble, MultiMapDouble, MultiMapDoubleIt, MultiMapDoubleItRef, 8, double, double)
#define M_OPL_MultiMapDouble() BPTREE_OPLIST2(MultiMapDouble, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST)
BPTREE_MULTI_DEF_AS(MultiSetDouble, MultiSetDouble, MultiSetDoubleIt, 9, double)
#define M_OPL_MultiSetDouble() BPTREE_OPLIST(MultiSetDouble, M_DEFAULT_OPLIST)
static void test1(void)
{
btree_t b;
@@ -499,32 +508,6 @@ static void test_io_set(void)
}
}
#if 0
// Dump code for debug
static void multimap_dump_node(multimap_node_t n)
{
while (n) {
int num = n->num < 0 ? -n->num : n->num;
printf ("[");
for(int i = 0; i < num; i++)
printf ("%d, ", n->key[i]);
printf ("] ");
n = n->next;
}
printf("\n");
}
static void
multimap_dump(multimap_t b)
{
multimap_node_t n = b->root;
while (n->num > 0) {
multimap_dump_node(n);
n = n->kind.node[0];
}
multimap_dump_node(n);
}
#endif
static void
test_multimap(void)
{
@@ -596,6 +579,53 @@ test_multiset(void)
multiset_clear(b);
}
static void test_double(void)
{
M_LET( (tree, (1.0, 2.0), (3.0, 4.0)), MapDouble) {
double *r = MapDouble_get(tree, 1.0);
assert( r != NULL);
assert( *r == 2.0);
r = MapDouble_get(tree, 3.0);
assert( r != NULL);
assert( *r == 4.0);
r = MapDouble_get(tree, 4.0);
assert( r == NULL);
}
M_LET( (tree, 1.0, 3.0), SetDouble) {
double *r = SetDouble_get(tree, 1.0);
assert( r != NULL);
assert( *r == 1.0);
r = SetDouble_get(tree, 3.0);
assert( r != NULL);
assert( *r == 3.0);
r = SetDouble_get(tree, 4.0);
assert( r == NULL);
}
M_LET( (tree, (1.0, 2.0), (3.0, 4.0)), MultiMapDouble) {
double *r = MultiMapDouble_get(tree, 1.0);
assert( r != NULL);
assert( *r == 2.0);
r = MultiMapDouble_get(tree, 3.0);
assert( r != NULL);
assert( *r == 4.0);
r = MultiMapDouble_get(tree, 4.0);
assert( r == NULL);
}
M_LET( (tree, 1.0, 3.0), MultiSetDouble) {
double *r = MultiSetDouble_get(tree, 1.0);
assert( r != NULL);
assert( *r == 1.0);
r = MultiSetDouble_get(tree, 3.0);
assert( r != NULL);
assert( *r == 3.0);
r = MultiSetDouble_get(tree, 4.0);
assert( r == NULL);
}
}
int main(void)
{
test1();
@@ -608,5 +638,6 @@ int main(void)
test_io_set();
test_multimap();
test_multiset();
test_double();
exit(0);
}