Add CLEAN method for tuple.

This commit is contained in:
Patrick Pelissier committed 2018-08-13 20:05:32 +02:00
1 parent 7d5608ca0e
commit 822f9aacf6
2 files changed
+31 -2

No files matched your search

+18 -2
View File
@@ -29,7 +29,7 @@
/* Define the tuple type and functions.
USAGE:
TUPLE_DEF2(name, [(field1, type1, oplist1), (field2, type2, oplist2), ...] ) */
TUPLE_DEF2(name, [(field1, type1[, oplist1]), (field2, type2[, oplist2]), ...] ) */
#define TUPLE_DEF2(name, ...) \
TUPLE_DEFINE_TYPE(name, __VA_ARGS__) \
TUPLE_DEFINE_ENUM(name, __VA_ARGS__) \
@@ -63,7 +63,10 @@
M_IF(TUPLE_ALL_MOVE(__VA_ARGS__)) \
(TUPLE_DEFINE_MOVE(name, __VA_ARGS__),) \
M_IF(TUPLE_ALL_SWAP(__VA_ARGS__)) \
(TUPLE_DEFINE_SWAP(name, __VA_ARGS__),)
(TUPLE_DEFINE_SWAP(name, __VA_ARGS__),) \
M_IF(TUPLE_ALL_CLEAN(__VA_ARGS__)) \
(TUPLE_DEFINE_CLEAN(name, __VA_ARGS__),)
/* Define the oplist of a tuple.
USAGE: TUPLE_OPLIST(name[, oplist of the first type, ...]) */
@@ -124,6 +127,7 @@ namespace m_tuple {
#define TUPLE_GET_IN_STR2(f,t,o) M_GET_IN_STR o
#define TUPLE_GET_PARSE_STR2(f,t,o) M_GET_PARSE_STR o
#define TUPLE_GET_SWAP2(f,t,o) M_GET_SWAP o
#define TUPLE_GET_CLEAN2(f,t,o) M_GET_CLEAN o
/* Transform (f,t) into (f,t,oplist) or (f,t,o) into (f,t,o).
USAGE:
@@ -155,6 +159,7 @@ namespace m_tuple {
#define TUPLE_GET_IN_STR(...) TUPLEI_EVAL(TUPLE_GET_IN_STR2,(__VA_ARGS__))
#define TUPLE_GET_PARSE_STR(...) TUPLEI_EVAL(TUPLE_GET_PARSE_STR2,(__VA_ARGS__))
#define TUPLE_GET_SWAP(...) TUPLEI_EVAL(TUPLE_GET_SWAP2,(__VA_ARGS__))
#define TUPLE_GET_CLEAN(...) TUPLEI_EVAL(TUPLE_GET_CLEAN2,(__VA_ARGS__))
#define TUPLE_DEFINE_TYPE(name, ...) \
typedef struct M_C(name, _s) { \
@@ -416,6 +421,15 @@ namespace m_tuple {
#define TUPLE_DEFINE_SWAP_FUNC(a) \
TUPLE_GET_SWAP a (el1 -> TUPLE_GET_FIELD a, el2 -> TUPLE_GET_FIELD a);
#define TUPLE_DEFINE_CLEAN(name, ...) \
static inline void M_C(name, _clean)(M_C(name,_t) el1) { \
M_MAP(TUPLE_DEFINE_CLEAN_FUNC , __VA_ARGS__) \
}
#define TUPLE_DEFINE_CLEAN_FUNC(a) \
TUPLE_GET_CLEAN a (el1 -> TUPLE_GET_FIELD a);
/* Macros for testing for method presence */
#define TUPLE_TEST_METHOD2_P(method, f, t, op) \
M_TEST_METHOD_P(method, op)
@@ -442,6 +456,8 @@ namespace m_tuple {
M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, MOVE, __VA_ARGS__)
#define TUPLE_ALL_SWAP(...) \
M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, SWAP, __VA_ARGS__)
#define TUPLE_ALL_CLEAN(...) \
M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, CLEAN, __VA_ARGS__)
#define TUPLEI_OPLIST(name, ...) \
(INIT(M_C(name,_init)), \
+13
View File
@@ -72,6 +72,18 @@ static void check_swap(void)
pair_str_clear(p2);
}
static void check_clean(void)
{
single_str_t p1;
single_str_init (p1);
string_set_str(p1->vala, "Hello");
single_str_clean(p1);
assert(string_equal_str_p (p1->vala, ""));
single_str_clear(p1);
}
static void check_io(void)
{
M_LET(s, STRING_OPLIST)
@@ -166,5 +178,6 @@ int main(void)
test1();
check_io();
check_swap();
check_clean();
exit(0);
}