Add _get_emplace functions for associative array

This commit is contained in:
Patrick Pelissier committed 2023-03-29 22:59:43 +02:00
1 parent c515da9f37
commit 4e4e21793c
2 files changed
+30 -2

No files matched your search

+20 -2
View File
@@ -4652,9 +4652,11 @@ m_core_parse2_enum (const char str[], const char **endptr)
#define M_EMPLACE_ASS_ARRAY_OR_QUEUE_DEF(isSet, name, name_t, key_oplist, val_oplist) \
M_ID( 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, val_oplist, M_EMPLACE_ASS_ARRA1_BOTH_GENE, M_EMPLACE_ASS_ARRA1_KEY_GENE, M_EMPLACE_ASS_ARRA1_VAL_GENE)
M_EMPLACE_ASS_ARRAY_DEF(name, name_t, M_C(name, _emplace), key_oplist, val_oplist, M_EMPLACE_ASS_ARRA1_BOTH_GENE, M_EMPLACE_ASS_ARRA1_KEY_GENE, M_EMPLACE_ASS_ARRA1_VAL_GENE) \
M_EMPLACE_QUEUE_DEF(name, name_t, M_C(name, _get_emplace), key_oplist, M_EMPLACE_GET_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)
M_EMPLACE_QUEUE_DEF(name, name_t, M_C(name, _emplace), key_oplist, M_EMPLACE_QUEUE_GENE) \
M_EMPLACE_QUEUE_DEF(name, name_t, M_C(name, _get_emplace), key_oplist, M_EMPLACE_GET_GENE)
/* Definition of the emplace_back function for associative arrays.
@@ -4718,6 +4720,22 @@ m_core_parse2_enum (const char str[], const char **endptr)
M_CALL_CLEAR(oplist, data); \
}
/* Definition of the get_emplace function for set / map.
It is defined here so that this definition is shared accross different
kind of kind of queue.
This definition is far from being efficient but works for the current interface.
*/
#define M_EMPLACE_GET_GENE(name, name_t, function_name, oplist, init_func, exp_emplace_type) \
static inline M_C(name, _value_ct) * \
function_name(name_t v \
M_EMPLACE_LIST_TYPE_VAR(a, exp_emplace_type) ) \
{ \
M_GET_TYPE oplist data; \
M_EMPLACE_CALL_FUNC(a, init_func, oplist, data, exp_emplace_type); \
M_C(name, _value_ct) *ret = M_C(name, _get)(v, data); \
M_CALL_CLEAR(oplist, data); \
return ret; \
}
/************************************************************/
+10
View File
@@ -593,6 +593,16 @@ static void test_emplace (void)
assert(ptr != NULL);
assert(testobj_cmp_ui(*ptr, 190) == 0);
dict_mpz_emplace_key(d, "IT", *ptr);
ptr = dict_mpz_get_emplace(d, "IT");
assert(ptr != NULL);
assert(testobj_cmp_ui(*ptr, 190) == 0);
dict_mpz_emplace_key_val_str(d, "SHE", "189");
ptr = dict_mpz_get_emplace(d, "SHE");
assert(ptr != NULL);
assert(testobj_cmp_ui(*ptr, 189) == 0);
string_clear(s);
dict_mpz_clear(d);
}