Add macros
BPTREE_DEF2_AS BPTREE_DEF_AS BPTREE_MULTI_DEF2_AS BPTREE_MULTI_DEF_AS
This commit is contained in:
1 parent
c180981768
commit
c039f07f2d
2 files changed
+114
-28
No files matched your search
+57
-2
@@ -42,6 +42,21 @@
|
|||||||
M_END_PROTECTED_CODE
|
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.
|
/* Define a B+tree of a given type, of size N.
|
||||||
with its associated functions
|
with its associated functions
|
||||||
USAGE: BPTREE_DEF(name, N, type, [, oplist_of_the_type]) */
|
USAGE: BPTREE_DEF(name, N, type, [, oplist_of_the_type]) */
|
||||||
@@ -53,6 +68,17 @@
|
|||||||
M_END_PROTECTED_CODE
|
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',
|
/* Define a B+tree of size 'N' that maps a 'key' to a 'value',
|
||||||
allowing multiple equal keys to exist,
|
allowing multiple equal keys to exist,
|
||||||
with its associated functions.
|
with its associated functions.
|
||||||
@@ -69,6 +95,22 @@
|
|||||||
M_END_PROTECTED_CODE
|
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.
|
/* Define a B+tree of a given type, of size N.
|
||||||
allowing multiple equal keys to exist,
|
allowing multiple equal keys to exist,
|
||||||
with its associated functions
|
with its associated functions
|
||||||
@@ -81,8 +123,19 @@
|
|||||||
M_BEGIN_PROTECTED_CODE
|
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]) */
|
USAGE: BPTREE_OPLIST(name [, oplist_of_the_type]) */
|
||||||
#define BPTREE_OPLIST(...) \
|
#define BPTREE_OPLIST(...) \
|
||||||
BPTREEI_KEY_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
BPTREEI_KEY_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
@@ -90,7 +143,7 @@
|
|||||||
(__VA_ARGS__ )))
|
(__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])
|
USAGE: BPTREE_OPLIST2(name[, key_oplist, value_oplist])
|
||||||
NOTE: IT_REF is not exported so that the contained appears as not modifiable
|
NOTE: IT_REF is not exported so that the contained appears as not modifiable
|
||||||
by algorithm.
|
by algorithm.
|
||||||
@@ -120,6 +173,7 @@
|
|||||||
#define BPTREEI_KEY_OPLIST_P3(name, oplist) \
|
#define BPTREEI_KEY_OPLIST_P3(name, oplist) \
|
||||||
(INIT(M_C(name, _init)), \
|
(INIT(M_C(name, _init)), \
|
||||||
INIT_SET(M_C(name, _init_set)), \
|
INIT_SET(M_C(name, _init_set)), \
|
||||||
|
INIT_WITH(API_1(M_INIT_VAI)), \
|
||||||
SET(M_C(name, _set)), \
|
SET(M_C(name, _set)), \
|
||||||
CLEAR(M_C(name, _clear)), \
|
CLEAR(M_C(name, _clear)), \
|
||||||
INIT_MOVE(M_C(name, _init_move)), \
|
INIT_MOVE(M_C(name, _init_move)), \
|
||||||
@@ -169,6 +223,7 @@
|
|||||||
#define BPTREEI_OPLIST2_P4(name, key_oplist, value_oplist) \
|
#define BPTREEI_OPLIST2_P4(name, key_oplist, value_oplist) \
|
||||||
(INIT(M_C(name, _init)), \
|
(INIT(M_C(name, _init)), \
|
||||||
INIT_SET(M_C(name, _init_set)), \
|
INIT_SET(M_C(name, _init_set)), \
|
||||||
|
INIT_WITH(API_1(M_INIT_KEY_VAI)), \
|
||||||
SET(M_C(name, _set)), \
|
SET(M_C(name, _set)), \
|
||||||
CLEAR(M_C(name, _clear)), \
|
CLEAR(M_C(name, _clear)), \
|
||||||
INIT_MOVE(M_C(name, _init_move)), \
|
INIT_MOVE(M_C(name, _init_move)), \
|
||||||
|
|||||||
+57
-26
@@ -41,6 +41,15 @@ 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_DEF2(multimap, 3, int, M_DEFAULT_OPLIST, int, M_DEFAULT_OPLIST)
|
||||||
BPTREE_MULTI_DEF(multiset, 6, 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)
|
static void test1(void)
|
||||||
{
|
{
|
||||||
btree_t b;
|
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
|
static void
|
||||||
test_multimap(void)
|
test_multimap(void)
|
||||||
{
|
{
|
||||||
@@ -596,6 +579,53 @@ test_multiset(void)
|
|||||||
multiset_clear(b);
|
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)
|
int main(void)
|
||||||
{
|
{
|
||||||
test1();
|
test1();
|
||||||
@@ -608,5 +638,6 @@ int main(void)
|
|||||||
test_io_set();
|
test_io_set();
|
||||||
test_multimap();
|
test_multimap();
|
||||||
test_multiset();
|
test_multiset();
|
||||||
|
test_double();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user