Uniformize the macro names
This commit is contained in:
1 parent
5321085856
commit
60a10eb799
7 files changed
+124
-103
No files matched your search
+27
-27
@@ -46,15 +46,15 @@
|
|||||||
USAGE:
|
USAGE:
|
||||||
ILIST_DEF(name, type [, oplist_of_the_type]) */
|
ILIST_DEF(name, type [, oplist_of_the_type]) */
|
||||||
#define ILIST_DEF(name, ...) \
|
#define ILIST_DEF(name, ...) \
|
||||||
ILISTI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
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_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) )))
|
(name, __VA_ARGS__, M_C(name, _t), M_C(name, _it_t) )))
|
||||||
|
|
||||||
/* Define the oplist of a doubly-linked instrusive list of type.
|
/* Define the oplist of a doubly-linked instrusive list of type.
|
||||||
USAGE:
|
USAGE:
|
||||||
ILIST_OPLIST(name [, oplist_of_the_type]) */
|
ILIST_OPLIST(name [, oplist_of_the_type]) */
|
||||||
#define ILIST_OPLIST(...) \
|
#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__, M_DEFAULT_OPLIST), \
|
||||||
(__VA_ARGS__ )))
|
(__VA_ARGS__ )))
|
||||||
|
|
||||||
@@ -68,10 +68,10 @@ typedef struct ilist_head_s {
|
|||||||
} ilist_head_t;
|
} ilist_head_t;
|
||||||
|
|
||||||
/* Indirection call to allow expanding all arguments */
|
/* 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 the oplist of an ilist of type */
|
||||||
#define ILISTI_OPLIST2(name,oplist) \
|
#define ILISTI_OPLIST_P2(name,oplist) \
|
||||||
(INIT(M_C(name, _init)), \
|
(INIT(M_C(name, _init)), \
|
||||||
CLEAR(M_C(name, _clear)), \
|
CLEAR(M_C(name, _clear)), \
|
||||||
INIT_MOVE(M_C(name, _init_move)), \
|
INIT_MOVE(M_C(name, _init_move)), \
|
||||||
@@ -120,7 +120,7 @@ typedef struct ilist_head_s {
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
/* Indirection call to allow expanding all arguments (TBC) */
|
/* 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.
|
/* Definition of the type and function for an intrusive doubly-linked list.
|
||||||
USAGE:
|
USAGE:
|
||||||
@@ -128,9 +128,9 @@ typedef struct ilist_head_s {
|
|||||||
type: type of the object
|
type: type of the object
|
||||||
oplist: oplist of the type
|
oplist: oplist of the type
|
||||||
list_t: type of the intrusive list (name##_t)
|
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) { \
|
typedef struct M_C(name, _s) { \
|
||||||
struct ilist_head_s name; \
|
struct ilist_head_s name; \
|
||||||
@@ -145,7 +145,7 @@ typedef struct ilist_head_s {
|
|||||||
struct ilist_head_s *previous; \
|
struct ilist_head_s *previous; \
|
||||||
struct ilist_head_s *current; \
|
struct ilist_head_s *current; \
|
||||||
struct ilist_head_s *next; \
|
struct ilist_head_s *next; \
|
||||||
} list_it_t[1]; \
|
} it_t[1]; \
|
||||||
\
|
\
|
||||||
static inline void M_C(name, _init)(list_t list) \
|
static inline void M_C(name, _init)(list_t list) \
|
||||||
{ \
|
{ \
|
||||||
@@ -316,7 +316,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
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); \
|
ILISTI_CONTRACT(name, list); \
|
||||||
assert (it != NULL); \
|
assert (it != NULL); \
|
||||||
@@ -328,7 +328,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
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); \
|
assert (it != NULL && cit != NULL); \
|
||||||
it->head = cit->head; \
|
it->head = cit->head; \
|
||||||
@@ -339,7 +339,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
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); \
|
ILISTI_CONTRACT(name, list); \
|
||||||
assert (it != NULL); \
|
assert (it != NULL); \
|
||||||
@@ -351,7 +351,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
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); \
|
assert (it != NULL && list != NULL); \
|
||||||
it->head = list->name.next->prev; \
|
it->head = list->name.next->prev; \
|
||||||
@@ -362,7 +362,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline bool \
|
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); \
|
assert (it != NULL); \
|
||||||
ILISTI_NODE_CONTRACT(it->current); \
|
ILISTI_NODE_CONTRACT(it->current); \
|
||||||
@@ -370,7 +370,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline bool \
|
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); \
|
assert (it != NULL); \
|
||||||
ILISTI_NODE_CONTRACT(it->current); \
|
ILISTI_NODE_CONTRACT(it->current); \
|
||||||
@@ -378,7 +378,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name, _next)(list_it_t it) \
|
M_C(name, _next)(it_t it) \
|
||||||
{ \
|
{ \
|
||||||
assert (it != NULL); \
|
assert (it != NULL); \
|
||||||
/* Cannot check node for it->current: it may have been deleted! */ \
|
/* Cannot check node for it->current: it may have been deleted! */ \
|
||||||
@@ -393,7 +393,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name, _previous)(list_it_t it) \
|
M_C(name, _previous)(it_t it) \
|
||||||
{ \
|
{ \
|
||||||
assert (it != NULL); \
|
assert (it != NULL); \
|
||||||
/* Cannot check node for it->current: it may have been deleted! */ \
|
/* Cannot check node for it->current: it may have been deleted! */ \
|
||||||
@@ -408,7 +408,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline bool \
|
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); \
|
assert (it1 != NULL && it2 != NULL); \
|
||||||
/* No need to check for next & previous */ \
|
/* No need to check for next & previous */ \
|
||||||
@@ -416,7 +416,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline type * \
|
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); \
|
assert (it != NULL && it->current != NULL); \
|
||||||
ILISTI_NODE_CONTRACT(it->current); \
|
ILISTI_NODE_CONTRACT(it->current); \
|
||||||
@@ -429,14 +429,14 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline type const * \
|
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); \
|
type *ptr = M_C(name, _ref)(it); \
|
||||||
return M_CONST_CAST(type, ptr); \
|
return M_CONST_CAST(type, ptr); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
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_CONTRACT(name, list); \
|
||||||
ILISTI_NODE_CONTRACT(it->current); \
|
ILISTI_NODE_CONTRACT(it->current); \
|
||||||
@@ -451,7 +451,7 @@ typedef struct ilist_head_s {
|
|||||||
\
|
\
|
||||||
M_IF_METHOD(NEW, oplist)( \
|
M_IF_METHOD(NEW, oplist)( \
|
||||||
static inline void \
|
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_CONTRACT(name, list); \
|
||||||
ILISTI_NODE_CONTRACT(it->current); \
|
ILISTI_NODE_CONTRACT(it->current); \
|
||||||
@@ -508,7 +508,7 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
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, nv); \
|
||||||
ILISTI_CONTRACT(name, ov); \
|
ILISTI_CONTRACT(name, ov); \
|
||||||
@@ -524,8 +524,8 @@ typedef struct ilist_head_s {
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name, _splice_at)(list_t nlist, list_it_t npos, \
|
M_C(name, _splice_at)(list_t nlist, it_t npos, \
|
||||||
list_t olist, list_it_t opos) \
|
list_t olist, it_t opos) \
|
||||||
{ \
|
{ \
|
||||||
ILISTI_CONTRACT(name, nlist); \
|
ILISTI_CONTRACT(name, nlist); \
|
||||||
ILISTI_CONTRACT(name, olist); \
|
ILISTI_CONTRACT(name, olist); \
|
||||||
@@ -590,7 +590,7 @@ typedef struct ilist_head_s {
|
|||||||
ILISTI_CONTRACT(name, list); \
|
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
|
#endif
|
||||||
+13
-10
@@ -31,9 +31,9 @@
|
|||||||
/* Define the oplist of a intrusive shared pointer.
|
/* Define the oplist of a intrusive shared pointer.
|
||||||
USAGE: ISHARED_OPLIST(name [, oplist_of_the_type]) */
|
USAGE: ISHARED_OPLIST(name [, oplist_of_the_type]) */
|
||||||
#define ISHARED_PTR_OPLIST(...) \
|
#define ISHARED_PTR_OPLIST(...) \
|
||||||
ISHAREDI_PTR_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
ISHAREDI_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
((__VA_ARGS__, M_DEFAULT_OPLIST), \
|
((__VA_ARGS__, M_DEFAULT_OPLIST), \
|
||||||
(__VA_ARGS__ )))
|
(__VA_ARGS__ )))
|
||||||
|
|
||||||
/* Interface to add to a structure to allow intrusive support.
|
/* Interface to add to a structure to allow intrusive support.
|
||||||
name: name of the intrusive shared pointer.
|
name: name of the intrusive shared pointer.
|
||||||
@@ -45,16 +45,18 @@
|
|||||||
/* Define the intrusive shared pointer type and its static inline functions.
|
/* Define the intrusive shared pointer type and its static inline functions.
|
||||||
USAGE: ISHARED_PTR_DEF(name[, oplist]) */
|
USAGE: ISHARED_PTR_DEF(name[, oplist]) */
|
||||||
#define ISHARED_PTR_DEF(name, ...) \
|
#define ISHARED_PTR_DEF(name, ...) \
|
||||||
ISHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \
|
||||||
(name, __VA_ARGS__ )))
|
(name, __VA_ARGS__ )))
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** 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(M_INIT_DEFAULT), \
|
||||||
INIT_SET(M_C(name, _init_set2) M_IPTR), \
|
INIT_SET(M_C(name, _init_set2) M_IPTR), \
|
||||||
SET(M_C(name, _set) M_IPTR), \
|
SET(M_C(name, _set) M_IPTR), \
|
||||||
@@ -68,9 +70,10 @@
|
|||||||
,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \
|
,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,_t); \
|
||||||
typedef type M_C(name, _type_t); \
|
typedef type M_C(name, _type_t); \
|
||||||
|
|||||||
+20
-10
@@ -33,26 +33,29 @@
|
|||||||
/* Define a prioqueue of a given type and its associated functions.
|
/* Define a prioqueue of a given type and its associated functions.
|
||||||
USAGE: PRIOQUEUE_DEF(name, type [, oplist_of_the_type]) */
|
USAGE: PRIOQUEUE_DEF(name, type [, oplist_of_the_type]) */
|
||||||
#define PRIOQUEUE_DEF(name, ...) \
|
#define PRIOQUEUE_DEF(name, ...) \
|
||||||
PRIOQUEUEI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
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_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))))
|
(name, __VA_ARGS__, M_C(name,_t), M_C(name,_it_t))))
|
||||||
|
|
||||||
|
|
||||||
/* Define the oplist of a prioqueue of type.
|
/* Define the oplist of a prioqueue of type.
|
||||||
USAGE: PRIOQUEUE_OPLIST(name[, oplist of the type]) */
|
USAGE: PRIOQUEUE_OPLIST(name[, oplist of the type]) */
|
||||||
#define PRIOQUEUE_OPLIST(...) \
|
#define PRIOQUEUE_OPLIST(...) \
|
||||||
PRIOQUEUEI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
PRIOQUEUEI_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
((__VA_ARGS__, M_DEFAULT_OPLIST), \
|
((__VA_ARGS__, M_DEFAULT_OPLIST), \
|
||||||
(__VA_ARGS__ )))
|
(__VA_ARGS__ )))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
|
|
||||||
#define PRIOQUEUEI_OPLIST(arg) PRIOQUEUEI_OPLIST2 arg
|
/* Deferred evaluation for the definition,
|
||||||
#define PRIOQUEUEI_DEF(arg) PRIOQUEUEI_DEF2 arg
|
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(M_C(name, _init)) \
|
||||||
,INIT_SET(M_C(name, _init_set)) \
|
,INIT_SET(M_C(name, _init_set)) \
|
||||||
,INIT_WITH(API_1(M_INIT_VAI)) \
|
,INIT_WITH(API_1(M_INIT_VAI)) \
|
||||||
@@ -71,7 +74,14 @@
|
|||||||
,GET_SIZE(M_C(name, _size)) \
|
,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) \
|
ARRAY_DEF(M_C(name, _array), type, oplist) \
|
||||||
\
|
\
|
||||||
typedef type M_C(name, _type_t); \
|
typedef type M_C(name, _type_t); \
|
||||||
|
|||||||
+18
-18
@@ -32,40 +32,40 @@
|
|||||||
/* Define the oplist of a shared pointer.
|
/* Define the oplist of a shared pointer.
|
||||||
USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */
|
USAGE: SHARED_OPLIST(name [, oplist_of_the_type]) */
|
||||||
#define SHARED_PTR_OPLIST(...) \
|
#define SHARED_PTR_OPLIST(...) \
|
||||||
SHAREDI_PTR_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
SHAREDI_PTR_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
((__VA_ARGS__, M_DEFAULT_OPLIST ), \
|
((__VA_ARGS__, M_DEFAULT_OPLIST ), \
|
||||||
_OPLIST(__VA_ARGS__ )))
|
_OPLIST(__VA_ARGS__ )))
|
||||||
|
|
||||||
/* Define shared pointer and its function.
|
/* Define shared pointer and its function.
|
||||||
USAGE: SHARED_PTR_DEF(name, type, [, oplist]) */
|
USAGE: SHARED_PTR_DEF(name, type, [, oplist]) */
|
||||||
#define SHARED_PTR_DEF(name, ...) \
|
#define SHARED_PTR_DEF(name, ...) \
|
||||||
SHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), SHAREDI_ATOMIC_OPLIST ), \
|
||||||
(name, __VA_ARGS__ , SHAREDI_ATOMIC_OPLIST)))
|
(name, __VA_ARGS__ , SHAREDI_ATOMIC_OPLIST)))
|
||||||
|
|
||||||
/* Define relaxed shared pointer and its function (thread unsafe).
|
/* Define relaxed shared pointer and its function (thread unsafe).
|
||||||
USAGE: SHARED_PTR_RELAXED_DEF(name, type, [, oplist]) */
|
USAGE: SHARED_PTR_RELAXED_DEF(name, type, [, oplist]) */
|
||||||
#define SHARED_PTR_RELAXED_DEF(name, ...) \
|
#define SHARED_PTR_RELAXED_DEF(name, ...) \
|
||||||
SHAREDI_PTR_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), SHAREDI_INTEGER_OPLIST ), \
|
||||||
(name, __VA_ARGS__ , SHAREDI_INTEGER_OPLIST)))
|
(name, __VA_ARGS__ , SHAREDI_INTEGER_OPLIST)))
|
||||||
|
|
||||||
/* Define shared resource and its function.
|
/* Define shared resource and its function.
|
||||||
This is a bounded pool of resource shared by multiple owners.
|
This is a bounded pool of resource shared by multiple owners.
|
||||||
USAGE: SHARED_RESOURCE_DEF(name, type, [, oplist]) */
|
USAGE: SHARED_RESOURCE_DEF(name, type, [, oplist]) */
|
||||||
#define SHARED_RESOURCE_DEF(name, ...) \
|
#define SHARED_RESOURCE_DEF(name, ...) \
|
||||||
SHAREDI_RESOURCE_DEF(M_IF_NARGS_EQ1(__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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__) ), \
|
||||||
(name, __VA_ARGS__)))
|
(name, __VA_ARGS__)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
|
|
||||||
// deferred
|
// 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)), \
|
INIT(M_C(name, _init)), \
|
||||||
CLEAR(M_C(name, _clear)), \
|
CLEAR(M_C(name, _clear)), \
|
||||||
INIT_SET(M_C(name, _init_set)), \
|
INIT_SET(M_C(name, _init_set)), \
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
// deferred
|
// 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
|
// OPLIST to handle a counter of atomic type
|
||||||
#define SHAREDI_ATOMIC_OPLIST (TYPE(atomic_int), \
|
#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); \
|
assert(*shared == NULL || M_CALL_IT_CREF(cpt_oplist, &(*shared)->cpt) >= 1); \
|
||||||
} while (0)
|
} 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){ \
|
typedef struct M_C(name, _s){ \
|
||||||
type *data; /* Pointer to the data */ \
|
type *data; /* Pointer to the data */ \
|
||||||
@@ -297,9 +297,9 @@ static inline int sharedi_integer_cref(int *p) { return *p; }
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// deferred
|
// 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 */ \
|
/* Create an aligned type to avoid false sharing between threads */ \
|
||||||
typedef struct M_C(name, _atype_s) { \
|
typedef struct M_C(name, _atype_s) { \
|
||||||
|
|||||||
+26
-24
@@ -32,39 +32,39 @@
|
|||||||
/* Define a Single Producer Single Consummer snapshot and its functions
|
/* Define a Single Producer Single Consummer snapshot and its functions
|
||||||
USAGE: SNAPSHOT_SPSC_DEF(name, type[, oplist]) */
|
USAGE: SNAPSHOT_SPSC_DEF(name, type[, oplist]) */
|
||||||
#define SNAPSHOT_SPSC_DEF(name, ...) \
|
#define SNAPSHOT_SPSC_DEF(name, ...) \
|
||||||
SNAPSHOTI_SPSC_DEF(M_IF_NARGS_EQ1(__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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \
|
||||||
(name, __VA_ARGS__ )))
|
(name, __VA_ARGS__ )))
|
||||||
|
|
||||||
/* Define a Single Producer Multiple Consummer snapshot and its functions
|
/* Define a Single Producer Multiple Consummer snapshot and its functions
|
||||||
USAGE: SNAPSHOT_SPMC_DEF(name, type[, oplist]) */
|
USAGE: SNAPSHOT_SPMC_DEF(name, type[, oplist]) */
|
||||||
#define SNAPSHOT_SPMC_DEF(name, ...) \
|
#define SNAPSHOT_SPMC_DEF(name, ...) \
|
||||||
SNAPSHOTI_SPMC_DEF(M_IF_NARGS_EQ1(__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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \
|
||||||
(name, __VA_ARGS__ )))
|
(name, __VA_ARGS__ )))
|
||||||
|
|
||||||
/* Define a Multiple Producer Multiple Consummer snapshot and its functions
|
/* Define a Multiple Producer Multiple Consummer snapshot and its functions
|
||||||
USAGE: SNAPSHOT_MPMC_DEF(name, type[, oplist]) */
|
USAGE: SNAPSHOT_MPMC_DEF(name, type[, oplist]) */
|
||||||
#define SNAPSHOT_MPMC_DEF(name, ...) \
|
#define SNAPSHOT_MPMC_DEF(name, ...) \
|
||||||
SNAPSHOTI_MPMC_DEF(M_IF_NARGS_EQ1(__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__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)() ), \
|
||||||
(name, __VA_ARGS__ )))
|
(name, __VA_ARGS__ )))
|
||||||
|
|
||||||
/* Define the oplist of a snapshot (SPSC, SPMC or MPMC).
|
/* Define the oplist of a snapshot (SPSC, SPMC or MPMC).
|
||||||
USAGE: SNAPSHOT_OPLIST(name[, oplist]) */
|
USAGE: SNAPSHOT_OPLIST(name[, oplist]) */
|
||||||
#define SNAPSHOT_OPLIST(...) \
|
#define SNAPSHOT_OPLIST(...) \
|
||||||
SNAPSHOTI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
SNAPSHOTI_OPLIST_P1(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__ )))
|
(__VA_ARGS__ )))
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
|
|
||||||
// deferred evaluation of the input
|
// 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 the oplist of a snapshot */
|
||||||
#define SNAPSHOTI_OPLIST2(name, oplist) \
|
#define SNAPSHOTI_OPLIST_P2(name, oplist) \
|
||||||
(INIT(M_C(name, _init)) \
|
(INIT(M_C(name, _init)) \
|
||||||
,INIT_SET(M_C(name, _init_set)) \
|
,INIT_SET(M_C(name, _init_set)) \
|
||||||
,SET(M_C(name, _set)) \
|
,SET(M_C(name, _set)) \
|
||||||
@@ -108,14 +108,14 @@
|
|||||||
SNAPSHOTI_SPSC_FLAGS_CONTRACT(f); \
|
SNAPSHOTI_SPSC_FLAGS_CONTRACT(f); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// Defered evaluation (TBC if it really helps).
|
// Defered evaluation of the arguments.
|
||||||
#define SNAPSHOTI_SPSC_DEF(arg) SNAPSHOTI_SPSC_DEF2 arg
|
#define SNAPSHOTI_SPSC_DEF_P1(arg) SNAPSHOTI_SPSC_DEF_P2 arg
|
||||||
|
|
||||||
// This is basically an atomic triple buffer (Lock Free)
|
// This is basically an atomic triple buffer (Lock Free)
|
||||||
// between a produced thread and a consummer thread.
|
// between a produced thread and a consummer thread.
|
||||||
#define SNAPSHOTI_SPSC_MAX_BUFFER 3
|
#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 */ \
|
/* Create an aligned type to avoid false sharing between threads */ \
|
||||||
typedef struct M_C(name, _aligned_type_s) { \
|
typedef struct M_C(name, _aligned_type_s) { \
|
||||||
@@ -269,6 +269,7 @@
|
|||||||
} \
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************** INTERNAL SPMC **********************************/
|
/******************************** INTERNAL SPMC **********************************/
|
||||||
|
|
||||||
#define SNAPSHOTI_SPMC_INT_FLAG(w, n) ( ((w) << 1) | (n) )
|
#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)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
// Defered evaluation (TBC if it really helps).
|
// Defered evaluation
|
||||||
#define SNAPSHOTI_SPMC_DEF(arg) SNAPSHOTI_SPMC_DEF2 arg
|
#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 */ \
|
/* Create an aligned type to avoid false sharing between threads */ \
|
||||||
typedef struct M_C(name, _aligned_type_s) { \
|
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.
|
//FIXME: Evaluate the needs for the methods _set_, _init_set.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************** INTERNAL MPMC **********************************/
|
/******************************** INTERNAL MPMC **********************************/
|
||||||
|
|
||||||
// MPMC is built upon SPMC
|
// MPMC is built upon SPMC
|
||||||
|
|
||||||
// Defered evaluation (TBC if it really helps).
|
// Defered evaluation
|
||||||
#define SNAPSHOTI_MPMC_DEF(arg) SNAPSHOTI_MPMC_DEF2 arg
|
#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) { \
|
typedef struct M_C(name, _s) { \
|
||||||
M_C(name, _mrsw_t) core; \
|
M_C(name, _mrsw_t) core; \
|
||||||
|
|||||||
@@ -31,14 +31,14 @@
|
|||||||
USAGE:
|
USAGE:
|
||||||
TUPLE_DEF2(name, [(field1, type1[, oplist1]), (field2, type2[, oplist2]), ...] ) */
|
TUPLE_DEF2(name, [(field1, type1[, oplist1]), (field2, type2[, oplist2]), ...] ) */
|
||||||
#define TUPLE_DEF2(name, ...) \
|
#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.
|
/* Define the oplist of a tuple.
|
||||||
USAGE: TUPLE_OPLIST(name[, oplist of the first type, ...]) */
|
USAGE: TUPLE_OPLIST(name[, oplist of the first type, ...]) */
|
||||||
#define TUPLE_OPLIST(...) \
|
#define TUPLE_OPLIST(...) \
|
||||||
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
(TUPLEI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST ), \
|
(TUPLEI_OPLIST_P1((__VA_ARGS__, M_DEFAULT_OPLIST )), \
|
||||||
TUPLEI_OPLIST(__VA_ARGS__ ))
|
TUPLEI_OPLIST_P1((__VA_ARGS__ )))
|
||||||
|
|
||||||
/* Return an array suitable for the _cmp_order function.
|
/* Return an array suitable for the _cmp_order function.
|
||||||
As compound literals are not supported in C++,
|
As compound literals are not supported in C++,
|
||||||
@@ -78,10 +78,10 @@ namespace m_tuple {
|
|||||||
#define TUPLEI_INJECT_OPLIST_B( f, ... ) \
|
#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(...) \
|
// Deferred evaluation
|
||||||
TUPLEI_DEF2_B __VA_ARGS__
|
#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_TYPE(name, __VA_ARGS__) \
|
||||||
TUPLE_DEFINE_ENUM(name, __VA_ARGS__) \
|
TUPLE_DEFINE_ENUM(name, __VA_ARGS__) \
|
||||||
TUPLEI_IF_ALL(INIT, __VA_ARGS__) \
|
TUPLEI_IF_ALL(INIT, __VA_ARGS__) \
|
||||||
@@ -503,7 +503,10 @@ namespace m_tuple {
|
|||||||
#define TUPLEI_IF_ALL(method, ...) \
|
#define TUPLEI_IF_ALL(method, ...) \
|
||||||
M_IF(M_REDUCE2(TUPLE_TEST_METHOD_P, M_AND, method, __VA_ARGS__))
|
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)),), \
|
(M_IF_METHOD_ALL(INIT, __VA_ARGS__)(INIT(M_C(name,_init)),), \
|
||||||
INIT_SET(M_C(name, _init_set)), \
|
INIT_SET(M_C(name, _init_set)), \
|
||||||
INIT_WITH(M_C(name, _init_set2)), \
|
INIT_WITH(M_C(name, _init_set2)), \
|
||||||
|
|||||||
+10
-7
@@ -34,14 +34,14 @@
|
|||||||
USAGE:
|
USAGE:
|
||||||
VARIANT_DEF2(name, [(field1, type1, oplist1), (field2, type2, oplist2), ...] ) */
|
VARIANT_DEF2(name, [(field1, type1, oplist1), (field2, type2, oplist2), ...] ) */
|
||||||
#define VARIANT_DEF2(name, ...) \
|
#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.
|
/* Define the oplist of a variant.
|
||||||
USAGE: VARIANT_OPLIST(name[, oplist of the first type, ...]) */
|
USAGE: VARIANT_OPLIST(name[, oplist of the first type, ...]) */
|
||||||
#define VARIANT_OPLIST(...) \
|
#define VARIANT_OPLIST(...) \
|
||||||
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
(VARIANTI_OPLIST(__VA_ARGS__, M_DEFAULT_OPLIST), \
|
(VARIANTI_OPLIST_P1((__VA_ARGS__, M_DEFAULT_OPLIST)), \
|
||||||
VARIANTI_OPLIST(__VA_ARGS__ ))
|
VARIANTI_OPLIST_P1((__VA_ARGS__ )))
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
@@ -55,10 +55,10 @@
|
|||||||
#define VARIANTI_INJECT_OPLIST_B( f, ... ) \
|
#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(...) \
|
// Deferred evaluation
|
||||||
VARIANTI_DEF2_B __VA_ARGS__
|
#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_TYPE(name, __VA_ARGS__) \
|
||||||
VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \
|
VARIANTI_DEFINE_INIT(name, __VA_ARGS__) \
|
||||||
VARIANTI_DEFINE_CLEAR(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(M_C(name,_init)), \
|
||||||
INIT_SET(M_C(name, _init_set)), \
|
INIT_SET(M_C(name, _init_set)), \
|
||||||
SET(M_C(name,_set)), \
|
SET(M_C(name,_set)), \
|
||||||
|
|||||||
Reference in new issue
Block a user