From 0fda117ffe628ac92f9ccbf2fce4fa6862b39c83 Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Wed, 27 Jun 2018 20:10:42 +0200 Subject: [PATCH] Add push/pop_front/back_move methods. --- m-deque.h | 36 ++++++++++++++++++++++++++++++++++++ tests/test-mdeque.c | 21 +++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/m-deque.h b/m-deque.h index d6d418a4..29dfbaf7 100644 --- a/m-deque.h +++ b/m-deque.h @@ -221,6 +221,16 @@ return p; \ } \ \ + static inline void \ + M_C(name, _push_back_move)(deque_t d, type *x) \ + { \ + assert (x != NULL); \ + type *p = M_C(name, _push_back_raw)(d); \ + if (M_UNLIKELY(p == NULL)) \ + return; \ + M_DO_INIT_MOVE (oplist, *p, *x); \ + } \ + \ static inline type* \ M_C(name, _push_front_raw)(deque_t d) \ { \ @@ -266,6 +276,16 @@ } \ \ static inline void \ + M_C(name, _push_front_move)(deque_t d, type *x) \ + { \ + assert (x != NULL); \ + type *p = M_C(name, _push_front_raw)(d); \ + if (M_UNLIKELY(p == NULL)) \ + return; \ + M_DO_INIT_MOVE (oplist, *p, *x); \ + } \ + \ + static inline void \ M_C(name, _pop_back)(type *ptr, deque_t d) \ { \ DEQUEI_CONTRACT(d); \ @@ -301,6 +321,14 @@ } \ \ static inline void \ + M_C(name, _pop_back_move)(type *ptr, deque_t d) \ + { \ + assert(ptr != NULL); \ + M_GET_INIT oplist (*ptr); \ + M_C(name, _pop_back)(ptr, d); \ + } \ + \ + static inline void \ M_C(name, _pop_front)(type *ptr, deque_t d) \ { \ DEQUEI_CONTRACT(d); \ @@ -334,6 +362,14 @@ d->front->index = index; \ } \ \ + static inline void \ + M_C(name, _pop_front_move)(type *ptr, deque_t d) \ + { \ + assert(ptr != NULL); \ + M_GET_INIT oplist (*ptr); \ + M_C(name, _pop_front)(ptr, d); \ + } \ + \ static inline type * \ M_C(name, _back)(const deque_t d) \ { \ diff --git a/tests/test-mdeque.c b/tests/test-mdeque.c index ecbc494d..1176bbe1 100644 --- a/tests/test-mdeque.c +++ b/tests/test-mdeque.c @@ -223,6 +223,26 @@ static void test_advance(void) deque_clear(d); } +static void test_z(void) +{ + M_LET(d, DEQUE_OPLIST(deque_mpz, TESTOBJ_OPLIST)) + M_LET(z, TESTOBJ_OPLIST) { + testobj_set_ui(z, 1742); + deque_mpz_push_back_move(d, &z); + assert (testobj_cmp_ui (*deque_mpz_back(d), 1742) == 0); + testobj_init(z); + testobj_set_ui(z, 4217); + deque_mpz_push_front_move(d, &z); + assert (testobj_cmp_ui (*deque_mpz_front(d), 4217) == 0); + deque_mpz_pop_back_move(&z, d); + assert (testobj_cmp_ui (z, 1742) == 0); + testobj_clear(z); + deque_mpz_pop_front_move(&z, d); + assert (testobj_cmp_ui (z, 4217) == 0); + } + +} + static void test_io(void) { M_LET(d1, d2, DEQUE_OPLIST(deque_mpz, TESTOBJ_OPLIST)) @@ -303,6 +323,7 @@ int main(void) test_it(); test_set(); test_io(); + test_z(); test_advance(); exit(0); }