Add _init_new operation for shared_ptr
This commit is contained in:
1 parent
27d41f9330
commit
de7d0bd682
2 files changed
+31
-4
No files matched your search
+26
-3
@@ -43,7 +43,7 @@
|
|||||||
USAGE: SHARED_PTR_DEF(name[, oplist]) */
|
USAGE: SHARED_PTR_DEF(name[, oplist]) */
|
||||||
#define SHARED_PTR_DEF(name, ...) \
|
#define SHARED_PTR_DEF(name, ...) \
|
||||||
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
M_IF_NARGS_EQ1(__VA_ARGS__) \
|
||||||
(SHAREDI_PTR_DEF2(name, __VA_ARGS__, M_DEFAULT_OPLIST ), \
|
(SHAREDI_PTR_DEF2(name, __VA_ARGS__, M_DEFAULT_OPLIST ), \
|
||||||
SHAREDI_PTR_DEF2(name, __VA_ARGS__ ))
|
SHAREDI_PTR_DEF2(name, __VA_ARGS__ ))
|
||||||
|
|
||||||
/********************************** INTERNAL ************************************/
|
/********************************** INTERNAL ************************************/
|
||||||
@@ -102,6 +102,29 @@
|
|||||||
SHAREDI_CONTRACT(shared); \
|
SHAREDI_CONTRACT(shared); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
static inline void \
|
||||||
|
M_C3(shared_, name, _init_new)(M_C3(shared_, name, _t) shared) \
|
||||||
|
{ \
|
||||||
|
struct M_C3(shared_, name, _s) *ptr; \
|
||||||
|
ptr = M_MEMORY_ALLOC (struct M_C3(shared_, name, _s)); \
|
||||||
|
if (ptr == NULL) { \
|
||||||
|
M_MEMORY_FULL(sizeof(struct M_C3(shared_, name, _s))); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
type *data; \
|
||||||
|
data = M_GET_NEW oplist (sizeof (type) ); \
|
||||||
|
if (data == NULL) { \
|
||||||
|
M_MEMORY_FREE(ptr); \
|
||||||
|
M_MEMORY_FULL(sizeof(type)); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
M_GET_INIT oplist(*data); \
|
||||||
|
ptr->cpt = 1; \
|
||||||
|
ptr->data = data; \
|
||||||
|
*shared = ptr; \
|
||||||
|
SHAREDI_CONTRACT(shared); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
static inline bool \
|
static inline bool \
|
||||||
M_C3(shared_, name, _NULL_p)(const M_C3(shared_, name, _t) shared) \
|
M_C3(shared_, name, _NULL_p)(const M_C3(shared_, name, _t) shared) \
|
||||||
{ \
|
{ \
|
||||||
@@ -127,8 +150,8 @@
|
|||||||
SHAREDI_CONTRACT(dest); \
|
SHAREDI_CONTRACT(dest); \
|
||||||
if (*dest != NULL) { \
|
if (*dest != NULL) { \
|
||||||
if (atomic_fetch_sub(&((*dest)->cpt), 1) == 1) { \
|
if (atomic_fetch_sub(&((*dest)->cpt), 1) == 1) { \
|
||||||
M_GET_CLEAR oplist (*(*dest)->data); \
|
M_GET_CLEAR oplist (*(*dest)->data); \
|
||||||
M_GET_DEL oplist ((*dest)->data); \
|
M_GET_DEL oplist ((*dest)->data); \
|
||||||
M_MEMORY_FREE (*dest); \
|
M_MEMORY_FREE (*dest); \
|
||||||
} \
|
} \
|
||||||
*dest = NULL; \
|
*dest = NULL; \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ SHARED_PTR_DEF(int, int)
|
|||||||
|
|
||||||
#include <gmp.h>
|
#include <gmp.h>
|
||||||
|
|
||||||
SHARED_PTR_DEF(mpz, mpz_t, (CLEAR(mpz_clear)))
|
SHARED_PTR_DEF(mpz, mpz_t, M_CLASSIC_OPLIST(mpz))
|
||||||
|
|
||||||
static int f(const shared_int_t p)
|
static int f(const shared_int_t p)
|
||||||
{
|
{
|
||||||
@@ -55,5 +55,9 @@ int main(void)
|
|||||||
assert(shared_int_NULL_p(p1));
|
assert(shared_int_NULL_p(p1));
|
||||||
shared_int_clear(p1);
|
shared_int_clear(p1);
|
||||||
|
|
||||||
|
shared_int_init_new(p1);
|
||||||
|
assert(!shared_int_NULL_p(p1));
|
||||||
|
shared_int_clear(p1);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user