Factorization of name usage

This commit is contained in:
Patrick Pelissier committed 2020-10-03 14:07:14 +02:00
1 parent 364101592b
commit b3fa63c971
1 file changed
+38 -38
+38 -38
View File
@@ -35,7 +35,7 @@
VARIANT_DEF2(name, [(field1, type1, oplist1), (field2, type2, oplist2), ...] ) */
#define VARIANT_DEF2(name, ...) \
M_BEGIN_PROTECTED_CODE \
VARIANTI_DEF2_P1( (name VARIANTI_INJECT_GLOBAL(__VA_ARGS__)) ) \
VARIANTI_DEF2_P1( (name, M_C(name, _t) VARIANTI_INJECT_GLOBAL(__VA_ARGS__)) ) \
M_END_PROTECTED_CODE
@@ -82,16 +82,16 @@
M_OPLIST_P(M_RET_ARG3 a)
/* Validate the oplist before going further */
#define VARIANTI_DEF2_P2(name, ...) \
VARIANTI_IF_ALL_OPLIST(__VA_ARGS__)(VARIANTI_DEF2_P3, VARIANTI_DEF2_FAILURE)(name, __VA_ARGS__)
#define VARIANTI_DEF2_P2(name, name_t, ...) \
VARIANTI_IF_ALL_OPLIST(__VA_ARGS__)(VARIANTI_DEF2_P3, VARIANTI_DEF2_FAILURE)(name, name_t, __VA_ARGS__)
/* Stop processing with a compilation failure */
#define VARIANTI_DEF2_FAILURE(name, ...) \
#define VARIANTI_DEF2_FAILURE(name, name_t, ...) \
M_STATIC_FAILURE(M_LIB_NOT_AN_OPLIST, "(VARIANT_DEF2): at least one of the given argument is not a valid oplist: " #__VA_ARGS__)
/* Define the variant */
#define VARIANTI_DEF2_P3(name, ...) \
VARIANTI_DEFINE_TYPE(name, __VA_ARGS__) \
#define VARIANTI_DEF2_P3(name, name_t, ...) \
VARIANTI_DEFINE_TYPE(name, name_t, __VA_ARGS__) \
VARIANTI_CONTROL_ALL_OPLIST(name, __VA_ARGS__) \
VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \
VARIANTI_DEFINE_CLEAR(name, __VA_ARGS__) \
@@ -171,7 +171,7 @@
#define VARIANTI_CALL_SWAP(t, ...) M_APPLY_API(VARIANTI_GET_SWAP t, VARIANTI_GET_OPLIST t, __VA_ARGS__)
/* Define the type */
#define VARIANTI_DEFINE_TYPE(name, ...) \
#define VARIANTI_DEFINE_TYPE(name, name_t, ...) \
/* Define enum of all types of the variant */ \
enum M_C(name, _enum) { M_C(name, _EMPTY) \
M_MAP2(VARIANTI_DEFINE_UNION_ELE, name, __VA_ARGS__) \
@@ -186,12 +186,12 @@
union { \
M_MAP(VARIANTI_DEFINE_TYPE_ELE , __VA_ARGS__) \
} value; \
} M_C(name,_t)[1]; \
} name_t[1]; \
\
typedef struct M_C(name, _s) *M_C(name, _ptr); \
typedef const struct M_C(name, _s) *M_C(name, _srcptr); \
/* Define internal type for oplist */ \
typedef M_C(name, _t) M_C(name, _ct);
typedef name_t M_C(name, _ct);
#define VARIANTI_DEFINE_UNION_ELE(name, a) \
, M_C4(name, _, VARIANTI_GET_FIELD a, _value)
@@ -211,15 +211,15 @@
/* Define the INIT function. Init the variant to empty */
#define VARIANTI_DEFINE_INIT(name, ...) \
static inline void M_C(name, _init)(M_C(name,_t) my) { \
static inline void M_C(name, _init)(M_C(name,_ct) my) { \
my->type = M_C(name, _EMPTY); \
}
/* Define the INIT_SET function. */
#define VARIANTI_DEFINE_INIT_SET(name, ...) \
static inline void M_C(name, _init_set)(M_C(name,_t) my , \
M_C(name,_t) const org) { \
static inline void M_C(name, _init_set)(M_C(name,_ct) my , \
M_C(name,_ct) const org) { \
VARIANTI_CONTRACT(name, org); \
my->type = org->type; \
switch (org->type) { \
@@ -238,8 +238,8 @@
/* Define the SET function. */
#define VARIANTI_DEFINE_SET(name, ...) \
static inline void M_C(name, _set)(M_C(name,_t) my , \
M_C(name,_t) const org) { \
static inline void M_C(name, _set)(M_C(name,_ct) my , \
M_C(name,_ct) const org) { \
VARIANTI_CONTRACT(name, my); \
VARIANTI_CONTRACT(name, org); \
if (my->type != org->type) { \
@@ -265,7 +265,7 @@
/* Define the CLEAR function. */
#define VARIANTI_DEFINE_CLEAR(name, ...) \
static inline void M_C(name, _clear)(M_C(name,_t) my) { \
static inline void M_C(name, _clear)(M_C(name,_ct) my) { \
VARIANTI_CONTRACT(name, my); \
switch (my->type) { \
case M_C(name, _EMPTY): break; \
@@ -283,12 +283,12 @@
/* Define the TEST_P function. */
#define VARIANTI_DEFINE_TEST_P(name, ...) \
static inline bool M_C(name, _empty_p)(M_C(name,_t) const my) { \
static inline bool M_C(name, _empty_p)(M_C(name,_ct) const my) { \
VARIANTI_CONTRACT(name, my); \
return my->type == M_C(name, _EMPTY); \
} \
static inline enum M_C(name, _enum) \
M_C(name, _type)(M_C(name,_t) my) { \
M_C(name, _type)(M_C(name,_ct) my) { \
VARIANTI_CONTRACT(name, my); \
return my->type; \
} \
@@ -296,7 +296,7 @@
#define VARIANTI_DEFINE_TEST_FUNC(name, a) \
static inline bool \
M_C4(name, _, VARIANTI_GET_FIELD a, _p)(M_C(name,_t) const my) { \
M_C4(name, _, VARIANTI_GET_FIELD a, _p)(M_C(name,_ct) const my) { \
VARIANTI_CONTRACT(name, my); \
return my->type == M_C4(name, _, VARIANTI_GET_FIELD a, _value); \
}
@@ -308,7 +308,7 @@
#define VARIANTI_DEFINE_INIT_FIELD_FUNC(name, a) \
static inline void \
M_C3(name, _init_, VARIANTI_GET_FIELD a)(M_C(name,_t) my) { \
M_C3(name, _init_, VARIANTI_GET_FIELD a)(M_C(name,_ct) my) { \
/* Reinit variable with the given value */ \
my->type = M_C4(name, _, VARIANTI_GET_FIELD a, _value); \
VARIANTI_CALL_INIT(a, my -> value. VARIANTI_GET_FIELD a); \
@@ -321,7 +321,7 @@
#define VARIANTI_DEFINE_INIT_SETTER_FIELD_FUNC(name, a) \
static inline void \
M_C3(name, _init_set_, VARIANTI_GET_FIELD a)(M_C(name,_t) my, \
M_C3(name, _init_set_, VARIANTI_GET_FIELD a)(M_C(name,_ct) my, \
VARIANTI_GET_TYPE a const VARIANTI_GET_FIELD a ) { \
my->type = M_C4(name, _, VARIANTI_GET_FIELD a, _value); \
VARIANTI_CALL_INIT_SET(a, my -> value. VARIANTI_GET_FIELD a, \
@@ -335,7 +335,7 @@
#define VARIANTI_DEFINE_SETTER_FIELD_FUNC(name, a) \
static inline void \
M_C3(name, _set_, VARIANTI_GET_FIELD a)(M_C(name,_t) my, \
M_C3(name, _set_, VARIANTI_GET_FIELD a)(M_C(name,_ct) my, \
VARIANTI_GET_TYPE a const VARIANTI_GET_FIELD a ) { \
VARIANTI_CONTRACT(name, my); \
if (my->type == M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \
@@ -357,7 +357,7 @@
#define VARIANTI_DEFINE_GETTER_FIELD_FUNC(name, a) \
static inline VARIANTI_GET_TYPE a * \
M_C3(name, _get_, VARIANTI_GET_FIELD a)(M_C(name,_t) my) { \
M_C3(name, _get_, VARIANTI_GET_FIELD a)(M_C(name,_ct) my) { \
VARIANTI_CONTRACT(name, my); \
if (my->type != M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \
return NULL; \
@@ -366,7 +366,7 @@
} \
\
static inline VARIANTI_GET_TYPE a const * \
M_C3(name, _cget_, VARIANTI_GET_FIELD a)(M_C(name,_t) const my) { \
M_C3(name, _cget_, VARIANTI_GET_FIELD a)(M_C(name,_ct) const my) { \
VARIANTI_CONTRACT(name, my); \
if (my->type != M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \
return NULL; \
@@ -377,8 +377,8 @@
/* Define the EQUAL_P function. */
#define VARIANTI_DEFINE_EQUAL(name, ...) \
static inline bool M_C(name, _equal_p)(M_C(name,_t) const e1 , \
M_C(name,_t) const e2) { \
static inline bool M_C(name, _equal_p)(M_C(name,_ct) const e1 , \
M_C(name,_ct) const e2) { \
bool b; \
VARIANTI_CONTRACT(name, e1); \
VARIANTI_CONTRACT(name, e2); \
@@ -401,7 +401,7 @@
/* Define the HASH function. */
#define VARIANTI_DEFINE_HASH(name, ...) \
static inline size_t M_C(name, _hash)(M_C(name,_t) const e1) { \
static inline size_t M_C(name, _hash)(M_C(name,_ct) const e1) { \
VARIANTI_CONTRACT(name, e1); \
M_HASH_DECL(hash); \
M_HASH_UP (hash, (unsigned int) (e1 -> type)); \
@@ -422,7 +422,7 @@
/* Define the INIT_MOVE function. */
#define VARIANTI_DEFINE_INIT_MOVE(name, ...) \
static inline void \
M_C(name, _init_move)(M_C(name,_t) el, M_C(name,_t) org) { \
M_C(name, _init_move)(M_C(name,_ct) el, M_C(name,_ct) org) { \
VARIANTI_CONTRACT(name, org); \
el -> type = org -> type; \
switch (el->type) { \
@@ -446,7 +446,7 @@
*/
#define VARIANTI_DEFINE_MOVE(name, ...) \
static inline void \
M_C(name, _move)(M_C(name,_t) el, M_C(name,_t) org) { \
M_C(name, _move)(M_C(name,_ct) el, M_C(name,_ct) org) { \
VARIANTI_CONTRACT(name, el); \
VARIANTI_CONTRACT(name, org); \
M_C(name, _clear)(el); \
@@ -460,7 +460,7 @@
#define VARIANTI_DEFINE_MOVER_FUNC(name, a) \
static inline void \
M_C3(name, _move_, VARIANTI_GET_FIELD a)(M_C(name,_t) my, \
M_C3(name, _move_, VARIANTI_GET_FIELD a)(M_C(name,_ct) my, \
VARIANTI_GET_TYPE a VARIANTI_GET_FIELD a ) { \
VARIANTI_CONTRACT(name, my); \
M_C(name, _clear)(my); \
@@ -474,7 +474,7 @@
/* Define the SWAP function */
#define VARIANTI_DEFINE_SWAP(name, ...) \
static inline void \
M_C(name, _swap)(M_C(name,_t) el1, M_C(name,_t) el2) { \
M_C(name, _swap)(M_C(name,_ct) el1, M_C(name,_ct) el2) { \
VARIANTI_CONTRACT(name, el1); \
VARIANTI_CONTRACT(name, el2); \
if (el1->type == el2->type) { \
@@ -484,7 +484,7 @@
default: assert(false); break; \
} \
} else { \
M_C(name,_t) tmp; \
M_C(name,_ct) tmp; \
VARIANTI_IF_ALL(INIT_MOVE, __VA_ARGS__) \
( /* NOTE: Slow implementation */ \
M_C(name, _init_move)(tmp, el1); \
@@ -510,7 +510,7 @@
/* Define the GET_STR function */
#define VARIANTI_DEFINE_GET_STR(name, ...) \
static inline void M_C(name, _get_str)(string_t str, \
M_C(name,_t) const el, \
M_C(name,_ct) const el, \
bool append) { \
VARIANTI_CONTRACT(name, el); \
assert (str != NULL); \
@@ -533,7 +533,7 @@
/* Define the PARSE_STR function */
#define VARIANTI_DEFINE_PARSE_STR(name, ...) \
static inline bool M_C(name, _parse_str)(M_C(name,_t) el, \
static inline bool M_C(name, _parse_str)(M_C(name,_ct) el, \
const char str[], \
const char **endp) { \
VARIANTI_CONTRACT(name, el); \
@@ -577,7 +577,7 @@
/* Define the OUT_STR function */
#define VARIANTI_DEFINE_OUT_STR(name, ...) \
static inline void M_C(name, _out_str)(FILE *f, \
M_C(name,_t) const el) { \
M_C(name,_ct) const el) { \
VARIANTI_CONTRACT(name, el); \
assert (f != NULL); \
switch (el->type) { \
@@ -597,7 +597,7 @@
/* Define the IN_STR function */
#define VARIANTI_DEFINE_IN_STR(name, ...) \
static inline bool M_C(name, _in_str)(M_C(name,_t) el, \
static inline bool M_C(name, _in_str)(M_C(name,_ct) el, \
FILE *f) { \
VARIANTI_CONTRACT(name, el); \
assert (f != NULL); \
@@ -641,7 +641,7 @@
#define VARIANTI_DEFINE_OUT_SERIAL(name, ...) \
static inline m_serial_return_code_t \
M_C(name, _out_serial)(m_serial_write_t f, \
M_C(name,_t) const el) { \
M_C(name,_ct) const el) { \
VARIANTI_CONTRACT(name, el); \
const int field_max = M_NARGS(__VA_ARGS__); \
static const char *const field_name[] = \
@@ -671,7 +671,7 @@
/* Define the IN_SERIAL function */
#define VARIANTI_DEFINE_IN_SERIAL(name, ...) \
static inline m_serial_return_code_t \
M_C(name, _in_serial)(M_C(name,_t) el, \
M_C(name, _in_serial)(M_C(name,_ct) el, \
m_serial_read_t f) { \
VARIANTI_CONTRACT(name, el); \
const int field_max = M_NARGS(__VA_ARGS__); \
@@ -704,7 +704,7 @@
/* Define the CLEAN function */
#define VARIANTI_DEFINE_CLEAN_FUNC(name, ...) \
static inline void M_C(name, _clean)(M_C(name,_t) my) \
static inline void M_C(name, _clean)(M_C(name,_ct) my) \
{ \
VARIANTI_CONTRACT(name, my); \
M_C(name, _clear)(my); \