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), ...] ) */ VARIANT_DEF2(name, [(field1, type1, oplist1), (field2, type2, oplist2), ...] ) */
#define VARIANT_DEF2(name, ...) \ #define VARIANT_DEF2(name, ...) \
M_BEGIN_PROTECTED_CODE \ 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 M_END_PROTECTED_CODE
@@ -82,16 +82,16 @@
M_OPLIST_P(M_RET_ARG3 a) M_OPLIST_P(M_RET_ARG3 a)
/* Validate the oplist before going further */ /* Validate the oplist before going further */
#define VARIANTI_DEF2_P2(name, ...) \ #define VARIANTI_DEF2_P2(name, name_t, ...) \
VARIANTI_IF_ALL_OPLIST(__VA_ARGS__)(VARIANTI_DEF2_P3, VARIANTI_DEF2_FAILURE)(name, __VA_ARGS__) VARIANTI_IF_ALL_OPLIST(__VA_ARGS__)(VARIANTI_DEF2_P3, VARIANTI_DEF2_FAILURE)(name, name_t, __VA_ARGS__)
/* Stop processing with a compilation failure */ /* 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__) 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 the variant */
#define VARIANTI_DEF2_P3(name, ...) \ #define VARIANTI_DEF2_P3(name, name_t, ...) \
VARIANTI_DEFINE_TYPE(name, __VA_ARGS__) \ VARIANTI_DEFINE_TYPE(name, name_t, __VA_ARGS__) \
VARIANTI_CONTROL_ALL_OPLIST(name, __VA_ARGS__) \ VARIANTI_CONTROL_ALL_OPLIST(name, __VA_ARGS__) \
VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \ VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \
VARIANTI_DEFINE_CLEAR(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 VARIANTI_CALL_SWAP(t, ...) M_APPLY_API(VARIANTI_GET_SWAP t, VARIANTI_GET_OPLIST t, __VA_ARGS__)
/* Define the type */ /* Define the type */
#define VARIANTI_DEFINE_TYPE(name, ...) \ #define VARIANTI_DEFINE_TYPE(name, name_t, ...) \
/* Define enum of all types of the variant */ \ /* Define enum of all types of the variant */ \
enum M_C(name, _enum) { M_C(name, _EMPTY) \ enum M_C(name, _enum) { M_C(name, _EMPTY) \
M_MAP2(VARIANTI_DEFINE_UNION_ELE, name, __VA_ARGS__) \ M_MAP2(VARIANTI_DEFINE_UNION_ELE, name, __VA_ARGS__) \
@@ -186,12 +186,12 @@
union { \ union { \
M_MAP(VARIANTI_DEFINE_TYPE_ELE , __VA_ARGS__) \ M_MAP(VARIANTI_DEFINE_TYPE_ELE , __VA_ARGS__) \
} value; \ } value; \
} M_C(name,_t)[1]; \ } name_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); \
/* Define internal type for oplist */ \ /* 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) \ #define VARIANTI_DEFINE_UNION_ELE(name, a) \
, M_C4(name, _, VARIANTI_GET_FIELD a, _value) , M_C4(name, _, VARIANTI_GET_FIELD a, _value)
@@ -211,15 +211,15 @@
/* Define the INIT function. Init the variant to empty */ /* Define the INIT function. Init the variant to empty */
#define VARIANTI_DEFINE_INIT(name, ...) \ #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); \ my->type = M_C(name, _EMPTY); \
} }
/* Define the INIT_SET function. */ /* Define the INIT_SET function. */
#define VARIANTI_DEFINE_INIT_SET(name, ...) \ #define VARIANTI_DEFINE_INIT_SET(name, ...) \
static inline void M_C(name, _init_set)(M_C(name,_t) my , \ static inline void M_C(name, _init_set)(M_C(name,_ct) my , \
M_C(name,_t) const org) { \ M_C(name,_ct) const org) { \
VARIANTI_CONTRACT(name, org); \ VARIANTI_CONTRACT(name, org); \
my->type = org->type; \ my->type = org->type; \
switch (org->type) { \ switch (org->type) { \
@@ -238,8 +238,8 @@
/* Define the SET function. */ /* Define the SET function. */
#define VARIANTI_DEFINE_SET(name, ...) \ #define VARIANTI_DEFINE_SET(name, ...) \
static inline void M_C(name, _set)(M_C(name,_t) my , \ static inline void M_C(name, _set)(M_C(name,_ct) my , \
M_C(name,_t) const org) { \ M_C(name,_ct) const org) { \
VARIANTI_CONTRACT(name, my); \ VARIANTI_CONTRACT(name, my); \
VARIANTI_CONTRACT(name, org); \ VARIANTI_CONTRACT(name, org); \
if (my->type != org->type) { \ if (my->type != org->type) { \
@@ -265,7 +265,7 @@
/* Define the CLEAR function. */ /* Define the CLEAR function. */
#define VARIANTI_DEFINE_CLEAR(name, ...) \ #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); \ VARIANTI_CONTRACT(name, my); \
switch (my->type) { \ switch (my->type) { \
case M_C(name, _EMPTY): break; \ case M_C(name, _EMPTY): break; \
@@ -283,12 +283,12 @@
/* Define the TEST_P function. */ /* Define the TEST_P function. */
#define VARIANTI_DEFINE_TEST_P(name, ...) \ #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); \ VARIANTI_CONTRACT(name, my); \
return my->type == M_C(name, _EMPTY); \ return my->type == M_C(name, _EMPTY); \
} \ } \
static inline enum M_C(name, _enum) \ 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); \ VARIANTI_CONTRACT(name, my); \
return my->type; \ return my->type; \
} \ } \
@@ -296,7 +296,7 @@
#define VARIANTI_DEFINE_TEST_FUNC(name, a) \ #define VARIANTI_DEFINE_TEST_FUNC(name, a) \
static inline bool \ 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); \ VARIANTI_CONTRACT(name, my); \
return my->type == M_C4(name, _, VARIANTI_GET_FIELD a, _value); \ return my->type == M_C4(name, _, VARIANTI_GET_FIELD a, _value); \
} }
@@ -308,7 +308,7 @@
#define VARIANTI_DEFINE_INIT_FIELD_FUNC(name, a) \ #define VARIANTI_DEFINE_INIT_FIELD_FUNC(name, a) \
static inline void \ 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 */ \ /* Reinit variable with the given value */ \
my->type = M_C4(name, _, VARIANTI_GET_FIELD a, _value); \ my->type = M_C4(name, _, VARIANTI_GET_FIELD a, _value); \
VARIANTI_CALL_INIT(a, my -> value. VARIANTI_GET_FIELD a); \ VARIANTI_CALL_INIT(a, my -> value. VARIANTI_GET_FIELD a); \
@@ -321,7 +321,7 @@
#define VARIANTI_DEFINE_INIT_SETTER_FIELD_FUNC(name, a) \ #define VARIANTI_DEFINE_INIT_SETTER_FIELD_FUNC(name, a) \
static inline void \ 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 ) { \ VARIANTI_GET_TYPE a const VARIANTI_GET_FIELD a ) { \
my->type = M_C4(name, _, VARIANTI_GET_FIELD a, _value); \ my->type = M_C4(name, _, VARIANTI_GET_FIELD a, _value); \
VARIANTI_CALL_INIT_SET(a, my -> value. VARIANTI_GET_FIELD a, \ VARIANTI_CALL_INIT_SET(a, my -> value. VARIANTI_GET_FIELD a, \
@@ -335,7 +335,7 @@
#define VARIANTI_DEFINE_SETTER_FIELD_FUNC(name, a) \ #define VARIANTI_DEFINE_SETTER_FIELD_FUNC(name, a) \
static inline void \ 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_GET_TYPE a const VARIANTI_GET_FIELD a ) { \
VARIANTI_CONTRACT(name, my); \ VARIANTI_CONTRACT(name, my); \
if (my->type == M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \ if (my->type == M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \
@@ -357,7 +357,7 @@
#define VARIANTI_DEFINE_GETTER_FIELD_FUNC(name, a) \ #define VARIANTI_DEFINE_GETTER_FIELD_FUNC(name, a) \
static inline VARIANTI_GET_TYPE 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); \ VARIANTI_CONTRACT(name, my); \
if (my->type != M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \ if (my->type != M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \
return NULL; \ return NULL; \
@@ -366,7 +366,7 @@
} \ } \
\ \
static inline VARIANTI_GET_TYPE a const * \ 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); \ VARIANTI_CONTRACT(name, my); \
if (my->type != M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \ if (my->type != M_C4(name, _, VARIANTI_GET_FIELD a, _value) ) { \
return NULL; \ return NULL; \
@@ -377,8 +377,8 @@
/* Define the EQUAL_P function. */ /* Define the EQUAL_P function. */
#define VARIANTI_DEFINE_EQUAL(name, ...) \ #define VARIANTI_DEFINE_EQUAL(name, ...) \
static inline bool M_C(name, _equal_p)(M_C(name,_t) const e1 , \ static inline bool M_C(name, _equal_p)(M_C(name,_ct) const e1 , \
M_C(name,_t) const e2) { \ M_C(name,_ct) const e2) { \
bool b; \ bool b; \
VARIANTI_CONTRACT(name, e1); \ VARIANTI_CONTRACT(name, e1); \
VARIANTI_CONTRACT(name, e2); \ VARIANTI_CONTRACT(name, e2); \
@@ -401,7 +401,7 @@
/* Define the HASH function. */ /* Define the HASH function. */
#define VARIANTI_DEFINE_HASH(name, ...) \ #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); \ VARIANTI_CONTRACT(name, e1); \
M_HASH_DECL(hash); \ M_HASH_DECL(hash); \
M_HASH_UP (hash, (unsigned int) (e1 -> type)); \ M_HASH_UP (hash, (unsigned int) (e1 -> type)); \
@@ -422,7 +422,7 @@
/* Define the INIT_MOVE function. */ /* Define the INIT_MOVE function. */
#define VARIANTI_DEFINE_INIT_MOVE(name, ...) \ #define VARIANTI_DEFINE_INIT_MOVE(name, ...) \
static inline void \ 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); \ VARIANTI_CONTRACT(name, org); \
el -> type = org -> type; \ el -> type = org -> type; \
switch (el->type) { \ switch (el->type) { \
@@ -446,7 +446,7 @@
*/ */
#define VARIANTI_DEFINE_MOVE(name, ...) \ #define VARIANTI_DEFINE_MOVE(name, ...) \
static inline void \ 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, el); \
VARIANTI_CONTRACT(name, org); \ VARIANTI_CONTRACT(name, org); \
M_C(name, _clear)(el); \ M_C(name, _clear)(el); \
@@ -460,7 +460,7 @@
#define VARIANTI_DEFINE_MOVER_FUNC(name, a) \ #define VARIANTI_DEFINE_MOVER_FUNC(name, a) \
static inline void \ 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_GET_TYPE a VARIANTI_GET_FIELD a ) { \
VARIANTI_CONTRACT(name, my); \ VARIANTI_CONTRACT(name, my); \
M_C(name, _clear)(my); \ M_C(name, _clear)(my); \
@@ -474,7 +474,7 @@
/* Define the SWAP function */ /* Define the SWAP function */
#define VARIANTI_DEFINE_SWAP(name, ...) \ #define VARIANTI_DEFINE_SWAP(name, ...) \
static inline void \ 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, el1); \
VARIANTI_CONTRACT(name, el2); \ VARIANTI_CONTRACT(name, el2); \
if (el1->type == el2->type) { \ if (el1->type == el2->type) { \
@@ -484,7 +484,7 @@
default: assert(false); break; \ default: assert(false); break; \
} \ } \
} else { \ } else { \
M_C(name,_t) tmp; \ M_C(name,_ct) tmp; \
VARIANTI_IF_ALL(INIT_MOVE, __VA_ARGS__) \ VARIANTI_IF_ALL(INIT_MOVE, __VA_ARGS__) \
( /* NOTE: Slow implementation */ \ ( /* NOTE: Slow implementation */ \
M_C(name, _init_move)(tmp, el1); \ M_C(name, _init_move)(tmp, el1); \
@@ -510,7 +510,7 @@
/* Define the GET_STR function */ /* Define the GET_STR function */
#define VARIANTI_DEFINE_GET_STR(name, ...) \ #define VARIANTI_DEFINE_GET_STR(name, ...) \
static inline void M_C(name, _get_str)(string_t str, \ 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) { \ bool append) { \
VARIANTI_CONTRACT(name, el); \ VARIANTI_CONTRACT(name, el); \
assert (str != NULL); \ assert (str != NULL); \
@@ -533,7 +533,7 @@
/* Define the PARSE_STR function */ /* Define the PARSE_STR function */
#define VARIANTI_DEFINE_PARSE_STR(name, ...) \ #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 str[], \
const char **endp) { \ const char **endp) { \
VARIANTI_CONTRACT(name, el); \ VARIANTI_CONTRACT(name, el); \
@@ -577,7 +577,7 @@
/* Define the OUT_STR function */ /* Define the OUT_STR function */
#define VARIANTI_DEFINE_OUT_STR(name, ...) \ #define VARIANTI_DEFINE_OUT_STR(name, ...) \
static inline void M_C(name, _out_str)(FILE *f, \ 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); \ VARIANTI_CONTRACT(name, el); \
assert (f != NULL); \ assert (f != NULL); \
switch (el->type) { \ switch (el->type) { \
@@ -597,7 +597,7 @@
/* Define the IN_STR function */ /* Define the IN_STR function */
#define VARIANTI_DEFINE_IN_STR(name, ...) \ #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) { \ FILE *f) { \
VARIANTI_CONTRACT(name, el); \ VARIANTI_CONTRACT(name, el); \
assert (f != NULL); \ assert (f != NULL); \
@@ -641,7 +641,7 @@
#define VARIANTI_DEFINE_OUT_SERIAL(name, ...) \ #define VARIANTI_DEFINE_OUT_SERIAL(name, ...) \
static inline m_serial_return_code_t \ static inline m_serial_return_code_t \
M_C(name, _out_serial)(m_serial_write_t f, \ 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); \ VARIANTI_CONTRACT(name, el); \
const int field_max = M_NARGS(__VA_ARGS__); \ const int field_max = M_NARGS(__VA_ARGS__); \
static const char *const field_name[] = \ static const char *const field_name[] = \
@@ -671,7 +671,7 @@
/* Define the IN_SERIAL function */ /* Define the IN_SERIAL function */
#define VARIANTI_DEFINE_IN_SERIAL(name, ...) \ #define VARIANTI_DEFINE_IN_SERIAL(name, ...) \
static inline m_serial_return_code_t \ 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) { \ m_serial_read_t f) { \
VARIANTI_CONTRACT(name, el); \ VARIANTI_CONTRACT(name, el); \
const int field_max = M_NARGS(__VA_ARGS__); \ const int field_max = M_NARGS(__VA_ARGS__); \
@@ -704,7 +704,7 @@
/* Define the CLEAN function */ /* Define the CLEAN function */
#define VARIANTI_DEFINE_CLEAN_FUNC(name, ...) \ #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); \ VARIANTI_CONTRACT(name, my); \
M_C(name, _clear)(my); \ M_C(name, _clear)(my); \