VARIANT: Oplist is now optional for their definition.
This commit is contained in:
1 parent
7d83603646
commit
1bb144e256
2 files changed
+57
-17
No files matched your search
+52
-17
@@ -76,22 +76,57 @@
|
||||
|
||||
/********************************** INTERNAL ************************************/
|
||||
|
||||
#define VARIANTI_GET_FIELD(f,t,o) f
|
||||
#define VARIANTI_GET_TYPE(f,t,o) t
|
||||
#define VARIANTI_GET_INIT(f,t,o) M_GET_INIT o
|
||||
#define VARIANTI_GET_INIT_SET(f,t,o) M_GET_INIT_SET o
|
||||
#define VARIANTI_GET_INIT_MOVE(f,t,o) M_GET_INIT_MOVE o
|
||||
#define VARIANTI_GET_MOVE(f,t,o) M_GET_MOVE o
|
||||
#define VARIANTI_GET_SET(f,t,o) M_GET_SET o
|
||||
#define VARIANTI_GET_CLEAR(f,t,o) M_GET_CLEAR o
|
||||
#define VARIANTI_GET_CMP(f,t,o) M_GET_CMP o
|
||||
#define VARIANTI_GET_HASH(f,t,o) M_GET_HASH o
|
||||
#define VARIANTI_GET_EQUAL(f,t,o) M_GET_EQUAL o
|
||||
#define VARIANTI_GET_STR(f,t,o) M_GET_GET_STR o
|
||||
#define VARIANTI_GET_PARSE_STR(f,t,o) M_GET_PARSE_STR o
|
||||
#define VARIANTI_GET_OUT_STR(f,t,o) M_GET_OUT_STR o
|
||||
#define VARIANTI_GET_IN_STR(f,t,o) M_GET_IN_STR o
|
||||
#define VARIANTI_GET_SWAP(f,t,o) M_GET_SWAP o
|
||||
/* Get the field name, the type, the oplist or the methods
|
||||
based on the tuple (field, type, oplist) */
|
||||
#define VARIANTI_GET_FIELD2(f,t,o) f
|
||||
#define VARIANTI_GET_TYPE2(f,t,o) t
|
||||
#define VARIANTI_GET_OPLIST2(f,t,o) o
|
||||
#define VARIANTI_GET_INIT2(f,t,o) M_GET_INIT o
|
||||
#define VARIANTI_GET_INIT_SET2(f,t,o) M_GET_INIT_SET o
|
||||
#define VARIANTI_GET_INIT_MOVE2(f,t,o) M_GET_INIT_MOVE o
|
||||
#define VARIANTI_GET_MOVE2(f,t,o) M_GET_MOVE o
|
||||
#define VARIANTI_GET_SET2(f,t,o) M_GET_SET o
|
||||
#define VARIANTI_GET_CLEAR2(f,t,o) M_GET_CLEAR o
|
||||
#define VARIANTI_GET_CMP2(f,t,o) M_GET_CMP o
|
||||
#define VARIANTI_GET_HASH2(f,t,o) M_GET_HASH o
|
||||
#define VARIANTI_GET_EQUAL2(f,t,o) M_GET_EQUAL o
|
||||
#define VARIANTI_GET_STR2(f,t,o) M_GET_GET_STR o
|
||||
#define VARIANTI_GET_OUT_STR2(f,t,o) M_GET_OUT_STR o
|
||||
#define VARIANTI_GET_IN_STR2(f,t,o) M_GET_IN_STR o
|
||||
#define VARIANTI_GET_PARSE_STR2(f,t,o) M_GET_PARSE_STR o
|
||||
#define VARIANTI_GET_SWAP2(f,t,o) M_GET_SWAP o
|
||||
|
||||
/* Transform (f,t) into (f,t,oplist) or (f,t,o) into (f,t,o).
|
||||
USAGE:
|
||||
VARIANTI_EVAL(GET_MACRO, tuple)
|
||||
*/
|
||||
#define VARIANTI_EVAL_FIELD(f, ...) \
|
||||
M_IF_NARGS_EQ1(__VA_ARGS__)( (f, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)), (f, __VA_ARGS__) )
|
||||
#define VARIANTI_EVAL2(f, a) f a
|
||||
#define VARIANTI_EVAL(f, a) VARIANTI_EVAL2(f, VARIANTI_EVAL_FIELD a)
|
||||
|
||||
/* Get the field name, the type, the oplist or the methods
|
||||
based on the tuple (field, type, oplist) or the typle (field, type)
|
||||
In the last case, it get the oplist from a global one or a default one.
|
||||
*/
|
||||
#define VARIANTI_GET_FIELD(...) VARIANTI_EVAL(VARIANTI_GET_FIELD2, (__VA_ARGS__))
|
||||
#define VARIANTI_GET_TYPE(...) VARIANTI_EVAL(VARIANTI_GET_TYPE2, (__VA_ARGS__))
|
||||
#define VARIANTI_GET_OPLIST(...) VARIANTI_EVAL(VARIANTI_GET_OPLIST2, (__VA_ARGS__))
|
||||
#define VARIANTI_GET_INIT(...) VARIANTI_EVAL(VARIANTI_GET_INIT2, (__VA_ARGS__))
|
||||
#define VARIANTI_GET_INIT_SET(...) VARIANTI_EVAL(VARIANTI_GET_INIT_SET2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_INIT_MOVE(...) VARIANTI_EVAL(VARIANTI_GET_INIT_MOVE2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_MOVE(...) VARIANTI_EVAL(VARIANTI_GET_MOVE2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_SET(...) VARIANTI_EVAL(VARIANTI_GET_SET2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_CLEAR(...) VARIANTI_EVAL(VARIANTI_GET_CLEAR2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_CMP(...) VARIANTI_EVAL(VARIANTI_GET_CMP2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_HASH(...) VARIANTI_EVAL(VARIANTI_GET_HASH2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_EQUAL(...) VARIANTI_EVAL(VARIANTI_GET_EQUAL2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_STR(...) VARIANTI_EVAL(VARIANTI_GET_STR2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_OUT_STR(...) VARIANTI_EVAL(VARIANTI_GET_OUT_STR2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_IN_STR(...) VARIANTI_EVAL(VARIANTI_GET_IN_STR2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_PARSE_STR(...) VARIANTI_EVAL(VARIANTI_GET_PARSE_STR2,(__VA_ARGS__))
|
||||
#define VARIANTI_GET_SWAP(...) VARIANTI_EVAL(VARIANTI_GET_SWAP2,(__VA_ARGS__))
|
||||
|
||||
|
||||
#define VARIANTI_DEFINE_TYPE(name, ...) \
|
||||
enum M_C(name, _enum) { M_C(name, _EMPTY) \
|
||||
@@ -484,7 +519,7 @@
|
||||
#define VARIANTI_TEST_METHOD2_P(method, f, t, op) \
|
||||
M_TEST_METHOD_P(method, op)
|
||||
#define VARIANTI_TEST_METHOD_P(method, trio) \
|
||||
M_APPLY(VARIANTI_TEST_METHOD2_P, method, M_OPFLAT trio)
|
||||
M_APPLY(VARIANTI_TEST_METHOD2_P, method, VARIANTI_EVAL(M_OPFLAT, trio))
|
||||
|
||||
#define VARIANTI_ALL_EQUAL(...) \
|
||||
M_REDUCE2(VARIANTI_TEST_METHOD_P, M_AND, EQUAL, __VA_ARGS__)
|
||||
|
||||
@@ -33,6 +33,11 @@ VARIANT_DEF2(pair,
|
||||
(value, float, M_DEFAULT_OPLIST) )
|
||||
END_COVERAGE
|
||||
|
||||
VARIANT_DEF2(flux,
|
||||
(z, int),
|
||||
(f, float, M_DEFAULT_OPLIST),
|
||||
(s, string_t) )
|
||||
|
||||
static void test_pair(void)
|
||||
{
|
||||
pair_t p;
|
||||
|
||||
Reference in new issue
Block a user