Add SWAP for tuple
This commit is contained in:
1 parent
ebe1b06813
commit
f653676511
2 files changed
+37
-1
No files matched your search
@@ -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)),), \
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in new issue
Block a user