Prepare integration of set based on OA hashmap
This commit is contained in:
1 parent
e6a9b8fc8e
commit
bc39034f6d
1 file changed
+24
-22
@@ -179,18 +179,15 @@
|
|||||||
LIST_OPLIST(M_C(name, _list_pair), TUPLE_OPLIST(M_C(name, _pair), key_oplist))) \
|
LIST_OPLIST(M_C(name, _list_pair), TUPLE_OPLIST(M_C(name, _pair), key_oplist))) \
|
||||||
\
|
\
|
||||||
DICTI_FUNC_DEF2(name, key_type, key_oplist, key_type, \
|
DICTI_FUNC_DEF2(name, key_type, key_oplist, key_type, \
|
||||||
(INIT(M_EMPTY_DEFAULT), INIT_SET(M_EMPTY_DEFAULT), \
|
M_EMPTY_OPLIST, 1, 0, M_C(name, _t), M_C(name, _it_t))
|
||||||
SET(M_EMPTY_DEFAULT), CLEAR(M_EMPTY_DEFAULT), \
|
|
||||||
EQUAL(M_EMPTY_DEFAULT), GET_STR(M_EMPTY_DEFAULT), \
|
|
||||||
OUT_STR(M_EMPTY_DEFAULT), IN_STR(M_TRUE_DEFAULT), \
|
|
||||||
OUT_SERIAL(M_EMPTY_DEFAULT), IN_SERIAL(M_TRUE_DEFAULT), \
|
|
||||||
PARSE_STR(M_TRUE_DEFAULT)), \
|
|
||||||
1, 0, M_C(name, _t), M_C(name, _it_t))
|
|
||||||
|
|
||||||
|
|
||||||
/* Define the structure of a chained dictionnary */
|
/* Define the structure of a chained dictionnary */
|
||||||
#define DICTI_FUNC_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, isStoreHash, dict_t, dict_it_t) \
|
#define DICTI_FUNC_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, isStoreHash, dict_t, dict_it_t) \
|
||||||
\
|
\
|
||||||
|
/* NOTE: \
|
||||||
|
if isSet is true, all methods of value_oplist are NOP methods */ \
|
||||||
|
\
|
||||||
typedef struct M_C(name, _s) { \
|
typedef struct M_C(name, _s) { \
|
||||||
size_t used, lower_limit, upper_limit; \
|
size_t used, lower_limit, upper_limit; \
|
||||||
M_C(name, _array_list_pair_t) table; \
|
M_C(name, _array_list_pair_t) table; \
|
||||||
@@ -1064,20 +1061,27 @@ typedef enum {
|
|||||||
|
|
||||||
#define DICTI_OA_DEF_P1(args) DICTI_OA_DEF_P2 args
|
#define DICTI_OA_DEF_P1(args) DICTI_OA_DEF_P2 args
|
||||||
#define DICTI_OA_DEF_P2(name, key_type, key_oplist, value_type, value_oplist) \
|
#define DICTI_OA_DEF_P2(name, key_type, key_oplist, value_type, value_oplist) \
|
||||||
DICTI_OA_DEF_P3(name, key_type, key_oplist, value_type, value_oplist, \
|
DICTI_OA_DEF_P3(name, key_type, key_oplist, value_type, value_oplist, 0, \
|
||||||
DICTI_OA_LOWER_BOUND, DICTI_OA_UPPER_BOUND, M_C(name,_t), M_C(name, _it_t) )
|
DICTI_OA_LOWER_BOUND, DICTI_OA_UPPER_BOUND, M_C(name,_t), M_C(name, _it_t) )
|
||||||
|
|
||||||
#define DICTI_OA_DEF_P3(name, key_type, key_oplist, value_type, value_oplist, coeff_down, coeff_up, dict_t, dict_it_t) \
|
#define DICTI_OA_DEF_P3(name, key_type, key_oplist, value_type, value_oplist, isSet, coeff_down, coeff_up, dict_t, dict_it_t) \
|
||||||
\
|
\
|
||||||
|
/* NOTE: \
|
||||||
|
if isSet is true, all methods of value_oplist are NOP methods */ \
|
||||||
|
\
|
||||||
typedef struct M_C(name, _pair_s) { \
|
typedef struct M_C(name, _pair_s) { \
|
||||||
key_type key; \
|
key_type key; \
|
||||||
value_type value; \
|
M_IF(isSet)( , value_type value;) \
|
||||||
} M_C(name, _pair_t); \
|
} M_C(name, _pair_t); \
|
||||||
\
|
\
|
||||||
|
M_IF(isSet)( \
|
||||||
|
typedef key_type M_C(name, _type_t); \
|
||||||
|
, \
|
||||||
|
typedef struct M_C(name, _pair_s) M_C(name, _type_t); ) \
|
||||||
typedef key_type M_C(name, _key_type_t); \
|
typedef key_type M_C(name, _key_type_t); \
|
||||||
typedef value_type M_C(name, _value_type_t); \
|
typedef value_type M_C(name, _value_type_t); \
|
||||||
\
|
\
|
||||||
/* NOTE: We don't want a real oplist for this type */ \
|
/* NOTE: We don't want a real oplist for this sub type */ \
|
||||||
ARRAY_DEF(M_C(name, _array_pair), M_C(name, _pair_t), \
|
ARRAY_DEF(M_C(name, _array_pair), M_C(name, _pair_t), \
|
||||||
(INIT(M_NOTHING_DEFAULT), SET(M_MEMCPY_DEFAULT), \
|
(INIT(M_NOTHING_DEFAULT), SET(M_MEMCPY_DEFAULT), \
|
||||||
INIT_SET(M_MEMCPY_DEFAULT), CLEAR(M_NOTHING_DEFAULT))) \
|
INIT_SET(M_MEMCPY_DEFAULT), CLEAR(M_NOTHING_DEFAULT))) \
|
||||||
@@ -1089,7 +1093,6 @@ typedef enum {
|
|||||||
} dict_t[1]; \
|
} dict_t[1]; \
|
||||||
typedef struct M_C(name, _s) *M_C(name, _ptr); \
|
typedef struct M_C(name, _s) *M_C(name, _ptr); \
|
||||||
typedef const struct M_C(name, _s) *M_C(name, _srcptr); \
|
typedef const struct M_C(name, _s) *M_C(name, _srcptr); \
|
||||||
typedef struct M_C(name, _pair_s) M_C(name, _type_t); \
|
|
||||||
\
|
\
|
||||||
typedef struct M_C(name, _it_s) { \
|
typedef struct M_C(name, _it_s) { \
|
||||||
const struct M_C(name,_s) *dict; \
|
const struct M_C(name,_s) *dict; \
|
||||||
@@ -1153,7 +1156,7 @@ typedef enum {
|
|||||||
\
|
\
|
||||||
/* Random access, and probably cache miss */ \
|
/* Random access, and probably cache miss */ \
|
||||||
if (M_LIKELY (M_CALL_EQUAL(key_oplist, data[p].key, key)) ) \
|
if (M_LIKELY (M_CALL_EQUAL(key_oplist, data[p].key, key)) ) \
|
||||||
return &data[p].value; \
|
return &data[p].M_IF(isSet)(key, value); \
|
||||||
else if (M_LIKELY (M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_EMPTY)) ) \
|
else if (M_LIKELY (M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_EMPTY)) ) \
|
||||||
return NULL; \
|
return NULL; \
|
||||||
\
|
\
|
||||||
@@ -1162,7 +1165,7 @@ typedef enum {
|
|||||||
do { \
|
do { \
|
||||||
p = (p + DICTI_OA_PROBING(s)) & mask; \
|
p = (p + DICTI_OA_PROBING(s)) & mask; \
|
||||||
if (M_CALL_EQUAL(key_oplist, data[p].key, key)) \
|
if (M_CALL_EQUAL(key_oplist, data[p].key, key)) \
|
||||||
return &data[p].value; \
|
return &data[p].M_IF(isSet)(key, value); \
|
||||||
assert (s <= dict->mask); \
|
assert (s <= dict->mask); \
|
||||||
} while (!M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_EMPTY) ); \
|
} while (!M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_EMPTY) ); \
|
||||||
\
|
\
|
||||||
@@ -1270,8 +1273,9 @@ typedef enum {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name,_set_at)(dict_t dict, key_type const key, \
|
M_IF(isSet)(M_C(name, _push), M_C(name,_set_at)) \
|
||||||
value_type const value) \
|
(dict_t dict, key_type const key \
|
||||||
|
M_IF(isSet)(, M_DEFERRED_COMMA value_type const value) ) \
|
||||||
{ \
|
{ \
|
||||||
DICTI_OA_CONTRACT(dict); \
|
DICTI_OA_CONTRACT(dict); \
|
||||||
/* NOTE: key can not be the representation of empty or deleted */ \
|
/* NOTE: key can not be the representation of empty or deleted */ \
|
||||||
@@ -1337,7 +1341,7 @@ typedef enum {
|
|||||||
size_t p = M_CALL_HASH(key_oplist, key) & mask; \
|
size_t p = M_CALL_HASH(key_oplist, key) & mask; \
|
||||||
\
|
\
|
||||||
if (M_CALL_EQUAL(key_oplist, data[p].key, key)) { \
|
if (M_CALL_EQUAL(key_oplist, data[p].key, key)) { \
|
||||||
return &data[p].value; \
|
return &data[p].M_IF(isSet)(key, value); \
|
||||||
} \
|
} \
|
||||||
if (M_UNLIKELY (!M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_EMPTY) ) ) { \
|
if (M_UNLIKELY (!M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_EMPTY) ) ) { \
|
||||||
size_t delPos = -1; \
|
size_t delPos = -1; \
|
||||||
@@ -1346,7 +1350,7 @@ typedef enum {
|
|||||||
do { \
|
do { \
|
||||||
p = (p + DICTI_OA_PROBING(s)) & mask; \
|
p = (p + DICTI_OA_PROBING(s)) & mask; \
|
||||||
if (M_CALL_EQUAL(key_oplist, data[p].key, key)) { \
|
if (M_CALL_EQUAL(key_oplist, data[p].key, key)) { \
|
||||||
return &data[p].value; \
|
return &data[p].M_IF(isSet)(key, value); \
|
||||||
} \
|
} \
|
||||||
assert (s <= dict->mask); \
|
assert (s <= dict->mask); \
|
||||||
if (M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_DELETED) && delPos == (size_t)-1) delPos = p; \
|
if (M_CALL_OOR_EQUAL(key_oplist, data[p].key, DICTI_OA_DELETED) && delPos == (size_t)-1) delPos = p; \
|
||||||
@@ -1375,7 +1379,7 @@ typedef enum {
|
|||||||
return M_C(name, _get)(dict, key); \
|
return M_C(name, _get)(dict, key); \
|
||||||
} \
|
} \
|
||||||
DICTI_OA_CONTRACT(dict); \
|
DICTI_OA_CONTRACT(dict); \
|
||||||
return &data[p].value; \
|
return &data[p].M_IF(isSet)(key, value); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
@@ -1776,16 +1780,14 @@ typedef enum {
|
|||||||
value_type *ptr = M_C(name, _get)(dict2, item->key); \
|
value_type *ptr = M_C(name, _get)(dict2, item->key); \
|
||||||
if (ptr == NULL) \
|
if (ptr == NULL) \
|
||||||
return false; \
|
return false; \
|
||||||
M_IF(isSet)(, \
|
|
||||||
if (M_CALL_EQUAL(value_oplist, item->value, *ptr) == false) \
|
if (M_CALL_EQUAL(value_oplist, item->value, *ptr) == false) \
|
||||||
return false; \
|
return false; \
|
||||||
) \
|
|
||||||
} \
|
} \
|
||||||
return true; \
|
return true; \
|
||||||
} \
|
} \
|
||||||
, /* no value equal */ ) \
|
, /* no value equal */ ) \
|
||||||
\
|
\
|
||||||
DICTI_FUNC_ADDITIONAL_DEF2(name, key_type, key_oplist, value_type, value_oplist, 0, dict_t, dict_it_t)
|
DICTI_FUNC_ADDITIONAL_DEF2(name, key_type, key_oplist, value_type, value_oplist, isSet, dict_t, dict_it_t)
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in new issue
Block a user