Adding OUT_STR & GET_STR operators for variants
This commit is contained in:
1 parent
222cc98ddf
commit
b38a926f3c
3 files changed
+54
-5
No files matched your search
@@ -195,6 +195,9 @@
|
|||||||
/* Return 1 if comma inside the argument list, 0 otherwise */
|
/* Return 1 if comma inside the argument list, 0 otherwise */
|
||||||
#define M_COMMA_P(...) M_RET_ARG27(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, useless)
|
#define M_COMMA_P(...) M_RET_ARG27(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, useless)
|
||||||
|
|
||||||
|
/* Return the string representation of the evaluated x */
|
||||||
|
#define M_AS_STR(x) #x
|
||||||
|
|
||||||
/* Return 1 if the argument is 'empty', 0 otherwise.
|
/* Return 1 if the argument is 'empty', 0 otherwise.
|
||||||
Handle: EMPTY_P(), EMPTY_P(x), EMPTY_P(()) and EMPTY_P(,) and EMPTY_P(f) with #define f() 2,3 */
|
Handle: EMPTY_P(), EMPTY_P(x), EMPTY_P(()) and EMPTY_P(,) and EMPTY_P(f) with #define f() 2,3 */
|
||||||
#define M_EMPTYI_DETECT(...) 0, 1,
|
#define M_EMPTYI_DETECT(...) 0, 1,
|
||||||
|
|||||||
+48
-5
@@ -226,11 +226,50 @@
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
#define VARIANTI_DEFINE_MOVE(name, ...) \
|
#define VARIANTI_DEFINE_MOVE(name, ...) \
|
||||||
static inline void M_C(name, _move)(M_C(name,_t) el, M_C(name,_t) org) { \
|
static inline void M_C(name, _move)(M_C(name,_t) el, M_C(name,_t) org) { \
|
||||||
M_C(name, _clear)(el); \
|
M_C(name, _clear)(el); \
|
||||||
M_C(name, _init_move)(el , org); \
|
M_C(name, _init_move)(el , org); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VARIANTI_DEFINE_GET_STR(name, ...) \
|
||||||
|
static inline void M_C(name, _get_str)(string_t str, \
|
||||||
|
M_C(name,_t) const el, \
|
||||||
|
bool append) { \
|
||||||
|
assert (str != NULL && el != NULL); \
|
||||||
|
void (*func)(string_t, const char *); \
|
||||||
|
func = append ? string_cat_str : string_set_str; \
|
||||||
|
switch (el->type) { \
|
||||||
|
case M_C(name, _EMPTY): func(str, "@EMPTY@"); break; \
|
||||||
|
M_MAP2(VARIANTI_DEFINE_GET_STR_FUNC , name, __VA_ARGS__) \
|
||||||
|
default: assert(false); break; \
|
||||||
|
} \
|
||||||
|
string_push_back (str, '@'); \
|
||||||
|
}
|
||||||
|
#define VARIANTI_DEFINE_GET_STR_FUNC(name, a) \
|
||||||
|
case M_C3(name, _, VARIANTI_GET_FIELD a): \
|
||||||
|
func(str, "@" M_AS_STR(VARIANTI_GET_FIELD a) "@"); \
|
||||||
|
VARIANTI_GET_STR a (str, el -> value . VARIANTI_GET_FIELD a, true); \
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
#define VARIANTI_DEFINE_OUT_STR(name, ...) \
|
||||||
|
static inline void M_C(name, _out_str)(FILE *f, \
|
||||||
|
M_C(name,_t) const el) { \
|
||||||
|
assert (f != NULL && el != NULL); \
|
||||||
|
switch (el->type) { \
|
||||||
|
case M_C(name, _EMPTY): fprintf(f, "@EMPTY@"); break; \
|
||||||
|
M_MAP2(VARIANTI_DEFINE_OUT_STR_FUNC , name, __VA_ARGS__) \
|
||||||
|
default: assert(false); break; \
|
||||||
|
} \
|
||||||
|
fputc ('@', f); \
|
||||||
|
}
|
||||||
|
#define VARIANTI_DEFINE_OUT_STR_FUNC(name, a) \
|
||||||
|
case M_C3(name, _, VARIANTI_GET_FIELD a): \
|
||||||
|
fprintf(f, "@" M_AS_STR(VARIANTI_GET_FIELD a) "@"); \
|
||||||
|
VARIANTI_GET_OUT_STR a (f, el -> value . VARIANTI_GET_FIELD a); \
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define VARIANTI_OPLIST(name, ...) \
|
#define VARIANTI_OPLIST(name, ...) \
|
||||||
@@ -282,6 +321,10 @@
|
|||||||
(VARIANTI_DEFINE_HASH(name, __VA_ARGS__),) \
|
(VARIANTI_DEFINE_HASH(name, __VA_ARGS__),) \
|
||||||
M_IF(VARIANTI_ALL_EQUAL(__VA_ARGS__)) \
|
M_IF(VARIANTI_ALL_EQUAL(__VA_ARGS__)) \
|
||||||
(VARIANTI_DEFINE_EQUAL(name, __VA_ARGS__),) \
|
(VARIANTI_DEFINE_EQUAL(name, __VA_ARGS__),) \
|
||||||
|
M_IF(VARIANTI_ALL_GET_STR(__VA_ARGS__)) \
|
||||||
|
(VARIANTI_DEFINE_GET_STR(name, __VA_ARGS__),) \
|
||||||
|
M_IF(VARIANTI_ALL_OUT_STR(__VA_ARGS__)) \
|
||||||
|
(VARIANTI_DEFINE_OUT_STR(name, __VA_ARGS__),) \
|
||||||
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
||||||
(VARIANTI_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
|
(VARIANTI_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
|
||||||
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
M_IF(VARIANTI_ALL_INIT_MOVE(__VA_ARGS__)) \
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ test_triple(void)
|
|||||||
triple_clear(t);
|
triple_clear(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VARIANT_DEF2(single,
|
||||||
|
(s, string_t, STRING_OPLIST))
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
test_pair();
|
test_pair();
|
||||||
|
|||||||
Reference in new issue
Block a user