Add _init_set, _set & _init_move for dict with Open Addressing.
This commit is contained in:
1 parent
b207a2c03d
commit
4b908fb22d
1 file changed
+60
-6
@@ -35,7 +35,8 @@
|
|||||||
#define DICT_DEF2(name, key_type, key_oplist, value_type, value_oplist) \
|
#define DICT_DEF2(name, key_type, key_oplist, value_type, value_oplist) \
|
||||||
TUPLE_DEF2(M_C(dict_pair_, name), (key, key_type, key_oplist), (value, value_type, value_oplist)) \
|
TUPLE_DEF2(M_C(dict_pair_, name), (key, key_type, key_oplist), (value, value_type, value_oplist)) \
|
||||||
M_IF_METHOD(MEMPOOL, key_oplist)( \
|
M_IF_METHOD(MEMPOOL, key_oplist)( \
|
||||||
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), M_OPEXTEND(TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist, value_oplist), MEMPOOL(M_GET_MEMPOOL key_oplist), MEMPOOL_LINKAGE(M_GET_MEMPOOL_LINKAGE key_oplist))) \
|
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), \
|
||||||
|
M_OPEXTEND(TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist, value_oplist), MEMPOOL(M_GET_MEMPOOL key_oplist), MEMPOOL_LINKAGE(M_GET_MEMPOOL_LINKAGE key_oplist))) \
|
||||||
, \
|
, \
|
||||||
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist, value_oplist)) \
|
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist, value_oplist)) \
|
||||||
) \
|
) \
|
||||||
@@ -58,7 +59,8 @@
|
|||||||
#define DICT_SET_DEF2(name, key_type, key_oplist) \
|
#define DICT_SET_DEF2(name, key_type, key_oplist) \
|
||||||
TUPLE_DEF2(M_C(dict_pair_, name), (key, key_type, key_oplist)) \
|
TUPLE_DEF2(M_C(dict_pair_, name), (key, key_type, key_oplist)) \
|
||||||
M_IF_METHOD(MEMPOOL, key_oplist)( \
|
M_IF_METHOD(MEMPOOL, key_oplist)( \
|
||||||
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), M_OPEXTEND(TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist), MEMPOOL(M_GET_MEMPOOL key_oplist), MEMPOOL_LINKAGE(M_GET_MEMPOOL_LINKAGE key_oplist))) \
|
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), \
|
||||||
|
M_OPEXTEND(TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist), MEMPOOL(M_GET_MEMPOOL key_oplist), MEMPOOL_LINKAGE(M_GET_MEMPOOL_LINKAGE key_oplist))) \
|
||||||
, \
|
, \
|
||||||
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist)) \
|
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist)) \
|
||||||
) \
|
) \
|
||||||
@@ -78,7 +80,7 @@
|
|||||||
DICTI_OPLIST(__VA_ARGS__ , M_RET_ARG2 (__VA_ARGS__, ) ))
|
DICTI_OPLIST(__VA_ARGS__ , M_RET_ARG2 (__VA_ARGS__, ) ))
|
||||||
|
|
||||||
/* Open Addressing implementation. Same oplist
|
/* Open Addressing implementation. Same oplist
|
||||||
Need OOR_OPLIST as opeartor of key */
|
Need OOR_EQUAL & OOR_SET as methods of the key */
|
||||||
#define DICT_OA_DEF2(name, key_type, key_oplist, value_type, value_oplist) \
|
#define DICT_OA_DEF2(name, key_type, key_oplist, value_type, value_oplist) \
|
||||||
DICTI_OA_DEFI(name, key_type, key_oplist, value_type, value_oplist, \
|
DICTI_OA_DEFI(name, key_type, key_oplist, value_type, value_oplist, \
|
||||||
M_GET_OOR_EQUAL key_oplist, M_GET_OOR_SET key_oplist, \
|
M_GET_OOR_EQUAL key_oplist, M_GET_OOR_SET key_oplist, \
|
||||||
@@ -620,6 +622,9 @@ typedef enum {
|
|||||||
{ \
|
{ \
|
||||||
DICTI_OA_CONTRACT(dict); \
|
DICTI_OA_CONTRACT(dict); \
|
||||||
M_GET_FREE key_oplist (dict->data); \
|
M_GET_FREE key_oplist (dict->data); \
|
||||||
|
/* Not really needed, but safer */ \
|
||||||
|
dict->mask = 0; \
|
||||||
|
dict->data = NULL; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline value_type * \
|
static inline value_type * \
|
||||||
@@ -905,7 +910,56 @@ typedef enum {
|
|||||||
DICTI_OA_CONTRACT(dict); \
|
DICTI_OA_CONTRACT(dict); \
|
||||||
return dict->count; \
|
return dict->count; \
|
||||||
} \
|
} \
|
||||||
|
\
|
||||||
|
static inline void \
|
||||||
|
M_C3(dict_, name, _init_set)(dict_t map, const dict_t org) \
|
||||||
|
{ \
|
||||||
|
DICTI_OA_CONTRACT(org); \
|
||||||
|
assert (map != org); \
|
||||||
|
map->mask = org->mask; \
|
||||||
|
map->count = org->count; \
|
||||||
|
map->count_delete = org->count_delete; \
|
||||||
|
map->upper_limit = org->upper_limit; \
|
||||||
|
map->lower_limit = org->lower_limit; \
|
||||||
|
for(size_t i = 0; i <= org->mask; i++) { \
|
||||||
|
if (oor_equal_p(org->data[i].key, DICTI_OA_EMPTY)) { \
|
||||||
|
oor_set(org->data[i].key, DICTI_OA_EMPTY); \
|
||||||
|
} else if (oor_equal_p(org->data[i].key, DICTI_OA_DELETED)) { \
|
||||||
|
oor_set(org->data[i].key, DICTI_OA_DELETED); \
|
||||||
|
} else { \
|
||||||
|
M_GET_INIT_SET key_oplist (map->data[i].key, org->data[i].key); \
|
||||||
|
M_GET_INIT_SET value_oplist (map->data[i].key, org->data[i].key); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
DICTI_OA_CONTRACT(map); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static inline void \
|
||||||
|
M_C3(dict_, name, _set)(dict_t map, const dict_t org) \
|
||||||
|
{ \
|
||||||
|
DICTI_OA_CONTRACT(map); \
|
||||||
|
DICTI_OA_CONTRACT(org); \
|
||||||
|
if (map != org) { \
|
||||||
|
M_C3(dict_, name, _clear)(map); \
|
||||||
|
M_C3(dict_, name, _init_set)(map, org); \
|
||||||
|
} \
|
||||||
|
DICTI_OA_CONTRACT(map); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static inline void \
|
||||||
|
M_C3(dict_, name, _init_move)(dict_t map, dict_t org) \
|
||||||
|
{ \
|
||||||
|
DICTI_OA_CONTRACT(org); \
|
||||||
|
assert (map != org); \
|
||||||
|
map->mask = org->mask; \
|
||||||
|
map->count = org->count; \
|
||||||
|
map->count_delete = org->count_delete; \
|
||||||
|
map->upper_limit = org->upper_limit; \
|
||||||
|
map->lower_limit = org->lower_limit; \
|
||||||
|
map->data = org->data; \
|
||||||
|
org->mask = 0; \
|
||||||
|
org->data = NULL; \
|
||||||
|
DICTI_OA_CONTRACT(map); \
|
||||||
|
} \
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in new issue
Block a user