Add oplist
This commit is contained in:
1 parent
4e7cbae766
commit
2991c7cc5a
1 file changed
+67
-2
+67
-2
@@ -93,12 +93,70 @@
|
|||||||
((name, shared_t, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), static inline ), \
|
((name, shared_t, __VA_ARGS__, M_GLOBAL_OPLIST_OR_DEF(__VA_ARGS__)(), static inline ), \
|
||||||
(name, shared_t, __VA_ARGS__, static inline )))
|
(name, shared_t, __VA_ARGS__, static inline )))
|
||||||
|
|
||||||
|
/* Define the oplist of a shared pointer given its name and its oplist.
|
||||||
|
Oplist is mandatory.
|
||||||
|
USAGE: SHARED_PTR_OPLIST(name, oplist of the type) */
|
||||||
|
#define M_SHARED_PTR_OPLIST(...) \
|
||||||
|
M_SHAR3D_OPLIST_P1 ((__VA_ARGS__ ))
|
||||||
|
|
||||||
|
/* Define the oplist of a shared pointer as a shared data given its name and its oplist.
|
||||||
|
Oplist is mandatory.
|
||||||
|
USAGE: SHARED_DATA_OPLIST(name, oplist of the type) */
|
||||||
|
#define M_SHARED_DATA_OPLIST(...) \
|
||||||
|
M_SHAR3D_DATA_OPLIST_P1 ((__VA_ARGS__ ))
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************************** INTERNAL *********************************/
|
/********************************** INTERNAL *********************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* Deferred evaluation for the oplist definition,
|
||||||
|
so that all arguments are evaluated before further expansion */
|
||||||
|
#define M_SHAR3D_OPLIST_P1(arg) M_SHAR3D_OPLIST_P2 arg
|
||||||
|
|
||||||
|
/* Validation of the given oplist */
|
||||||
|
#define M_SHAR3D_OPLIST_P2(name, oplist) \
|
||||||
|
M_IF_OPLIST(oplist)(M_SHAR3D_OPLIST_P3, M_SHAR3D_OPLIST_FAILURE)(name, oplist)
|
||||||
|
|
||||||
|
/* Prepare a clean compilation failure */
|
||||||
|
#define M_SHAR3D_OPLIST_FAILURE(name, oplist) \
|
||||||
|
((M_LIB_ERROR(ARGUMENT_OF_SHARED_PTR_OPLIST_IS_NOT_AN_OPLIST, name, oplist)))
|
||||||
|
|
||||||
|
/* OPLIST definition of a shared pointer */
|
||||||
|
#define M_SHAR3D_OPLIST_P3(name, oplist) \
|
||||||
|
(NAME(name), TYPE(struct M_C(name,_s) *) \
|
||||||
|
,M_IF_METHOD(INIT)(INIT(API_4(M_F(name, _new))),) \
|
||||||
|
,INIT_SET(API_4(M_F(name, _acquire))) \
|
||||||
|
,SET(API_2(M_F(name, _set))) \
|
||||||
|
,CLEAR(M_F(name, _release)) \
|
||||||
|
,INIT_MOVE(M_SET_BASIC) \
|
||||||
|
,MOVE(M_SET_BASIC) \
|
||||||
|
)
|
||||||
|
|
||||||
|
/* Deferred evaluation for the oplist definition,
|
||||||
|
so that all arguments are evaluated before further expansion */
|
||||||
|
#define M_SHAR3D_DATA_OPLIST_P1(arg) M_SHAR3D_DATA_OPLIST_P2 arg
|
||||||
|
|
||||||
|
/* Validation of the given oplist */
|
||||||
|
#define M_SHAR3D_DATA_OPLIST_P2(name, oplist) \
|
||||||
|
M_IF_OPLIST(oplist)(M_SHAR3D_DATA_OPLIST_P3, M_SHAR3D_DATA_OPLIST_FAILURE)(name, oplist)
|
||||||
|
|
||||||
|
/* Prepare a clean compilation failure */
|
||||||
|
#define M_SHAR3D_DATA_OPLIST_FAILURE(name, oplist) \
|
||||||
|
((M_LIB_ERROR(ARGUMENT_OF_SHARED_DATA_OPLIST_IS_NOT_AN_OPLIST, name, oplist)))
|
||||||
|
|
||||||
|
/* OPLIST definition of the shared data of a shared pointer */
|
||||||
|
#define M_SHAR3D_DATA_OPLIST_P3(name, oplist) \
|
||||||
|
(NAME(name), TYPE(struct M_C(name,_s) *) \
|
||||||
|
,M_IF_METHOD(INIT)(INIT(API_4(M_F(name, _new))),) \
|
||||||
|
,M_IF_METHOD(INIT_SET)(INIT_SET(API_4(M_F(name, _new_copy))),) \
|
||||||
|
,M_IF_METHOD(SET)(SET(API_4(M_F(name, _copy))),) \
|
||||||
|
,CLEAR(M_F(name, _clear)) \
|
||||||
|
,INIT_MOVE(M_SET_BASIC) \
|
||||||
|
,MOVE(M_SET_BASIC) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
/* Validation of the given oplist */
|
/* Validation of the given oplist */
|
||||||
#define M_SHAR3D_PTR_DECL_P2(name, shared_t, oplist) \
|
#define M_SHAR3D_PTR_DECL_P2(name, shared_t, oplist) \
|
||||||
M_IF_OPLIST(oplist)(M_SHAR3D_PTR_DECL_P3, M_SHAR3D_PTR_DECL_FAILURE)(name, shared_t, oplist)
|
M_IF_OPLIST(oplist)(M_SHAR3D_PTR_DECL_P3, M_SHAR3D_PTR_DECL_FAILURE)(name, shared_t, oplist)
|
||||||
@@ -450,6 +508,7 @@ M_IF_METHOD(INIT_SET, oplist)( extern shared_t *M_F(name, _new_copy)(const share
|
|||||||
M_IF_METHOD(SET, oplist)( extern void M_F(name, _copy)(shared_t *, const shared_t *); , ) \
|
M_IF_METHOD(SET, oplist)( extern void M_F(name, _copy)(shared_t *, const shared_t *); , ) \
|
||||||
extern shared_t *M_F(name, _acquire)(shared_t *); \
|
extern shared_t *M_F(name, _acquire)(shared_t *); \
|
||||||
extern void M_F(name, _release)(shared_t *); \
|
extern void M_F(name, _release)(shared_t *); \
|
||||||
|
extern void M_F(name, _set)(shared_t **, shared_t *); \
|
||||||
extern void M_F(name, _clear)(shared_t *); \
|
extern void M_F(name, _clear)(shared_t *); \
|
||||||
M_EMPLACE_QUEUE_DEF(name, shared_t, M_F(name, _make), oplist, M_SHARED_PTR_DECL_BASIC_MAKE)
|
M_EMPLACE_QUEUE_DEF(name, shared_t, M_F(name, _make), oplist, M_SHARED_PTR_DECL_BASIC_MAKE)
|
||||||
|
|
||||||
@@ -513,14 +572,20 @@ fattr shared_t *M_F(name, _acquire)(shared_t *out) \
|
|||||||
\
|
\
|
||||||
fattr void M_F(name, _release)(shared_t *out) \
|
fattr void M_F(name, _release)(shared_t *out) \
|
||||||
{ \
|
{ \
|
||||||
M_ASSERT(out != NULL); \
|
if (out != NULL && M_F(name, _dec_owner)(out)) { \
|
||||||
if (M_F(name, _dec_owner)(out)) { \
|
|
||||||
M_CALL_CLEAR(oplist, out->data); \
|
M_CALL_CLEAR(oplist, out->data); \
|
||||||
M_F(name, _clear_lock)(out); \
|
M_F(name, _clear_lock)(out); \
|
||||||
M_CALL_DEL(oplist, out); \
|
M_CALL_DEL(oplist, out); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
fattr void M_F(name, _set)(shared_t **dst, shared_t *out) \
|
||||||
|
{ \
|
||||||
|
M_ASSERT(dst != NULL && out != NULL); \
|
||||||
|
M_F(name, _release)(*dst); \
|
||||||
|
*dst = M_F(name, _acquire)(out); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
fattr void M_F(name, _clear)(shared_t *out) \
|
fattr void M_F(name, _clear)(shared_t *out) \
|
||||||
{ \
|
{ \
|
||||||
M_F(name, _release)(out); \
|
M_F(name, _release)(out); \
|
||||||
|
|||||||
Reference in new issue
Block a user