Add WIP deque_remove method

This commit is contained in:
Patrick Pelissier committed 2021-11-02 08:43:42 +01:00
1 parent 9549e82b04
commit ffa1e2e59c
1 file changed
+34
+34
View File
@@ -670,6 +670,40 @@
} \
\
static inline void \
M_C(name, _remove)(deque_t d, it_t it) \
{ \
M_D3QU3_CONTRACT(d); \
M_ASSERT (it != NULL && it->node != NULL); \
M_ASSERT (d->count >= 1); \
M_ASSERT_INDEX(it->index, it->node->size); \
\
node_t *n = it->node; \
M_CALL_CLEAR(oplist, n->data[it->index]); \
if (n == d->back->node) { \
M_ASSERT (d->back->index != 0); \
memmove(&n->data[it->index], &n->data[it->index+1], \
sizeof(type) * (d->back->index - it->index)); \
d->back->index --; \
} else if (n == d->front->node) { \
if (M_UNLIKELY (d->front->index == n->size -1)) { \
/* TODO */ \
} else { \
memmove(&n->data[d->front->index+1], &n->data[d->front->index], \
sizeof(type) * (it->index - d->front->index)); \
d->front->index ++; \
} \
} else { \
memmove(&n->data[it->index], &n->data[it->index+1], \
sizeof(type) * (it->node->size - it->index)); \
/* We lose capacity of the node... */ \
n->size --; \
/* TODO: Case if node is empty... */ \
} \
d->count--; \
M_D3QU3_CONTRACT(d); \
} \
\
static inline void \
M_C(name, _init_set)(deque_t d, const deque_t src) \
{ \
M_D3QU3_CONTRACT(src); \