VARIANT: Oplist is now optional for their definition.

This commit is contained in:
Patrick Pelissier committed 2018-08-07 23:18:37 +02:00
1 parent 7d83603646
commit 1bb144e256
2 files changed
+57 -17

No files matched your search

+52 -17
View File
@@ -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__)
+5
View File
@@ -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;