* Add emplace generation for dict/hashmap.

(still need more tests).
* Factorize emplace generation for R+TREE/Prioqueue
This commit is contained in:
Patrick Pelissier committed 2022-10-02 22:24:22 +02:00
1 parent dc2b6d2b2d
commit 0fec33b38e
4 files changed
+31 -41

No files matched your search

+27 -3
View File
@@ -4474,6 +4474,17 @@ m_core_parse2_enum (const char str[], const char **endptr)
macro_both(name, name_t, M_C5_EMPTY(function_name, _key, M_RET_ARG1(M_ID a), _val, M_RET_ARG1(M_ID b) ), key_oplist, val_oplist, M_RET_ARG2(M_ID a), M_RET_ARG2(M_ID b), (M_TAIL_2 a), (M_TAIL_2 b) ) macro_both(name, name_t, M_C5_EMPTY(function_name, _key, M_RET_ARG1(M_ID a), _val, M_RET_ARG1(M_ID b) ), key_oplist, val_oplist, M_RET_ARG2(M_ID a), M_RET_ARG2(M_ID b), (M_TAIL_2 a), (M_TAIL_2 b) )
/* Quick call to emplace def generation which transform into an
associative array emplace generation or queue generation
depending on the parameter isSet (= 0 or 1) */
#define M_EMPLACE_ASS_ARRAY_OR_QUEUE_DEF(isSet, name, name_t, key_oplist, val_oplist) \
M_C(M_EMPLACE_ASS_ARRAY_OR_QUEUE_DEF, isSet)(name, name_t, key_oplist, val_oplist)
#define M_EMPLACE_ASS_ARRAY_OR_QUEUE_DEF0(name, name_t, key_oplist, val_oplist) \
M_EMPLACE_ASS_ARRAY_DEF(name, name_t, M_C(name, _emplace), key_oplist, value_type, M_EMPLACE_ASS_ARRA1_BOTH_GENE, M_EMPLACE_ASS_ARRA1_KEY_GENE, M_EMPLACE_ASS_ARRA1_VAL_GENE)
#define M_EMPLACE_ASS_ARRAY_OR_QUEUE_DEF1(name, name_t, key_oplist, val_oplist) \
M_EMPLACE_QUEUE_DEF(name, name_t, M_C(name, _emplace), key_oplist, M_EMPLACE_QUEUE_GENE)
/* Definition of the emplace_back function for associative arrays. /* Definition of the emplace_back function for associative arrays.
It is defined here so that this definition is shared accross different It is defined here so that this definition is shared accross different
kind of associative array (RB-Tree, Hashmap, OA-Hashmap, B+Tree, ...) kind of associative array (RB-Tree, Hashmap, OA-Hashmap, B+Tree, ...)
@@ -4481,7 +4492,7 @@ m_core_parse2_enum (const char str[], const char **endptr)
3 macros are needed: one when we emplace both key & value, one for key only 3 macros are needed: one when we emplace both key & value, one for key only
one for value only. one for value only.
*/ */
#define M_ASS_ARRA1_EMPLACE_BOTH_DEF(name, name_t, function_name, key_oplist, val_oplist, key_init_func, val_init_func, key_emplace_type, val_emplace_type) \ #define M_EMPLACE_ASS_ARRA1_BOTH_GENE(name, name_t, function_name, key_oplist, val_oplist, key_init_func, val_init_func, key_emplace_type, val_emplace_type) \
static inline void \ static inline void \
function_name(name_t v \ function_name(name_t v \
M_EMPLACE_LIST_TYPE_VAR(akey, key_emplace_type) \ M_EMPLACE_LIST_TYPE_VAR(akey, key_emplace_type) \
@@ -4496,7 +4507,7 @@ m_core_parse2_enum (const char str[], const char **endptr)
M_CALL_CLEAR(key_oplist, key); \ M_CALL_CLEAR(key_oplist, key); \
} \ } \
#define M_ASS_ARRA1_EMPLACE_KEY_DEF(name, name_t, function_name, key_oplist, val_oplist, key_init_func, val_init_func, key_emplace_type, val_emplace_type) \ #define M_EMPLACE_ASS_ARRA1_KEY_GENE(name, name_t, function_name, key_oplist, val_oplist, key_init_func, val_init_func, key_emplace_type, val_emplace_type) \
static inline void \ static inline void \
function_name(name_t v \ function_name(name_t v \
M_EMPLACE_LIST_TYPE_VAR(akey, key_emplace_type) \ M_EMPLACE_LIST_TYPE_VAR(akey, key_emplace_type) \
@@ -4508,7 +4519,7 @@ m_core_parse2_enum (const char str[], const char **endptr)
M_CALL_CLEAR(key_oplist, key); \ M_CALL_CLEAR(key_oplist, key); \
} \ } \
#define M_ASS_ARRA1_EMPLACE_VAL_DEF(name, name_t, function_name, key_oplist, val_oplist, key_init_func, val_init_func, key_emplace_type, val_emplace_type) \ #define M_EMPLACE_ASS_ARRA1_VAL_GENE(name, name_t, function_name, key_oplist, val_oplist, key_init_func, val_init_func, key_emplace_type, val_emplace_type) \
static inline void \ static inline void \
function_name(name_t v, M_C(name, _key_ct) key \ function_name(name_t v, M_C(name, _key_ct) key \
M_EMPLACE_LIST_TYPE_VAR(aval, val_emplace_type) \ M_EMPLACE_LIST_TYPE_VAR(aval, val_emplace_type) \
@@ -4519,6 +4530,19 @@ m_core_parse2_enum (const char str[], const char **endptr)
M_EMPLACE_CALL_FUNC(aval, val_init_func, val_oplist, *val, val_emplace_type); \ M_EMPLACE_CALL_FUNC(aval, val_init_func, val_oplist, *val, val_emplace_type); \
} \ } \
/* Generic emplace for a queue like container */
#define M_EMPLACE_QUEUE_GENE(name, name_t, function_name, oplist, init_func, exp_emplace_type) \
static inline void \
function_name(name_t v \
M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_type) ) \
{ \
M_C(name, _subtype_ct) data; \
M_EMPLACE_CALL_FUNC(a, init_func, oplist, data, exp_emplace_type); \
M_C(name, _push)(v, data); \
M_CALL_CLEAR(oplist, data); \
}
/************************************************************/ /************************************************************/
/******************* Exponential Backoff ********************/ /******************* Exponential Backoff ********************/
+2 -3
View File
@@ -707,7 +707,7 @@
/* Define additional functions for dictionnary (Common for all kinds of dictionnary). /* Define additional functions for dictionnary (Common for all kinds of dictionnary).
Do not used any specific fields of the dictionnary but the public API Do not used any specific fields of the dictionnary but the public API
It is not possible to define a method for IT_REMOVE: we could easily define it It is not possible to define a method for IT_REMOVE: we could easily define it
by performing an _erase of the key get by the _cref method. However, by performing an _erase of the key get by the _cref method. However,
computing the next element is way harder. We could easily compute the next computing the next element is way harder. We could easily compute the next
@@ -1035,8 +1035,7 @@
} \ } \
, /* NO UPDATE */) ) \ , /* NO UPDATE */) ) \
\ \
M_EMPLACE_ASS_ARRAY_OR_QUEUE_DEF(isSet, name, dict_t, key_oplist, val_oplist)
/* Deferred evaluation for the definition, /* Deferred evaluation for the definition,
so that all arguments are evaluated before further expansion */ so that all arguments are evaluated before further expansion */
+1 -17
View File
@@ -484,25 +484,9 @@
} \ } \
,/* No in_SERIAL */) \ ,/* No in_SERIAL */) \
\ \
M_EMPLACE_QUEUE_DEF(name, prioqueue_t, M_C(name, _emplace), oplist, M_PR1OQUEUE_EMPLACE_DEF) M_EMPLACE_QUEUE_DEF(name, prioqueue_t, M_C(name, _emplace), oplist, M_EMPLACE_QUEUE_GENE)
/* Definition of the emplace_back function for priority queue
Nothing particular to note: we go through the slow path.
*/
#define M_PR1OQUEUE_EMPLACE_DEF(name, name_t, function_name, oplist, init_func, exp_emplace_type) \
static inline void \
function_name(name_t v \
M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_type) ) \
{ \
M_C(name, _subtype_ct) data; \
/* Need to construct the object BEFORE, \
so that we can perform comparison on it when inserting it */ \
M_EMPLACE_CALL_FUNC(a, init_func, oplist, data, exp_emplace_type); \
M_C(name, _push)(v, data); \
M_CALL_CLEAR(oplist, data); \
}
// TODO: set all & remove all function // TODO: set all & remove all function
#if M_USE_SMALL_NAME #if M_USE_SMALL_NAME
+1 -18
View File
@@ -1165,24 +1165,7 @@ typedef enum {
} \ } \
, /* no in_serial */ ) \ , /* no in_serial */ ) \
\ \
M_EMPLACE_QUEUE_DEF(name, tree_t, M_C(name, _emplace), oplist, M_RBTR33_EMPLACE_DEF) M_EMPLACE_QUEUE_DEF(name, tree_t, M_C(name, _emplace), oplist, M_EMPLACE_QUEUE_GENE)
/* Definition of the emplace_back function for RB TREE
Nothing particular to note: we go through the slow path.
*/
#define M_RBTR33_EMPLACE_DEF(name, name_t, function_name, oplist, init_func, exp_emplace_type) \
static inline void \
function_name(name_t v \
M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_type) ) \
{ \
M_C(name, _subtype_ct) data; \
/* Need to construct the object BEFORE, \
so that we can perform comparison on it when inserting it */ \
M_EMPLACE_CALL_FUNC(a, init_func, oplist, data, exp_emplace_type); \
M_C(name, _push)(v, data); \
M_CALL_CLEAR(oplist, data); \
}
// TODO: specialized _sort shall do nothing, but shall check the requested order. How ? // TODO: specialized _sort shall do nothing, but shall check the requested order. How ?