Add function dict_splice
This commit is contained in:
1 parent
d70a971d2e
commit
6bb94db22f
2 files changed
+32
-11
No files matched your search
@@ -488,7 +488,7 @@
|
|||||||
\
|
\
|
||||||
DICTI_FUNC_ADDITIONAL_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, dict_t, dict_it_t)
|
DICTI_FUNC_ADDITIONAL_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, dict_t, dict_it_t)
|
||||||
|
|
||||||
|
// FIXME: Seems there are some issues with set and oa (contract / fields ?)
|
||||||
/* Define additional functions for dictionnary.
|
/* Define additional functions for dictionnary.
|
||||||
Do not used any fields of the dictionnary */
|
Do not used any fields of the dictionnary */
|
||||||
#define DICTI_FUNC_ADDITIONAL_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, dict_t, dict_it_t) \
|
#define DICTI_FUNC_ADDITIONAL_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, dict_t, dict_it_t) \
|
||||||
@@ -573,6 +573,27 @@
|
|||||||
return c == '}'; \
|
return c == '}'; \
|
||||||
} \
|
} \
|
||||||
, /* no IN_STR */ ) \
|
, /* no IN_STR */ ) \
|
||||||
|
\
|
||||||
|
M_IF_METHOD(UPDATE, value_oplist)( \
|
||||||
|
static inline void \
|
||||||
|
M_C(name, _splice)(dict_t d1, dict_t d2) \
|
||||||
|
{ \
|
||||||
|
dict_it_t it; \
|
||||||
|
/* NOTE: Despite using set_at, the accessing of the item in d1 \
|
||||||
|
is not as random as other uses of the HASH table as d2 \
|
||||||
|
uses the same order than d1 */ \
|
||||||
|
for (M_C(name, _it)(it, d2); !M_C(name, _end_p)(it); M_C(name, _next)(it)){ \
|
||||||
|
const struct M_C(name, _pair_s) *item = M_C(name, _cref)(it); \
|
||||||
|
value_type *ptr = M_C(name, _get)(d1, item->key); \
|
||||||
|
if (ptr == NULL) { \
|
||||||
|
M_C(name, _set_at)(d1, item->key, item->value); \
|
||||||
|
} else { \
|
||||||
|
M_GET_UPDATE value_oplist (*ptr, item->value); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
M_C(name, _clean)(d2); \
|
||||||
|
} \
|
||||||
|
, /* NO UPDATE */) \
|
||||||
|
|
||||||
|
|
||||||
/* Define the oplist of a dictionnary */
|
/* Define the oplist of a dictionnary */
|
||||||
@@ -1234,6 +1255,12 @@ typedef enum {
|
|||||||
return &it->dict->data[i]; \
|
return &it->dict->data[i]; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
static inline const struct M_C(name, _pair_s) * \
|
||||||
|
M_C(name, _cref)(const dict_it_t it) \
|
||||||
|
{ \
|
||||||
|
return M_CONST_CAST(struct M_C(name, _pair_s), M_C(name, _ref)(it)); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name,_reserve)(dict_t dict, size_t capacity) \
|
M_C(name,_reserve)(dict_t dict, size_t capacity) \
|
||||||
{ \
|
{ \
|
||||||
|
|||||||
+4
-10
@@ -27,19 +27,13 @@
|
|||||||
#include "m-string.h"
|
#include "m-string.h"
|
||||||
#include "mympz.h"
|
#include "mympz.h"
|
||||||
|
|
||||||
static inline bool oor_equal_p(int k, unsigned char n)
|
static inline bool oor_equal_p(int k, unsigned char n) { return k == (int)-n-1; }
|
||||||
{
|
static inline void oor_set(int *k, unsigned char n) { *k = (int)-n-1; }
|
||||||
return k == (int)-n-1;
|
static inline void update_value (int *p, const int val) { *p += val; }
|
||||||
}
|
|
||||||
static inline void oor_set(int *k, unsigned char n)
|
|
||||||
{
|
|
||||||
*k = (int)-n-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "coverage.h"
|
#include "coverage.h"
|
||||||
START_COVERAGE
|
START_COVERAGE
|
||||||
DICT_DEF2(dict_str, string_t, STRING_OPLIST, string_t, STRING_OPLIST)
|
DICT_DEF2(dict_str, string_t, STRING_OPLIST, string_t, STRING_OPLIST)
|
||||||
DICT_OA_DEF2(dict_oa_int, int, M_OPEXTEND(M_DEFAULT_OPLIST, OOR_EQUAL(oor_equal_p), OOR_SET(oor_set M_IPTR)), int, M_DEFAULT_OPLIST)
|
DICT_OA_DEF2(dict_oa_int, int, M_OPEXTEND(M_DEFAULT_OPLIST, OOR_EQUAL(oor_equal_p), OOR_SET(oor_set M_IPTR)), int, M_OPEXTEND(M_DEFAULT_OPLIST, UPDATE(update_value M_IPTR)))
|
||||||
END_COVERAGE
|
END_COVERAGE
|
||||||
|
|
||||||
DICT_STOREHASH_DEF2(dict_str2, string_t, STRING_OPLIST, string_t, STRING_OPLIST)
|
DICT_STOREHASH_DEF2(dict_str2, string_t, STRING_OPLIST, string_t, STRING_OPLIST)
|
||||||
|
|||||||
Reference in new issue
Block a user