From 2e3b312fab868991895670e901bf0cd17f241d63 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Fri, 14 Sep 2018 20:57:55 +0200 Subject: [PATCH] Fix issue of recursive usage of M_GLOBAL_OPLIST_OR_DEF Update the way to use the macro to avoid being limited by the preprocessor limitation. --- README.md | 11 ++++++++--- m-array.h | 4 ++-- m-bptree.h | 6 +++--- m-buffer.h | 6 +++--- m-core.h | 10 +++++----- m-deque.h | 4 ++-- m-dict.h | 8 ++++---- m-i-list.h | 4 ++-- m-i-shared.h | 4 ++-- m-list.h | 6 +++--- m-prioqueue.h | 4 ++-- m-rbtree.h | 4 ++-- m-shared.h | 6 +++--- m-snapshot.h | 8 ++++---- m-tuple.h | 2 +- m-variant.h | 2 +- tests/test-mcore.c | 10 ++++++++++ 17 files changed, 57 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 9e16ea1e..022747ed 100644 --- a/README.md +++ b/README.md @@ -4556,12 +4556,17 @@ Global oplist is limited to typedef types. ##### M_GLOBAL_OPLIST_OR_DEF(a) -Check if a a symbol composed of M_OPL_##a() is defined as an oplist, and returns it -otherwise return M_DEFAULT_OPLIST. +Check if a a symbol composed of M_OPL_##a() is defined as an oplist, and returns its +name otherwise return a name that will expand to M_DEFAULT_OPLIST. +The return value shall be evaluated once again to get the oplist +(this is needed due to technical reasons). + + M_GLOBAL_OPLIST_OR_DEF(mpz_t)() + In short, if a global oplist is defined for the argument, it returns it otherwise it returns the default oplist. Global oplist is limited to typedef types. - + #### Syntax enhancing diff --git a/m-array.h b/m-array.h index 0190a27c..b9dd5bfa 100644 --- a/m-array.h +++ b/m-array.h @@ -31,14 +31,14 @@ USAGE: ARRAY_DEF(name, type [, oplist_of_the_type]) */ #define ARRAY_DEF(name, ...) \ ARRAYI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t), M_C(name,_it_t) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t), M_C(name,_it_t) ), \ (name, __VA_ARGS__, M_C(name,_t), M_C(name,_it_t)))) /* Define the oplist of a dynamic array given its name and its oplist. USAGE: ARRAY_OPLIST(name[, oplist of the type]) */ #define ARRAY_OPLIST(...) \ ARRAYI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) diff --git a/m-bptree.h b/m-bptree.h index 17343f42..1821223a 100644 --- a/m-bptree.h +++ b/m-bptree.h @@ -36,7 +36,7 @@ */ #define BPTREE_DEF2(name, N, key_type, ...) \ BPTREEI_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, N, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), 1, M_C(name, _t), M_C(name, _node_t), M_C(name, _pit_t), M_C(name, _it_t) ), \ + ((name, N, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), 1, M_C(name, _t), M_C(name, _node_t), M_C(name, _pit_t), M_C(name, _it_t) ), \ (name, N, key_type, __VA_ARGS__, 1, M_C(name, _t), M_C(name, _node_t), M_C(name, _pit_t), M_C(name, _it_t)))) @@ -45,7 +45,7 @@ USAGE: BPTREE_DEF(name, N, type, [, oplist_of_the_type]) */ #define BPTREE_DEF(name, N, ...) \ BPTREEI_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, N, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), 0, M_C(name, _t), M_C(name, _node_t), M_C(name, _pit_t), M_C(name, _it_t) ), \ + ((name, N, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), 0, M_C(name, _t), M_C(name, _node_t), M_C(name, _pit_t), M_C(name, _it_t) ), \ (name, N, __VA_ARGS__, __VA_ARGS__, 0, M_C(name, _t), M_C(name, _node_t), M_C(name, _pit_t), M_C(name, _it_t) ))) @@ -53,7 +53,7 @@ USAGE: BPTREE_OPLIST(name [, oplist_of_the_type]) */ #define BPTREE_OPLIST(...) \ BPTREEI_KEY_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) /* Define the oplist of a rbtree of type (from BPTREE_DEF2). diff --git a/m-buffer.h b/m-buffer.h index 155eb49c..90dea8af 100644 --- a/m-buffer.h +++ b/m-buffer.h @@ -54,7 +54,7 @@ typedef enum { USAGE: BUFFER_DEF(name, type, size_of_buffer_or_0, policy[, oplist]) */ #define BUFFER_DEF(name, type, m_size, ... ) \ BUFFERI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, type, m_size,__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t)), \ + ((name, type, m_size,__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t)), \ (name, type, m_size,__VA_ARGS__, M_C(name,_t)))) /* Define a lock-free queue for Many Producer Many Consummer @@ -63,7 +63,7 @@ typedef enum { */ #define QUEUE_MPMC_DEF(name, type, ...) \ QUEUEI_MPMC_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, type, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t)), \ + ((name, type, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t)), \ (name, type, __VA_ARGS__, M_C(name,_t)))) /* Define a wait-free queue for Single Producer Single Consummer @@ -72,7 +72,7 @@ typedef enum { */ #define QUEUE_SPSC_DEF(name, type, ...) \ QUEUEI_SPSC_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, type, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t)), \ + ((name, type, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t)), \ (name, type, __VA_ARGS__, M_C(name,_t)))) diff --git a/m-core.h b/m-core.h index 71a36f6d..e54f83a2 100644 --- a/m-core.h +++ b/m-core.h @@ -2163,11 +2163,11 @@ m_core_hash (const void *str, size_t length) Global oplist is limited to typedef types. */ #define M_GLOBAL_OPLIST_OR_DEF(a) \ - M_IF( M_PARENTHESIS_P(a))(M_GLOBALI_OPLIST_DEFAULT, M_GLOBALI_OPLIST_OR_DEF_ELSE)(a) -#define M_GLOBALI_OPLIST_DEFAULT(a) M_DEFAULT_OPLIST -#define M_GLOBALI_OPLIST_OR_DEF_ELSE(a) M_GLOBALI_OPLIST_OR_DEF_ELSE2(M_C(M_OPL_, a)()) -#define M_GLOBALI_OPLIST_OR_DEF_ELSE2(op) M_IF( M_OPLIST_P(op))(op, M_DEFAULT_OPLIST) - + M_IF( M_PARENTHESIS_P(a))(M_GLOBALI_OPLIST_DEFAULT1, M_GLOBALI_OPLIST_OR_DEF_ELSE)(a) +#define M_GLOBALI_OPLIST_DEFAULT1(a) M_GLOBALI_OPLIST_DEFAULT2 +#define M_GLOBALI_OPLIST_DEFAULT2() M_DEFAULT_OPLIST +#define M_GLOBALI_OPLIST_OR_DEF_ELSE(a) M_GLOBALI_OPLIST_OR_DEF_ELSE2(a, M_C(M_OPL_, a)()) +#define M_GLOBALI_OPLIST_OR_DEF_ELSE2(a, op) M_IF( M_OPLIST_P(op))(M_C(M_OPL_, a), M_GLOBALI_OPLIST_DEFAULT2) /************************************************************/ /******************** Syntax Enhancing **********************/ diff --git a/m-deque.h b/m-deque.h index a1379ff6..2d9a12a0 100644 --- a/m-deque.h +++ b/m-deque.h @@ -31,7 +31,7 @@ USAGE: DEQUE_DEF(name, type [, oplist_of_the_type]) */ #define DEQUE_DEF(name, ...) \ DEQUEI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t), M_C(name,_it_t), M_C(name, _node_t) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t), M_C(name,_it_t), M_C(name, _node_t) ), \ (name, __VA_ARGS__, M_C(name,_t), M_C(name,_it_t), M_C(name, _node_t)))) @@ -39,7 +39,7 @@ USAGE: DEQUE_OPLIST(name[, oplist of the type]) */ #define DEQUE_OPLIST(...) \ DEQUEI_OPLIST (M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_DEFAULT_OPLIST ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)()), \ (__VA_ARGS__ ))) /********************************** INTERNAL ************************************/ diff --git a/m-dict.h b/m-dict.h index c0ba69e9..fddd123d 100644 --- a/m-dict.h +++ b/m-dict.h @@ -37,7 +37,7 @@ */ #define DICT_DEF2(name, key_type, ...) \ DICTI_DEF2_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, key_type, __VA_ARGS__))) @@ -51,7 +51,7 @@ */ #define DICT_STOREHASH_DEF2(name, key_type, ...) \ DICTI_SHASH_DEF2_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, key_type, __VA_ARGS__))) @@ -61,7 +61,7 @@ */ #define DICT_SET_DEF(name, ...) \ DICTI_SET_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, __VA_ARGS__))) @@ -75,7 +75,7 @@ */ #define DICT_OA_DEF2(name, key_type, ...) \ DICTI_OA_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, key_type, M_GLOBAL_OPLIST_OR_DEF(key_type)(), __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, key_type, __VA_ARGS__))) diff --git a/m-i-list.h b/m-i-list.h index 38f2e29f..0f27648d 100644 --- a/m-i-list.h +++ b/m-i-list.h @@ -45,7 +45,7 @@ ILIST_DEF(name, type [, oplist_of_the_type]) */ #define ILIST_DEF(name, ...) \ ILISTI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name, _t), M_C(name, _it_t) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name, _t), M_C(name, _it_t) ), \ (name, __VA_ARGS__, M_C(name, _t), M_C(name, _it_t) ))) /* Define the oplist of a doubly-linked instrusive list of type. @@ -53,7 +53,7 @@ ILIST_OPLIST(name [, oplist_of_the_type]) */ #define ILIST_OPLIST(...) \ ILISTI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) diff --git a/m-i-shared.h b/m-i-shared.h index 54004aaa..044c0164 100644 --- a/m-i-shared.h +++ b/m-i-shared.h @@ -32,7 +32,7 @@ USAGE: ISHARED_OPLIST(name [, oplist_of_the_type]) */ #define ISHARED_PTR_OPLIST(...) \ ISHAREDI_PTR_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) /* Interface to add to a structure to allow intrusive support. @@ -46,7 +46,7 @@ USAGE: ISHARED_PTR_DEF(name[, oplist]) */ #define ISHARED_PTR_DEF(name, ...) \ ISHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, __VA_ARGS__ ))) diff --git a/m-list.h b/m-list.h index 057dd398..d763a27a 100644 --- a/m-list.h +++ b/m-list.h @@ -31,21 +31,21 @@ USAGE: LIST_DEF(name, type [, oplist_of_the_type]) */ #define LIST_DEF(name, ...) \ LISTI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t), M_C(name, _it_t) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t), M_C(name, _it_t) ), \ (name, __VA_ARGS__, M_C(name,_t), M_C(name, _it_t) ))) /* Define a dual-push singly linked list of a given type. USAGE: LIST_DEF(name, type [, oplist_of_the_type]) */ #define LIST_DUAL_PUSH_DEF(name, ...) \ LISTI_DUAL_PUSH_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t), M_C(name, _it_t) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t), M_C(name, _it_t) ), \ (name, __VA_ARGS__, M_C(name,_t), M_C(name, _it_t) ))) /* Define the oplist of a list of type. USAGE: LIST_OPLIST(name [, oplist_of_the_type]) */ #define LIST_OPLIST(...) \ LISTI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) diff --git a/m-prioqueue.h b/m-prioqueue.h index 02988b59..b3c958da 100644 --- a/m-prioqueue.h +++ b/m-prioqueue.h @@ -34,14 +34,14 @@ USAGE: PRIOQUEUE_DEF(name, type [, oplist_of_the_type]) */ #define PRIOQUEUE_DEF(name, ...) \ PRIOQUEUEI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), M_C(name,_t), M_C(name,_it_t) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), M_C(name,_t), M_C(name,_it_t) ), \ (name, __VA_ARGS__, M_C(name,_t), M_C(name,_it_t)))) /* Define the oplist of a prioqueue of type. USAGE: PRIOQUEUE_OPLIST(name[, oplist of the type]) */ #define PRIOQUEUE_OPLIST(...) \ PRIOQUEUEI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) diff --git a/m-rbtree.h b/m-rbtree.h index 758660ba..f6881aef 100644 --- a/m-rbtree.h +++ b/m-rbtree.h @@ -31,7 +31,7 @@ USAGE: RBTREE_DEF(name, type [, oplist_of_the_type]) */ #define RBTREE_DEF(name, ...) \ RBTREEI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), \ M_C(name, _t), struct M_C(name, _node_s), M_C(name, _it_t)), \ (name, __VA_ARGS__ , \ M_C(name, _t), struct M_C(name, _node_s), M_C(name, _it_t)))) @@ -40,7 +40,7 @@ USAGE: RBTREE_OPLIST(name [, oplist_of_the_type]) */ #define RBTREE_OPLIST(...) \ RBTREEI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) diff --git a/m-shared.h b/m-shared.h index a9a07283..6b63ec3f 100644 --- a/m-shared.h +++ b/m-shared.h @@ -33,21 +33,21 @@ USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */ #define SHARED_PTR_OPLIST(...) \ SHAREDI_PTR_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ _OPLIST(__VA_ARGS__ ))) /* Define shared pointer and its function. USAGE: SHARED_PTR_DEF(name, type, [, oplist]) */ #define SHARED_PTR_DEF(name, ...) \ SHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), SHAREDI_ATOMIC_OPLIST ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), SHAREDI_ATOMIC_OPLIST ), \ (name, __VA_ARGS__ , SHAREDI_ATOMIC_OPLIST))) /* Define relaxed shared pointer and its function (thread unsafe). USAGE: SHARED_PTR_RELAXED_DEF(name, type, [, oplist]) */ #define SHARED_PTR_RELAXED_DEF(name, ...) \ SHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__), SHAREDI_INTEGER_OPLIST ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), SHAREDI_INTEGER_OPLIST ), \ (name, __VA_ARGS__ , SHAREDI_INTEGER_OPLIST))) /* Define shared resource and its function. diff --git a/m-snapshot.h b/m-snapshot.h index 1ac535af..340c81d1 100644 --- a/m-snapshot.h +++ b/m-snapshot.h @@ -33,28 +33,28 @@ USAGE: SNAPSHOT_SPSC_DEF(name, type[, oplist]) */ #define SNAPSHOT_SPSC_DEF(name, ...) \ SNAPSHOTI_SPSC_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, __VA_ARGS__ ))) /* Define a Single Producer Multiple Consummer snapshot and its functions USAGE: SNAPSHOT_SPMC_DEF(name, type[, oplist]) */ #define SNAPSHOT_SPMC_DEF(name, ...) \ SNAPSHOTI_SPMC_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, __VA_ARGS__ ))) /* Define a Multiple Producer Multiple Consummer snapshot and its functions USAGE: SNAPSHOT_MPMC_DEF(name, type[, oplist]) */ #define SNAPSHOT_MPMC_DEF(name, ...) \ SNAPSHOTI_MPMC_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (name, __VA_ARGS__ ))) /* Define the oplist of a snapshot (SPSC, SPMC or MPMC). USAGE: SNAPSHOT_OPLIST(name[, oplist]) */ #define SNAPSHOT_OPLIST(...) \ SNAPSHOTI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ (__VA_ARGS__ ))) diff --git a/m-tuple.h b/m-tuple.h index fe440064..bab34a70 100644 --- a/m-tuple.h +++ b/m-tuple.h @@ -76,7 +76,7 @@ namespace m_tuple { TUPLEI_INJECT_OPLIST_B duo_or_trio #define TUPLEI_INJECT_OPLIST_B( f, ... ) \ - M_IF_NARGS_EQ1(__VA_ARGS__)( (f, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)), (f, __VA_ARGS__) ) + M_IF_NARGS_EQ1(__VA_ARGS__)( (f, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)()), (f, __VA_ARGS__) ) #define TUPLEI_DEF2_A(...) \ TUPLEI_DEF2_B __VA_ARGS__ diff --git a/m-variant.h b/m-variant.h index c68d4296..9cc7e16b 100644 --- a/m-variant.h +++ b/m-variant.h @@ -53,7 +53,7 @@ VARIANTI_INJECT_OPLIST_B duo_or_trio #define VARIANTI_INJECT_OPLIST_B( f, ... ) \ - M_IF_NARGS_EQ1(__VA_ARGS__)( (f, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)), (f, __VA_ARGS__) ) + M_IF_NARGS_EQ1(__VA_ARGS__)( (f, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)()), (f, __VA_ARGS__) ) #define VARIANTI_DEF2_A(...) \ VARIANTI_DEF2_B __VA_ARGS__ diff --git a/tests/test-mcore.c b/tests/test-mcore.c index 62c4be25..b4d1a1d2 100644 --- a/tests/test-mcore.c +++ b/tests/test-mcore.c @@ -281,6 +281,16 @@ static void test_oplist(void) #define M_OPL_op() (INIT(1), CLEAR(0)) assert(M_GET_INIT M_GLOBAL_OPLIST(op)); assert(!M_GET_INIT M_GLOBAL_OPLIST(a)); + +#define MAKE_OPLIST(op) (OPLIST(M_GLOBAL_OPLIST_OR_DEF(op)())) +#define M_OPL_uint() (INIT(0), CLEAR(1)) +#define M_OPL_array_uint() (OPLIST(M_GLOBAL_OPLIST_OR_DEF(uint)())) +#define M_OPL_list_array_uint() MAKE_OPLIST(array_uint) +#define A1 A2(M_OPL_list_array_uint()) +#define A2(op) A3(M_GET_OPLIST op) +#define A3(op) A4(M_GET_OPLIST op) +#define A4(op) M_GET_CLEAR op + assert (A1); } static void test_cast(void)