Add function dict_splice

This commit is contained in:
Patrick Pelissier committed 2018-04-15 21:02:14 +02:00
1 parent d70a971d2e
commit 6bb94db22f
2 files changed
+32 -11

No files matched your search

+28 -1
View File
@@ -488,7 +488,7 @@
\
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.
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) \
@@ -573,6 +573,27 @@
return c == '}'; \
} \
, /* 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 */
@@ -1234,6 +1255,12 @@ typedef enum {
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 \
M_C(name,_reserve)(dict_t dict, size_t capacity) \
{ \
+4 -10
View File
@@ -27,19 +27,13 @@
#include "m-string.h"
#include "mympz.h"
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;
}
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; }
static inline void update_value (int *p, const int val) { *p += val; }
#include "coverage.h"
START_COVERAGE
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
DICT_STOREHASH_DEF2(dict_str2, string_t, STRING_OPLIST, string_t, STRING_OPLIST)