Uniformize API
This commit is contained in:
1 parent
06d6a90a21
commit
6c3f7683a5
1 file changed
+47
-25
+47
-25
@@ -32,16 +32,16 @@
|
|||||||
/* Define a protected concurrent container and its associated functions
|
/* Define a protected concurrent container and its associated functions
|
||||||
based on the given container.
|
based on the given container.
|
||||||
USAGE: CONCURRENT_DEF(name, type [, oplist_of_the_type]) */
|
USAGE: CONCURRENT_DEF(name, type [, oplist_of_the_type]) */
|
||||||
#define CONCURRENT_DEF(name, ...) \
|
#define CONCURRENT_DEF(name, ...) \
|
||||||
CONCURRENTI_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
CONCURRENTI_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) ), \
|
||||||
(name, __VA_ARGS__, M_C(name,_t), M_C(name,_it_t))))
|
(name, __VA_ARGS__, M_C(name,_t) )))
|
||||||
|
|
||||||
|
|
||||||
/* Define the oplist of a protected concurrent container given its name and its oplist.
|
/* Define the oplist of a protected concurrent container given its name and its oplist.
|
||||||
USAGE: CONCURRENT_OPLIST(name[, oplist of the type]) */
|
USAGE: CONCURRENT_OPLIST(name[, oplist of the type]) */
|
||||||
#define CONCURRENT_OPLIST(...) \
|
#define CONCURRENT_OPLIST(...) \
|
||||||
CONCURRENTI_OPLIST(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
CONCURRENTI_OPLIST_P1(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
((__VA_ARGS__, M_DEFAULT_OPLIST), \
|
((__VA_ARGS__, M_DEFAULT_OPLIST), \
|
||||||
(__VA_ARGS__ )))
|
(__VA_ARGS__ )))
|
||||||
|
|
||||||
@@ -51,22 +51,23 @@
|
|||||||
can be done in parallel.
|
can be done in parallel.
|
||||||
USAGE: CONCURRENT_RP_DEF(name, type [, oplist_of_the_type]) */
|
USAGE: CONCURRENT_RP_DEF(name, type [, oplist_of_the_type]) */
|
||||||
#define CONCURRENT_RP_DEF(name, ...) \
|
#define CONCURRENT_RP_DEF(name, ...) \
|
||||||
CONCURRENTI_RP_DEF(M_IF_NARGS_EQ1(__VA_ARGS__) \
|
CONCURRENTI_RP_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) ), \
|
||||||
(name, __VA_ARGS__, M_C(name,_t), M_C(name,_it_t))))
|
(name, __VA_ARGS__, M_C(name,_t) )))
|
||||||
|
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
|
|
||||||
// Deferred evaluation for the oplist definition.
|
/* Deferred evaluation for the oplist definition,
|
||||||
#define CONCURRENTI_OPLIST(arg) CONCURRENTI_OPLIST2 arg
|
so that all arguments are evaluated before further expansion */
|
||||||
|
#define CONCURRENTI_OPLIST_P1(arg) CONCURRENTI_OPLIST_P2 arg
|
||||||
|
|
||||||
/* OPLIST definition
|
/* OPLIST definition
|
||||||
GET_KEY is not present as its interface is not compatible with a concurrent
|
GET_KEY is not present as its interface is not compatible with a concurrent
|
||||||
container (_get returns a pointer to an internal data, data that may be
|
container (_get returns a pointer to an internal data, data that may be
|
||||||
destroyed by another thread).
|
destroyed by another thread).
|
||||||
*/
|
*/
|
||||||
#define CONCURRENTI_OPLIST2(name, oplist) \
|
#define CONCURRENTI_OPLIST_P2(name, oplist) \
|
||||||
(M_IF_METHOD(INIT, oplist)(INIT(M_C(name, _init)),) \
|
(M_IF_METHOD(INIT, oplist)(INIT(M_C(name, _init)),) \
|
||||||
,M_IF_METHOD(INIT_SET, oplist)(INIT_SET(M_C(name, _init_set)),) \
|
,M_IF_METHOD(INIT_SET, oplist)(INIT_SET(M_C(name, _init_set)),) \
|
||||||
,M_IF_METHOD(SET, oplist)(SET(M_C(name, _set)),) \
|
,M_IF_METHOD(SET, oplist)(SET(M_C(name, _set)),) \
|
||||||
@@ -94,8 +95,8 @@
|
|||||||
,M_IF_METHOD(PARSE_STR, oplist)(PARSE_STR(M_C(name, _parse_str)),) \
|
,M_IF_METHOD(PARSE_STR, oplist)(PARSE_STR(M_C(name, _parse_str)),) \
|
||||||
,M_IF_METHOD(OUT_STR, oplist)(OUT_STR(M_C(name, _out_str)),) \
|
,M_IF_METHOD(OUT_STR, oplist)(OUT_STR(M_C(name, _out_str)),) \
|
||||||
,M_IF_METHOD(IN_STR, oplist)(IN_STR(M_C(name, _in_str)),) \
|
,M_IF_METHOD(IN_STR, oplist)(IN_STR(M_C(name, _in_str)),) \
|
||||||
,M_IF_METHOD(OUT_SERIAL, oplist)(OUT_SERIAL(M_C(name, _out_serial)),) \
|
,M_IF_METHOD(OUT_SERIAL, oplist)(OUT_SERIAL(M_C(name, _out_serial)),) \
|
||||||
,M_IF_METHOD(IN_SERIAL, oplist)(IN_SERIAL(M_C(name, _in_serial)),) \
|
,M_IF_METHOD(IN_SERIAL, oplist)(IN_SERIAL(M_C(name, _in_serial)),) \
|
||||||
,M_IF_METHOD(EQUAL, oplist)(EQUAL(M_C(name, _equal_p)),) \
|
,M_IF_METHOD(EQUAL, oplist)(EQUAL(M_C(name, _equal_p)),) \
|
||||||
,M_IF_METHOD(HASH, oplist)(HASH(M_C(name, _hash)),) \
|
,M_IF_METHOD(HASH, oplist)(HASH(M_C(name, _hash)),) \
|
||||||
,M_IF_METHOD(NEW, oplist)(NEW(M_GET_NEW oplist),) \
|
,M_IF_METHOD(NEW, oplist)(NEW(M_GET_NEW oplist),) \
|
||||||
@@ -103,15 +104,24 @@
|
|||||||
,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \
|
,M_IF_METHOD(DEL, oplist)(DEL(M_GET_DEL oplist),) \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/* Internal contract
|
||||||
|
Nothing notable. Can't check too much without locking the structure itself
|
||||||
|
*/
|
||||||
#define CONCURRENTI_CONTRACT(c) do { \
|
#define CONCURRENTI_CONTRACT(c) do { \
|
||||||
assert ((c) != NULL); \
|
assert ((c) != NULL); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
// Deferred evaluation for the concurrent definition.
|
/* Deferred evaluation for the concurrent definition,
|
||||||
#define CONCURRENTI_DEF(arg) CONCURRENTI_DEF2 arg
|
so that all arguments are evaluated before further expansion */
|
||||||
|
#define CONCURRENTI_DEF_P1(arg) CONCURRENTI_DEF_P2 arg
|
||||||
|
|
||||||
// Internal definition.
|
/* Internal concurrent definition
|
||||||
#define CONCURRENTI_DEF2(name, type, oplist, concurrent_t, concurrent_it_t) \
|
- name: prefix to be used
|
||||||
|
- type: type of the sub container
|
||||||
|
- oplist: oplist of the type of the sub container
|
||||||
|
- concurrent_t: alias for M_C(name, _t) [ type of the container ]
|
||||||
|
*/
|
||||||
|
#define CONCURRENTI_DEF_P2(name, type, oplist, concurrent_t) \
|
||||||
\
|
\
|
||||||
typedef struct M_C(name, _s) { \
|
typedef struct M_C(name, _s) { \
|
||||||
struct M_C(name, _s) *self; \
|
struct M_C(name, _s) *self; \
|
||||||
@@ -188,11 +198,17 @@
|
|||||||
m_cond_broadcast(out->there_is_data); \
|
m_cond_broadcast(out->there_is_data); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
CONCURRENTI_DEF_FUNC(name, type, oplist, concurrent_t, concurrent_it_t)
|
CONCURRENTI_DEF_FUNC_P3(name, type, oplist, concurrent_t)
|
||||||
|
|
||||||
|
|
||||||
// Internal definition of the functions.
|
/* Internal definition of the functions commons to concurrent and rp-concurrent
|
||||||
#define CONCURRENTI_DEF_FUNC(name, type, oplist, concurrent_t, concurrent_it_t) \
|
- name: prefix to be used
|
||||||
|
- type: type of the sub container
|
||||||
|
- oplist: oplist of the type of the sub container
|
||||||
|
- concurrent_t: alias for M_C(name, _t) [ type of the container ]
|
||||||
|
*/
|
||||||
|
#define CONCURRENTI_DEF_FUNC_P3(name, type, oplist, concurrent_t) \
|
||||||
|
\
|
||||||
M_IF_METHOD(INIT, oplist)( \
|
M_IF_METHOD(INIT, oplist)( \
|
||||||
static inline void \
|
static inline void \
|
||||||
M_C(name, _init)(concurrent_t out) \
|
M_C(name, _init)(concurrent_t out) \
|
||||||
@@ -621,11 +637,17 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Deferred evaluation for the concurrent definition.
|
/* Deferred evaluation for the RP concurrent definition,
|
||||||
#define CONCURRENTI_RP_DEF(arg) CONCURRENTI_RP_DEF2 arg
|
so that all arguments are evaluated before further expansion */
|
||||||
|
#define CONCURRENTI_RP_DEF_P1(arg) CONCURRENTI_RP_DEF_P2 arg
|
||||||
|
|
||||||
// Internal definition of RP
|
/* Internal RP concurrent definition
|
||||||
#define CONCURRENTI_RP_DEF2(name, type, oplist, concurrent_t, concurrent_it_t) \
|
- name: prefix to be used
|
||||||
|
- type: type of the sub container
|
||||||
|
- oplist: oplist of the type of the sub container
|
||||||
|
- concurrent_t: alias for M_C(name, _t) [ type of the container ]
|
||||||
|
*/
|
||||||
|
#define CONCURRENTI_RP_DEF_P2(name, type, oplist, concurrent_t) \
|
||||||
\
|
\
|
||||||
typedef struct M_C(name, _s) { \
|
typedef struct M_C(name, _s) { \
|
||||||
struct M_C(name, _s) *self; \
|
struct M_C(name, _s) *self; \
|
||||||
@@ -756,7 +778,7 @@
|
|||||||
m_mutex_unlock (out->lock); \
|
m_mutex_unlock (out->lock); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
CONCURRENTI_DEF_FUNC(name, type, oplist, concurrent_t, concurrent_it_t)
|
CONCURRENTI_DEF_FUNC_P3(name, type, oplist, concurrent_t)
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in new issue
Block a user