Add method _push_move & _pop_move.

Add assertion on _pop_back to check that the container is not empty.
This commit is contained in:
Patrick Pelissier committed 2018-05-19 11:21:57 +02:00
1 parent 86083e3a92
commit d0fe7f3e25
2 files changed
+36 -2

No files matched your search

+27 -2
View File
@@ -72,6 +72,8 @@
,CLEAN(M_C(name,_clean)) \
,PUSH(M_C(name,_push_back)) \
,POP(M_C(name,_pop_back)) \
,PUSH_MOVE(M_C(name,_push_move)) \
,POP_MOVE(M_C(name,_pop_move)) \
,OPLIST(oplist) \
,M_IF_METHOD(CMP, oplist)(SORT(M_C(name, _special_sort)),) \
,M_IF_METHOD(GET_STR, oplist)(GET_STR(M_C(name, _get_str)),) \
@@ -254,6 +256,16 @@
return NULL; \
M_GET_INIT oplist(*data); \
return data; \
} \
\
static inline void \
M_C(name, _push_move)(array_t v, type *x) \
{ \
assert (x != NULL); \
type *data = M_C(name, _push_raw)(v); \
if (M_UNLIKELY (data == NULL) ) \
return; \
M_DO_INIT_MOVE (oplist, *data, *x); \
} \
\
static inline void \
@@ -371,11 +383,24 @@
M_C(name, _pop_back)(type *dest, array_t v) \
{ \
ARRAYI_CONTRACT(v); \
assert (v->size > 0); \
v->size--; \
if (dest) \
if (dest) { \
M_DO_MOVE (oplist, *dest, v->ptr[v->size]); \
else \
} else { \
M_GET_CLEAR oplist (v->ptr[v->size]); \
} \
ARRAYI_CONTRACT(v); \
} \
\
static inline void \
M_C(name, _pop_move)(type *dest, array_t v) \
{ \
ARRAYI_CONTRACT(v); \
assert (v->size > 0); \
assert (dest != NULL); \
v->size--; \
M_DO_INIT_MOVE (oplist, *dest, v->ptr[v->size]); \
ARRAYI_CONTRACT(v); \
} \
\
+9
View File
@@ -163,6 +163,15 @@ static void test_uint(void)
assert (i == *array_uint_get(v, i));
}
x = 1478963;
s = *array_uint_back(v);
array_uint_push_move(v, &x);
assert (*array_uint_back(v) == 1478963);
x = 0;
array_uint_pop_move(&x, v);
assert (x == 1478963);
assert (s == *array_uint_back(v));
array_uint_clear(v);
array_uint_clear(v2);
}