From f6536765112d6a15f42aa2a02712bcfc6b79fa42 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Tue, 14 Mar 2017 21:44:21 +0100 Subject: [PATCH] Add SWAP for tuple --- m-tuple.h | 17 ++++++++++++++++- tests/test-mtuple.c | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/m-tuple.h b/m-tuple.h index 09d356bf..63d09dbe 100644 --- a/m-tuple.h +++ b/m-tuple.h @@ -59,7 +59,9 @@ M_IF(TUPLE_ALL_INIT_MOVE(__VA_ARGS__)) \ (TUPLE_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \ M_IF(TUPLE_ALL_MOVE(__VA_ARGS__)) \ - (TUPLE_DEFINE_MOVE(name, __VA_ARGS__),) + (TUPLE_DEFINE_MOVE(name, __VA_ARGS__),) \ + M_IF(TUPLE_ALL_SWAP(__VA_ARGS__)) \ + (TUPLE_DEFINE_SWAP(name, __VA_ARGS__),) /* Define the oplist of a tuple. USAGE: TUPLE_OPLIST(name[, oplist of the first type, ...]) */ @@ -85,6 +87,7 @@ #define TUPLE_GET_STR(f,t,o) M_GET_GET_STR o #define TUPLE_GET_OUT_STR(f,t,o) M_GET_OUT_STR o #define TUPLE_GET_IN_STR(f,t,o) M_GET_IN_STR o +#define TUPLE_GET_SWAP(f,t,o) M_GET_SWAP o #define TUPLE_DEFINE_TYPE(name, ...) \ @@ -242,6 +245,7 @@ if (TUPLE_GET_IN_STR a (el -> TUPLE_GET_FIELD a, f) == false) \ return false ; \ + #define TUPLE_DEFINE_INIT_MOVE(name, ...) \ static inline void M_C(name, _init_move)(M_C(name,_t) el, M_C(name,_t) org) { \ M_MAP(TUPLE_DEFINE_INIT_MOVE_FUNC , __VA_ARGS__) \ @@ -249,6 +253,7 @@ #define TUPLE_DEFINE_INIT_MOVE_FUNC(a) \ TUPLE_GET_INIT_MOVE a (el -> TUPLE_GET_FIELD a, org -> TUPLE_GET_FIELD a); + #define TUPLE_DEFINE_MOVE(name, ...) \ static inline void M_C(name, _move)(M_C(name,_t) el, M_C(name,_t) org) { \ M_MAP(TUPLE_DEFINE_MOVE_FUNC , __VA_ARGS__) \ @@ -257,6 +262,13 @@ TUPLE_GET_MOVE a (el -> TUPLE_GET_FIELD a, org -> TUPLE_GET_FIELD a); +#define TUPLE_DEFINE_SWAP(name, ...) \ + static inline void M_C(name, _swap)(M_C(name,_t) el1, M_C(name,_t) el2) { \ + M_MAP(TUPLE_DEFINE_SWAP_FUNC , __VA_ARGS__) \ + } +#define TUPLE_DEFINE_SWAP_FUNC(a) \ + TUPLE_GET_SWAP a (el1 -> TUPLE_GET_FIELD a, el2 -> 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) @@ -279,6 +291,8 @@ M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, INIT_MOVE, __VA_ARGS__) #define TUPLE_ALL_MOVE(...) \ 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 TUPLEI_OPLIST(name, ...) \ (INIT(M_C(name,_init)), \ @@ -294,6 +308,7 @@ M_IF_METHOD_ALL(OUT_STR, __VA_ARGS__)(OUT_STR(M_C(name, _out_str)),), \ M_IF_METHOD_ALL(INIT_MOVE, __VA_ARGS__)(INIT_MOVE(M_C(name, _init_move)),), \ M_IF_METHOD_ALL(MOVE, __VA_ARGS__)(MOVE(M_C(name, _move)),), \ + M_IF_METHOD_ALL(SWAP, __VA_ARGS__)(MOVE(M_C(name, _swap)),), \ ) diff --git a/tests/test-mtuple.c b/tests/test-mtuple.c index 338a667f..e4526865 100644 --- a/tests/test-mtuple.c +++ b/tests/test-mtuple.c @@ -47,6 +47,26 @@ TUPLE_DEF2(pair_str, (vala, string_t, STRING_OPLIST), (valb, string_t, STRING_OPLIST)) +TUPLE_DEF2(single_str, (vala, string_t, STRING_OPLIST)) + +static void check_swap(void) +{ + pair_str_t p1, p2; + pair_str_init (p1); + pair_str_init (p2); + + string_set_str(p1->vala, "Hello"); + string_set_str(p1->valb, "World"); + pair_str_swap(p1, p2); + assert(string_equal_str_p (p1->vala, "")); + assert(string_equal_str_p (p1->valb, "")); + assert(string_equal_str_p (p2->vala, "Hello")); + assert(string_equal_str_p (p2->valb, "World")); + + pair_str_clear(p1); + pair_str_clear(p2); +} + static void check_io(void) { M_LET(s, STRING_OPLIST) @@ -113,5 +133,6 @@ int main(void) mpz_clear(z); check_io(); + check_swap(); exit(0); }