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__)) \
|
M_IF(TUPLE_ALL_INIT_MOVE(__VA_ARGS__)) \
|
||||||
(TUPLE_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
|
(TUPLE_DEFINE_INIT_MOVE(name, __VA_ARGS__),) \
|
||||||
M_IF(TUPLE_ALL_MOVE(__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.
|
/* Define the oplist of a tuple.
|
||||||
USAGE: TUPLE_OPLIST(name[, oplist of the first type, ...]) */
|
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_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_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_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, ...) \
|
#define TUPLE_DEFINE_TYPE(name, ...) \
|
||||||
@@ -242,6 +245,7 @@
|
|||||||
if (TUPLE_GET_IN_STR a (el -> TUPLE_GET_FIELD a, f) == false) \
|
if (TUPLE_GET_IN_STR a (el -> TUPLE_GET_FIELD a, f) == false) \
|
||||||
return false ; \
|
return false ; \
|
||||||
|
|
||||||
|
|
||||||
#define TUPLE_DEFINE_INIT_MOVE(name, ...) \
|
#define TUPLE_DEFINE_INIT_MOVE(name, ...) \
|
||||||
static inline void M_C(name, _init_move)(M_C(name,_t) el, M_C(name,_t) org) { \
|
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__) \
|
M_MAP(TUPLE_DEFINE_INIT_MOVE_FUNC , __VA_ARGS__) \
|
||||||
@@ -249,6 +253,7 @@
|
|||||||
#define TUPLE_DEFINE_INIT_MOVE_FUNC(a) \
|
#define TUPLE_DEFINE_INIT_MOVE_FUNC(a) \
|
||||||
TUPLE_GET_INIT_MOVE a (el -> TUPLE_GET_FIELD a, org -> TUPLE_GET_FIELD a);
|
TUPLE_GET_INIT_MOVE a (el -> TUPLE_GET_FIELD a, org -> TUPLE_GET_FIELD a);
|
||||||
|
|
||||||
|
|
||||||
#define TUPLE_DEFINE_MOVE(name, ...) \
|
#define TUPLE_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_MAP(TUPLE_DEFINE_MOVE_FUNC , __VA_ARGS__) \
|
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);
|
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 */
|
/* Macros for testing for method presence */
|
||||||
#define TUPLE_TEST_METHOD2_P(method, f, t, op) \
|
#define TUPLE_TEST_METHOD2_P(method, f, t, op) \
|
||||||
M_TEST_METHOD_P(method, op)
|
M_TEST_METHOD_P(method, op)
|
||||||
@@ -279,6 +291,8 @@
|
|||||||
M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, INIT_MOVE, __VA_ARGS__)
|
M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, INIT_MOVE, __VA_ARGS__)
|
||||||
#define TUPLE_ALL_MOVE(...) \
|
#define TUPLE_ALL_MOVE(...) \
|
||||||
M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, MOVE, __VA_ARGS__)
|
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, ...) \
|
#define TUPLEI_OPLIST(name, ...) \
|
||||||
(INIT(M_C(name,_init)), \
|
(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(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(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(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),
|
(vala, string_t, STRING_OPLIST),
|
||||||
(valb, 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)
|
static void check_io(void)
|
||||||
{
|
{
|
||||||
M_LET(s, STRING_OPLIST)
|
M_LET(s, STRING_OPLIST)
|
||||||
@@ -113,5 +133,6 @@ int main(void)
|
|||||||
mpz_clear(z);
|
mpz_clear(z);
|
||||||
|
|
||||||
check_io();
|
check_io();
|
||||||
|
check_swap();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user