From 60a10eb7996257e62e2df7ec4c7f394ed739a7b9 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Sun, 9 Jun 2019 12:02:38 +0200 Subject: [PATCH] Uniformize the macro names --- m-i-list.h | 54 +++++++++++++++++++++++++-------------------------- m-i-shared.h | 23 ++++++++++++---------- m-prioqueue.h | 30 ++++++++++++++++++---------- m-shared.h | 36 +++++++++++++++++----------------- m-snapshot.h | 50 ++++++++++++++++++++++++----------------------- m-tuple.h | 17 +++++++++------- m-variant.h | 17 +++++++++------- 7 files changed, 124 insertions(+), 103 deletions(-) diff --git a/m-i-list.h b/m-i-list.h index 3b7011ff..0f3bb3cf 100644 --- a/m-i-list.h +++ b/m-i-list.h @@ -46,15 +46,15 @@ USAGE: 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_C(name, _t), M_C(name, _it_t) ))) + ILISTI_DEF_P1(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_C(name, _t), M_C(name, _it_t) ))) /* Define the oplist of a doubly-linked instrusive list of type. USAGE: ILIST_OPLIST(name [, oplist_of_the_type]) */ #define ILIST_OPLIST(...) \ - ILISTI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ILISTI_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ ((__VA_ARGS__, M_DEFAULT_OPLIST), \ (__VA_ARGS__ ))) @@ -68,10 +68,10 @@ typedef struct ilist_head_s { } ilist_head_t; /* Indirection call to allow expanding all arguments */ -#define ILISTI_OPLIST(arg) ILISTI_OPLIST2 arg +#define ILISTI_OPLIST_P1(arg) ILISTI_OPLIST_P2 arg /* Define the oplist of an ilist of type */ -#define ILISTI_OPLIST2(name,oplist) \ +#define ILISTI_OPLIST_P2(name,oplist) \ (INIT(M_C(name, _init)), \ CLEAR(M_C(name, _clear)), \ INIT_MOVE(M_C(name, _init_move)), \ @@ -120,7 +120,7 @@ typedef struct ilist_head_s { } while (0) /* Indirection call to allow expanding all arguments (TBC) */ -#define ILISTI_DEF(arg) ILISTI_DEF2 arg +#define ILISTI_DEF_P1(arg) ILISTI_DEF_P2 arg /* Definition of the type and function for an intrusive doubly-linked list. USAGE: @@ -128,9 +128,9 @@ typedef struct ilist_head_s { type: type of the object oplist: oplist of the type list_t: type of the intrusive list (name##_t) - list_it_t: iterator of the intrusive list (name##_it_t) + it_t: iterator of the intrusive list (name##_it_t) */ -#define ILISTI_DEF2(name, type, oplist, list_t, list_it_t) \ +#define ILISTI_DEF_P2(name, type, oplist, list_t, it_t) \ \ typedef struct M_C(name, _s) { \ struct ilist_head_s name; \ @@ -145,7 +145,7 @@ typedef struct ilist_head_s { struct ilist_head_s *previous; \ struct ilist_head_s *current; \ struct ilist_head_s *next; \ - } list_it_t[1]; \ + } it_t[1]; \ \ static inline void M_C(name, _init)(list_t list) \ { \ @@ -316,7 +316,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _it)(list_it_t it, const list_t list) \ + M_C(name, _it)(it_t it, const list_t list) \ { \ ILISTI_CONTRACT(name, list); \ assert (it != NULL); \ @@ -328,7 +328,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _it_set)(list_it_t it, const list_it_t cit) \ + M_C(name, _it_set)(it_t it, const it_t cit) \ { \ assert (it != NULL && cit != NULL); \ it->head = cit->head; \ @@ -339,7 +339,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _it_last)(list_it_t it, list_t const list) \ + M_C(name, _it_last)(it_t it, list_t const list) \ { \ ILISTI_CONTRACT(name, list); \ assert (it != NULL); \ @@ -351,7 +351,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _it_end)(list_it_t it, list_t const list) \ + M_C(name, _it_end)(it_t it, list_t const list) \ { \ assert (it != NULL && list != NULL); \ it->head = list->name.next->prev; \ @@ -362,7 +362,7 @@ typedef struct ilist_head_s { } \ \ static inline bool \ - M_C(name, _end_p)(const list_it_t it) \ + M_C(name, _end_p)(const it_t it) \ { \ assert (it != NULL); \ ILISTI_NODE_CONTRACT(it->current); \ @@ -370,7 +370,7 @@ typedef struct ilist_head_s { } \ \ static inline bool \ - M_C(name, _last_p)(const list_it_t it) \ + M_C(name, _last_p)(const it_t it) \ { \ assert (it != NULL); \ ILISTI_NODE_CONTRACT(it->current); \ @@ -378,7 +378,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _next)(list_it_t it) \ + M_C(name, _next)(it_t it) \ { \ assert (it != NULL); \ /* Cannot check node for it->current: it may have been deleted! */ \ @@ -393,7 +393,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _previous)(list_it_t it) \ + M_C(name, _previous)(it_t it) \ { \ assert (it != NULL); \ /* Cannot check node for it->current: it may have been deleted! */ \ @@ -408,7 +408,7 @@ typedef struct ilist_head_s { } \ \ static inline bool \ - M_C(name, _it_equal_p)(const list_it_t it1, const list_it_t it2 ) \ + M_C(name, _it_equal_p)(const it_t it1, const it_t it2 ) \ { \ assert (it1 != NULL && it2 != NULL); \ /* No need to check for next & previous */ \ @@ -416,7 +416,7 @@ typedef struct ilist_head_s { } \ \ static inline type * \ - M_C(name, _ref)(const list_it_t it) \ + M_C(name, _ref)(const it_t it) \ { \ assert (it != NULL && it->current != NULL); \ ILISTI_NODE_CONTRACT(it->current); \ @@ -429,14 +429,14 @@ typedef struct ilist_head_s { } \ \ static inline type const * \ - M_C(name, _cref)(const list_it_t it) \ + M_C(name, _cref)(const it_t it) \ { \ type *ptr = M_C(name, _ref)(it); \ return M_CONST_CAST(type, ptr); \ } \ \ static inline void \ - M_C(name, _remove)(list_t list, list_it_t it) \ + M_C(name, _remove)(list_t list, it_t it) \ { \ ILISTI_CONTRACT(name, list); \ ILISTI_NODE_CONTRACT(it->current); \ @@ -451,7 +451,7 @@ typedef struct ilist_head_s { \ M_IF_METHOD(NEW, oplist)( \ static inline void \ - M_C(name, _insert)(list_t list, list_it_t it, type x) \ + M_C(name, _insert)(list_t list, it_t it, type x) \ { \ ILISTI_CONTRACT(name, list); \ ILISTI_NODE_CONTRACT(it->current); \ @@ -508,7 +508,7 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _splice_back)(list_t nv, list_t ov, list_it_t it) \ + M_C(name, _splice_back)(list_t nv, list_t ov, it_t it) \ { \ ILISTI_CONTRACT(name, nv); \ ILISTI_CONTRACT(name, ov); \ @@ -524,8 +524,8 @@ typedef struct ilist_head_s { } \ \ static inline void \ - M_C(name, _splice_at)(list_t nlist, list_it_t npos, \ - list_t olist, list_it_t opos) \ + M_C(name, _splice_at)(list_t nlist, it_t npos, \ + list_t olist, it_t opos) \ { \ ILISTI_CONTRACT(name, nlist); \ ILISTI_CONTRACT(name, olist); \ @@ -590,7 +590,7 @@ typedef struct ilist_head_s { ILISTI_CONTRACT(name, list); \ } \ \ - LISTI_ITBASE_DEF(name, type, oplist, list_t, list_it_t) + LISTI_ITBASE_DEF(name, type, oplist, list_t, it_t) #endif diff --git a/m-i-shared.h b/m-i-shared.h index 94fd505e..f9d30acb 100644 --- a/m-i-shared.h +++ b/m-i-shared.h @@ -31,9 +31,9 @@ /* Define the oplist of a intrusive shared pointer. USAGE: ISHARED_OPLIST(name [, oplist_of_the_type]) */ #define ISHARED_PTR_OPLIST(...) \ - ISHAREDI_PTR_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_DEFAULT_OPLIST), \ - (__VA_ARGS__ ))) + ISHAREDI_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((__VA_ARGS__, M_DEFAULT_OPLIST), \ + (__VA_ARGS__ ))) /* Interface to add to a structure to allow intrusive support. name: name of the intrusive shared pointer. @@ -45,16 +45,18 @@ /* Define the intrusive shared pointer type and its static inline functions. 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__ ))) + ISHAREDI_PTR_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ + (name, __VA_ARGS__ ))) /********************************** INTERNAL ************************************/ -#define ISHAREDI_PTR_OPLIST(arg) ISHAREDI_PTR_OPLIST2 arg +// Deferred evaluation +#define ISHAREDI_PTR_OPLIST_P1(arg) ISHAREDI_PTR_OPLIST_P2 arg -#define ISHAREDI_PTR_OPLIST2(name, oplist) ( \ +// Define the oplist +#define ISHAREDI_PTR_OPLIST_P2(name, oplist) ( \ INIT(M_INIT_DEFAULT), \ INIT_SET(M_C(name, _init_set2) M_IPTR), \ SET(M_C(name, _set) M_IPTR), \ @@ -68,9 +70,10 @@ ,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \ ) -#define ISHAREDI_PTR_DEF(arg) ISHAREDI_PTR_DEF2 arg +// Deferred evaluatioin +#define ISHAREDI_PTR_DEF_P1(arg) ISHAREDI_PTR_DEF_P2 arg -#define ISHAREDI_PTR_DEF2(name, type, oplist) \ +#define ISHAREDI_PTR_DEF_P2(name, type, oplist) \ \ typedef type *M_C(name,_t); \ typedef type M_C(name, _type_t); \ diff --git a/m-prioqueue.h b/m-prioqueue.h index ff1c95f2..58b8c7bd 100644 --- a/m-prioqueue.h +++ b/m-prioqueue.h @@ -33,26 +33,29 @@ /* Define a prioqueue of a given type and its associated functions. 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_C(name,_t), M_C(name,_it_t)))) + PRIOQUEUEI_DEF_P1(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_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_DEFAULT_OPLIST), \ - (__VA_ARGS__ ))) + PRIOQUEUEI_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((__VA_ARGS__, M_DEFAULT_OPLIST), \ + (__VA_ARGS__ ))) /********************************** INTERNAL ************************************/ -#define PRIOQUEUEI_OPLIST(arg) PRIOQUEUEI_OPLIST2 arg -#define PRIOQUEUEI_DEF(arg) PRIOQUEUEI_DEF2 arg +/* Deferred evaluation for the definition, + so that all arguments are evaluated before further expansion */ +#define PRIOQUEUEI_OPLIST_P1(arg) PRIOQUEUEI_OPLIST_P2 arg +#define PRIOQUEUEI_DEF_P1(arg) PRIOQUEUEI_DEF_P2 arg -#define PRIOQUEUEI_OPLIST2(name, oplist) \ +/* Define oplist of a priority queue */ +#define PRIOQUEUEI_OPLIST_P2(name, oplist) \ (INIT(M_C(name, _init)) \ ,INIT_SET(M_C(name, _init_set)) \ ,INIT_WITH(API_1(M_INIT_VAI)) \ @@ -71,7 +74,14 @@ ,GET_SIZE(M_C(name, _size)) \ ) -#define PRIOQUEUEI_DEF2(name, type, oplist, prioqueue_t, it_t) \ +/* Define the priority queue: + - name: prefix to use, + - type: type of the contained objects, + - oplist: oplist of the contained objects, + - prioqueue_t: type of the container, + - it_t: iterator of the container +*/ +#define PRIOQUEUEI_DEF_P2(name, type, oplist, prioqueue_t, it_t) \ ARRAY_DEF(M_C(name, _array), type, oplist) \ \ typedef type M_C(name, _type_t); \ diff --git a/m-shared.h b/m-shared.h index 1642b705..745b9b1c 100644 --- a/m-shared.h +++ b/m-shared.h @@ -32,40 +32,40 @@ /* Define the oplist of a shared pointer. USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */ #define SHARED_PTR_OPLIST(...) \ - SHAREDI_PTR_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((__VA_ARGS__, M_DEFAULT_OPLIST ), \ - _OPLIST(__VA_ARGS__ ))) + SHAREDI_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((__VA_ARGS__, M_DEFAULT_OPLIST ), \ + _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__ , SHAREDI_ATOMIC_OPLIST))) + SHAREDI_PTR_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((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__ , SHAREDI_INTEGER_OPLIST))) + SHAREDI_PTR_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((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. This is a bounded pool of resource shared by multiple owners. USAGE: SHARED_RESOURCE_DEF(name, type, [, oplist]) */ #define SHARED_RESOURCE_DEF(name, ...) \ - SHAREDI_RESOURCE_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \ - ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ - (name, __VA_ARGS__))) + SHAREDI_RESOURCE_DEF_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((name, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \ + (name, __VA_ARGS__))) /********************************** INTERNAL ************************************/ // deferred -#define SHAREDI_PTR_OPLIST(arg) SHAREDI_PTR_OPLIST2 arg +#define SHAREDI_PTR_OPLIST_P1(arg) SHAREDI_PTR_OPLIST_P2 arg -#define SHAREDI_PTR_OPLIST2(name, oplist) ( \ +#define SHAREDI_PTR_OPLIST_P2(name, oplist) ( \ INIT(M_C(name, _init)), \ CLEAR(M_C(name, _clear)), \ INIT_SET(M_C(name, _init_set)), \ @@ -80,7 +80,7 @@ ) // deferred -#define SHAREDI_PTR_DEF(arg) SHAREDI_PTR_DEF2 arg +#define SHAREDI_PTR_DEF_P1(arg) SHAREDI_PTR_DEF_P2 arg // OPLIST to handle a counter of atomic type #define SHAREDI_ATOMIC_OPLIST (TYPE(atomic_int), \ @@ -105,7 +105,7 @@ static inline int sharedi_integer_cref(int *p) { return *p; } assert(*shared == NULL || M_CALL_IT_CREF(cpt_oplist, &(*shared)->cpt) >= 1); \ } while (0) -#define SHAREDI_PTR_DEF2(name, type, oplist, cpt_oplist) \ +#define SHAREDI_PTR_DEF_P2(name, type, oplist, cpt_oplist) \ \ typedef struct M_C(name, _s){ \ type *data; /* Pointer to the data */ \ @@ -297,9 +297,9 @@ static inline int sharedi_integer_cref(int *p) { return *p; } } while (0) // deferred -#define SHAREDI_RESOURCE_DEF(arg) SHAREDI_RESOURCE_DEF2 arg +#define SHAREDI_RESOURCE_DEF_P1(arg) SHAREDI_RESOURCE_DEF_P2 arg -#define SHAREDI_RESOURCE_DEF2(name, type, oplist) \ +#define SHAREDI_RESOURCE_DEF_P2(name, type, oplist) \ \ /* Create an aligned type to avoid false sharing between threads */ \ typedef struct M_C(name, _atype_s) { \ diff --git a/m-snapshot.h b/m-snapshot.h index 676da398..89f6e76e 100644 --- a/m-snapshot.h +++ b/m-snapshot.h @@ -32,39 +32,39 @@ /* Define a Single Producer Single Consummer snapshot and its functions 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__ ))) + SNAPSHOTI_SPSC_DEF_P1(M_IF_NARGS_EQ1(__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__ ))) + SNAPSHOTI_SPMC_DEF_P1(M_IF_NARGS_EQ1(__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__ ))) + SNAPSHOTI_MPMC_DEF_P1(M_IF_NARGS_EQ1(__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__ ))) + SNAPSHOTI_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \ + ((__VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \ + (__VA_ARGS__ ))) /********************************** INTERNAL ************************************/ // deferred evaluation of the input -#define SNAPSHOTI_OPLIST(arg) SNAPSHOTI_OPLIST2 arg +#define SNAPSHOTI_OPLIST_P1(arg) SNAPSHOTI_OPLIST_P2 arg /* Define the oplist of a snapshot */ -#define SNAPSHOTI_OPLIST2(name, oplist) \ +#define SNAPSHOTI_OPLIST_P2(name, oplist) \ (INIT(M_C(name, _init)) \ ,INIT_SET(M_C(name, _init_set)) \ ,SET(M_C(name, _set)) \ @@ -108,14 +108,14 @@ SNAPSHOTI_SPSC_FLAGS_CONTRACT(f); \ } while (0) -// Defered evaluation (TBC if it really helps). -#define SNAPSHOTI_SPSC_DEF(arg) SNAPSHOTI_SPSC_DEF2 arg +// Defered evaluation of the arguments. +#define SNAPSHOTI_SPSC_DEF_P1(arg) SNAPSHOTI_SPSC_DEF_P2 arg // This is basically an atomic triple buffer (Lock Free) // between a produced thread and a consummer thread. #define SNAPSHOTI_SPSC_MAX_BUFFER 3 -#define SNAPSHOTI_SPSC_DEF2(name, type, oplist) \ +#define SNAPSHOTI_SPSC_DEF_P2(name, type, oplist) \ \ /* Create an aligned type to avoid false sharing between threads */ \ typedef struct M_C(name, _aligned_type_s) { \ @@ -269,6 +269,7 @@ } \ + /******************************** INTERNAL SPMC **********************************/ #define SNAPSHOTI_SPMC_INT_FLAG(w, n) ( ((w) << 1) | (n) ) @@ -479,10 +480,10 @@ static inline void snapshot_mrsw_int_read_end(snapshot_mrsw_int_t s, unsigned in } while (0) -// Defered evaluation (TBC if it really helps). -#define SNAPSHOTI_SPMC_DEF(arg) SNAPSHOTI_SPMC_DEF2 arg +// Defered evaluation +#define SNAPSHOTI_SPMC_DEF_P1(arg) SNAPSHOTI_SPMC_DEF_P2 arg -#define SNAPSHOTI_SPMC_DEF2(name, type, oplist) \ +#define SNAPSHOTI_SPMC_DEF_P2(name, type, oplist) \ \ /* Create an aligned type to avoid false sharing between threads */ \ typedef struct M_C(name, _aligned_type_s) { \ @@ -563,16 +564,17 @@ static inline void snapshot_mrsw_int_read_end(snapshot_mrsw_int_t s, unsigned in //FIXME: Evaluate the needs for the methods _set_, _init_set. + /******************************** INTERNAL MPMC **********************************/ // MPMC is built upon SPMC -// Defered evaluation (TBC if it really helps). -#define SNAPSHOTI_MPMC_DEF(arg) SNAPSHOTI_MPMC_DEF2 arg +// Defered evaluation +#define SNAPSHOTI_MPMC_DEF_P1(arg) SNAPSHOTI_MPMC_DEF_P2 arg -#define SNAPSHOTI_MPMC_DEF2(name, type, oplist) \ +#define SNAPSHOTI_MPMC_DEF_P2(name, type, oplist) \ \ - SNAPSHOTI_SPMC_DEF((M_C(name, _mrsw), type, oplist)) \ + SNAPSHOTI_SPMC_DEF_P1((M_C(name, _mrsw), type, oplist)) \ \ typedef struct M_C(name, _s) { \ M_C(name, _mrsw_t) core; \ diff --git a/m-tuple.h b/m-tuple.h index 7731e5d4..4e2b1e43 100644 --- a/m-tuple.h +++ b/m-tuple.h @@ -31,14 +31,14 @@ USAGE: TUPLE_DEF2(name, [(field1, type1[, oplist1]), (field2, type2[, oplist2]), ...] ) */ #define TUPLE_DEF2(name, ...) \ - TUPLEI_DEF2_A( (name, TUPLEI_INJECT_GLOBAL(__VA_ARGS__)) ) + TUPLEI_DEF2_P1( (name, TUPLEI_INJECT_GLOBAL(__VA_ARGS__)) ) /* Define the oplist of a tuple. USAGE: TUPLE_OPLIST(name[, oplist of the first type, ...]) */ #define TUPLE_OPLIST(...) \ M_IF_NARGS_EQ1(__VA_ARGS__) \ - (TUPLEI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST ), \ - TUPLEI_OPLIST(__VA_ARGS__ )) + (TUPLEI_OPLIST_P1((__VA_ARGS__, M_DEFAULT_OPLIST )), \ + TUPLEI_OPLIST_P1((__VA_ARGS__ ))) /* Return an array suitable for the _cmp_order function. As compound literals are not supported in C++, @@ -78,10 +78,10 @@ namespace m_tuple { #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__) ) -#define TUPLEI_DEF2_A(...) \ - TUPLEI_DEF2_B __VA_ARGS__ +// Deferred evaluation +#define TUPLEI_DEF2_P1(...) TUPLEI_DEF2_P2 __VA_ARGS__ -#define TUPLEI_DEF2_B(name, ...) \ +#define TUPLEI_DEF2_P2(name, ...) \ TUPLE_DEFINE_TYPE(name, __VA_ARGS__) \ TUPLE_DEFINE_ENUM(name, __VA_ARGS__) \ TUPLEI_IF_ALL(INIT, __VA_ARGS__) \ @@ -503,7 +503,10 @@ namespace m_tuple { #define TUPLEI_IF_ALL(method, ...) \ M_IF(M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, method, __VA_ARGS__)) -#define TUPLEI_OPLIST(name, ...) \ +// deferred +#define TUPLEI_OPLIST_P1(arg) TUPLEI_OPLIST_P2 arg + +#define TUPLEI_OPLIST_P2(name, ...) \ (M_IF_METHOD_ALL(INIT, __VA_ARGS__)(INIT(M_C(name,_init)),), \ INIT_SET(M_C(name, _init_set)), \ INIT_WITH(M_C(name, _init_set2)), \ diff --git a/m-variant.h b/m-variant.h index e7140e41..69d2d930 100644 --- a/m-variant.h +++ b/m-variant.h @@ -34,14 +34,14 @@ USAGE: VARIANT_DEF2(name, [(field1, type1, oplist1), (field2, type2, oplist2), ...] ) */ #define VARIANT_DEF2(name, ...) \ - VARIANTI_DEF2_A( (name, VARIANTI_INJECT_GLOBAL(__VA_ARGS__)) ) + VARIANTI_DEF2_P1( (name, VARIANTI_INJECT_GLOBAL(__VA_ARGS__)) ) /* Define the oplist of a variant. USAGE: VARIANT_OPLIST(name[, oplist of the first type, ...]) */ #define VARIANT_OPLIST(...) \ M_IF_NARGS_EQ1(__VA_ARGS__) \ - (VARIANTI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST), \ - VARIANTI_OPLIST(__VA_ARGS__ )) + (VARIANTI_OPLIST_P1((__VA_ARGS__, M_DEFAULT_OPLIST)), \ + VARIANTI_OPLIST_P1((__VA_ARGS__ ))) /********************************** INTERNAL ************************************/ @@ -55,10 +55,10 @@ #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__) ) -#define VARIANTI_DEF2_A(...) \ - VARIANTI_DEF2_B __VA_ARGS__ +// Deferred evaluation +#define VARIANTI_DEF2_P1(...) VARIANTI_DEF2_P2 __VA_ARGS__ -#define VARIANTI_DEF2_B(name, ...) \ +#define VARIANTI_DEF2_P2(name, ...) \ VARIANTI_DEFINE_TYPE(name, __VA_ARGS__) \ VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \ VARIANTI_DEFINE_CLEAR(name, __VA_ARGS__) \ @@ -585,7 +585,10 @@ } \ -#define VARIANTI_OPLIST(name, ...) \ +// deferred +#define VARIANTI_OPLIST_P1(arg) VARIANTI_OPLIST_P2 arg + +#define VARIANTI_OPLIST_P2(name, ...) \ (INIT(M_C(name,_init)), \ INIT_SET(M_C(name, _init_set)), \ SET(M_C(name,_set)), \