Add set as a part of a dictionary.
This commit is contained in:
1 parent
3e2ad17eb8
commit
b75a68860e
2 files changed
+71
-34
No files matched your search
@@ -30,7 +30,7 @@
|
|||||||
#include "m-string.h"
|
#include "m-string.h"
|
||||||
#include "m-tuple.h"
|
#include "m-tuple.h"
|
||||||
|
|
||||||
/* Define a dictionnary with the key key_type to the value value_type.
|
/* Define a dictionary with the key key_type to the value value_type.
|
||||||
USAGE: DICT_DEF2(name, key_type, key_oplist, value_type, value_oplist)
|
USAGE: DICT_DEF2(name, key_type, key_oplist, value_type, value_oplist)
|
||||||
*/
|
*/
|
||||||
#define DICT_DEF2(name, key_type, key_oplist, value_type, value_oplist) \
|
#define DICT_DEF2(name, key_type, key_oplist, value_type, value_oplist) \
|
||||||
@@ -38,6 +38,47 @@
|
|||||||
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)) \
|
||||||
ARRAY_DEF(M_C(list_dict_pair_,name), M_C3(list_dict_pair_,name,_t), LIST_OPLIST(M_C(dict_pair_, name), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist, value_oplist))) \
|
ARRAY_DEF(M_C(list_dict_pair_,name), M_C3(list_dict_pair_,name,_t), LIST_OPLIST(M_C(dict_pair_, name), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist, value_oplist))) \
|
||||||
\
|
\
|
||||||
|
DICTI_DEF2_FUNC(name, key_type, key_oplist, value_type, value_oplist, 0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Define the oplist of a dictionnary.
|
||||||
|
USAGE: DICT_OPLIST(name[, oplist of the key type, oplist of the value type]) */
|
||||||
|
#define DICT_OPLIST(...) \
|
||||||
|
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
|
(DICTI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST ), \
|
||||||
|
DICTI_OPLIST(__VA_ARGS__ ))
|
||||||
|
|
||||||
|
|
||||||
|
/* Define a set with the key key_type
|
||||||
|
USAGE: 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)) \
|
||||||
|
LIST_DEF(M_C(dict_pair_, name), M_C3(dict_pair_,name,_t), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist)) \
|
||||||
|
ARRAY_DEF(M_C(list_dict_pair_,name), M_C3(list_dict_pair_,name,_t), LIST_OPLIST(M_C(dict_pair_, name), TUPLE_OPLIST(M_C(dict_pair_, name), key_oplist))) \
|
||||||
|
\
|
||||||
|
DICTI_DEF2_FUNC(name, key_type, key_oplist, key_type, \
|
||||||
|
(INIT(DICTI_EMPTY_FUNC), INIT_SET(DICTI_EMPTY_FUNC), SET(DICTI_EMPTY_FUNC), CLEAR(DICTI_EMPTY_FUNC), \
|
||||||
|
EQUAL(DICTI_EMPTY_FUNC), GET_STR(DICTI_EMPTY_FUNC), OUT_STR(DICTI_EMPTY_FUNC), IN_STR(DICTI_RETURN_TRUE)), 1)
|
||||||
|
|
||||||
|
|
||||||
|
/* Define the oplist of a dictionnary.
|
||||||
|
USAGE: DICT_SET_OPLIST(name[, oplist of the key type]) */
|
||||||
|
#define DICT_SET_OPLIST(...) \
|
||||||
|
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
|
(DICTI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST ), \
|
||||||
|
DICTI_OPLIST(__VA_ARGS__ , M_RET_ARG2 (__VA_ARGS__, ) ))
|
||||||
|
|
||||||
|
|
||||||
|
/********************************** INTERNAL ************************************/
|
||||||
|
|
||||||
|
/* Do nothing !*/
|
||||||
|
#define DICTI_EMPTY_FUNC(...) /* empty */
|
||||||
|
/* Return true! */
|
||||||
|
#define DICTI_RETURN_TRUE(...) true
|
||||||
|
|
||||||
|
#define DICTI_DEF2_FUNC(name, key_type, key_oplist, value_type, value_oplist, isSet) \
|
||||||
|
\
|
||||||
typedef struct M_C3(dict_, name, _s) { \
|
typedef struct M_C3(dict_, name, _s) { \
|
||||||
size_t used, lower_limit, upper_limit; \
|
size_t used, lower_limit, upper_limit; \
|
||||||
M_C3(array_list_dict_pair_,name,_t) table; \
|
M_C3(array_list_dict_pair_,name,_t) table; \
|
||||||
@@ -144,7 +185,7 @@
|
|||||||
M_C3(dict_,name,_get)(const M_C3(dict_,name,_t) map, const key_type key) \
|
M_C3(dict_,name,_get)(const M_C3(dict_,name,_t) map, const key_type key) \
|
||||||
{ \
|
{ \
|
||||||
DICTI_CONTRACT(name, map); \
|
DICTI_CONTRACT(name, map); \
|
||||||
size_t hash = M_GET_HASH key_oplist (key); \
|
size_t hash = M_GET_HASH key_oplist (key); \
|
||||||
hash = hash & (M_C3(array_list_dict_pair_,name,_size)(map->table) - 1); \
|
hash = hash & (M_C3(array_list_dict_pair_,name,_size)(map->table) - 1); \
|
||||||
const M_C3(list_dict_pair_,name,_t) *list_ptr = \
|
const M_C3(list_dict_pair_,name,_t) *list_ptr = \
|
||||||
M_C3(array_list_dict_pair_,name,_cget)(map->table, hash); \
|
M_C3(array_list_dict_pair_,name,_cget)(map->table, hash); \
|
||||||
@@ -153,8 +194,8 @@
|
|||||||
!M_C3(list_dict_pair_,name,_end_p)(it); \
|
!M_C3(list_dict_pair_,name,_end_p)(it); \
|
||||||
M_C3(list_dict_pair_,name,_next)(it)) { \
|
M_C3(list_dict_pair_,name,_next)(it)) { \
|
||||||
M_C3(dict_pair_,name,_t) *ref = M_C3(list_dict_pair_,name,_ref)(it); \
|
M_C3(dict_pair_,name,_t) *ref = M_C3(list_dict_pair_,name,_ref)(it); \
|
||||||
if (M_GET_EQUAL key_oplist ((*ref)->key, key)) \
|
if (M_GET_EQUAL key_oplist ((*ref)->key, key)) \
|
||||||
return &(*ref)->value; \
|
return &(*ref)->M_IF(isSet)(key, value); \
|
||||||
} \
|
} \
|
||||||
return NULL; \
|
return NULL; \
|
||||||
} \
|
} \
|
||||||
@@ -225,7 +266,8 @@
|
|||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C3(dict_,name,_set_at)(M_C3(dict_,name,_t) map, \
|
M_C3(dict_,name,_set_at)(M_C3(dict_,name,_t) map, \
|
||||||
const key_type key, const value_type value) \
|
const key_type key \
|
||||||
|
M_IF(isSet)(, M_DEFERRED_COMMA const value_type value)) \
|
||||||
{ \
|
{ \
|
||||||
DICTI_CONTRACT(name, map); \
|
DICTI_CONTRACT(name, map); \
|
||||||
\
|
\
|
||||||
@@ -244,7 +286,7 @@
|
|||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
M_C3(dict_pair_,name,_init_set2)(*M_C3(list_dict_pair_,name,_push_raw)(*list_ptr), \
|
M_C3(dict_pair_,name,_init_set2)(*M_C3(list_dict_pair_,name,_push_raw)(*list_ptr), \
|
||||||
key, value); \
|
key M_IF(isSet)(, M_DEFERRED_COMMA value)); \
|
||||||
map->used ++; \
|
map->used ++; \
|
||||||
if (map->used > map->upper_limit) \
|
if (map->used > map->upper_limit) \
|
||||||
M_C3(dicti_,name,_resize_up)(map); \
|
M_C3(dicti_,name,_resize_up)(map); \
|
||||||
@@ -430,7 +472,7 @@
|
|||||||
if (c == '}') return true; \
|
if (c == '}') return true; \
|
||||||
ungetc(c, file); \
|
ungetc(c, file); \
|
||||||
key_type key; \
|
key_type key; \
|
||||||
value_type value; \
|
M_IF(isSet)( ,value_type value); \
|
||||||
M_GET_INIT key_oplist (key); \
|
M_GET_INIT key_oplist (key); \
|
||||||
M_GET_INIT value_oplist (value); \
|
M_GET_INIT value_oplist (value); \
|
||||||
do { \
|
do { \
|
||||||
@@ -440,7 +482,8 @@
|
|||||||
if (c != ':') { c = 0; break; } \
|
if (c != ':') { c = 0; break; } \
|
||||||
b = M_GET_IN_STR value_oplist (value, file); \
|
b = M_GET_IN_STR value_oplist (value, file); \
|
||||||
if (!b) { c = 0; break; } \
|
if (!b) { c = 0; break; } \
|
||||||
M_C3(dict_, name, _set_at)(dict, key, value); \
|
M_C3(dict_, name, _set_at)(dict, key \
|
||||||
|
M_IF(isSet)( , M_DEFERRED_COMMA value)); \
|
||||||
c = fgetc(file); \
|
c = fgetc(file); \
|
||||||
} while (c == ',' && !feof(file) && !ferror(file)); \
|
} while (c == ',' && !feof(file) && !ferror(file)); \
|
||||||
M_GET_CLEAR key_oplist (key); \
|
M_GET_CLEAR key_oplist (key); \
|
||||||
@@ -450,16 +493,6 @@
|
|||||||
, /* no IN_STR */ ) \
|
, /* no IN_STR */ ) \
|
||||||
\
|
\
|
||||||
|
|
||||||
/* Define the oplist of a dictionnary.
|
|
||||||
USAGE: DICT_OPLIST(name[, oplist of the key type, oplist of the value type]) */
|
|
||||||
#define DICT_OPLIST(...) \
|
|
||||||
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
|
||||||
(DICTI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST ), \
|
|
||||||
DICTI_OPLIST(__VA_ARGS__ ))
|
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
|
||||||
|
|
||||||
/* Define the oplist of a dictionnary */
|
/* Define the oplist of a dictionnary */
|
||||||
#define DICTI_OPLIST(name, key_oplist, value_oplist) \
|
#define DICTI_OPLIST(name, key_oplist, value_oplist) \
|
||||||
(INIT(M_C3(dict_, name, _init)), \
|
(INIT(M_C3(dict_, name, _init)), \
|
||||||
|
|||||||
+20
-16
@@ -31,8 +31,9 @@ START_COVERAGE
|
|||||||
DICT_DEF2(str, string_t, STRING_OPLIST, string_t, STRING_OPLIST)
|
DICT_DEF2(str, string_t, STRING_OPLIST, string_t, STRING_OPLIST)
|
||||||
END_COVERAGE
|
END_COVERAGE
|
||||||
|
|
||||||
ARRAY_DEF(string, string_t, STRING_OPLIST)
|
DICT_SET_DEF2(setstr, string_t, STRING_OPLIST)
|
||||||
|
|
||||||
|
ARRAY_DEF(string, string_t, STRING_OPLIST)
|
||||||
array_string_t v;
|
array_string_t v;
|
||||||
|
|
||||||
static void init_data(int data_size)
|
static void init_data(int data_size)
|
||||||
@@ -103,6 +104,22 @@ static void check_io(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_set(void)
|
||||||
|
{
|
||||||
|
M_LET(str, STRING_OPLIST)
|
||||||
|
M_LET(set, DICT_SET_OPLIST(setstr, STRING_OPLIST)) {
|
||||||
|
for(int i = 0; i < 100; i++) {
|
||||||
|
string_printf(str, "%d", i);
|
||||||
|
dict_setstr_set_at(set, str);
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 100; i++) {
|
||||||
|
string_printf(str, "%d", i);
|
||||||
|
string_t *p = dict_setstr_get(set, str);
|
||||||
|
assert(string_equal_p (*p, str));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
dict_str_t dict;
|
dict_str_t dict;
|
||||||
@@ -167,20 +184,7 @@ int main(void)
|
|||||||
init_data(5000000);
|
init_data(5000000);
|
||||||
test_data();
|
test_data();
|
||||||
clear_data();
|
clear_data();
|
||||||
|
|
||||||
|
test_set();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
[ key1: value1,
|
|
||||||
key2: value2,
|
|
||||||
key3: value3]
|
|
||||||
|
|
||||||
a;b;"c;e";d;e;f
|
|
||||||
|
|
||||||
TOKEN:
|
|
||||||
* separator ; : , AND .
|
|
||||||
* ignore ' ' '\n'
|
|
||||||
* remove blanck
|
|
||||||
* handle " or ' or ( ) or [ ]
|
|
||||||
* recursive
|
|
||||||
*/
|
|
||||||
Reference in new issue
Block a user