From 8beef34c04e1844545af284707478d57195ddfff Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 14 Aug 2020 18:54:02 +0200 Subject: Implement deque_pop_back() --- deque.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'deque.c') diff --git a/deque.c b/deque.c index 5800997..36af05a 100644 --- a/deque.c +++ b/deque.c @@ -172,12 +172,33 @@ deque_push_front(struct deque *d, T data) d->offset = CHUNK_CAPACITY; } + ++d->size; --d->offset; size_t chunk_num = (d->offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity; d->map[chunk_num][d->offset] = data; - ++d->size; +} + +bool +deque_pop_back(struct deque *d, T *data) +{ + if ( d->size == 0 ) + return false; + + --d->size; + + const size_t offset = d->offset + d->size; + const size_t chunk_off = offset % CHUNK_CAPACITY; + const size_t chunk_num = (offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity; + + *data = d->map[chunk_num][chunk_off]; + + if ( d->size == 0 || chunk_off == 0 ) { + map_remove_tail_chunk(d); + } + + return true; } bool @@ -186,10 +207,9 @@ deque_pop_front(struct deque *d, T *data) if ( d->size == 0 ) return false; - const size_t chunk_off = d->offset % CHUNK_CAPACITY; const size_t chunk_num = (d->offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity; - *data = d->map[chunk_num][chunk_off]; + *data = d->map[chunk_num][d->offset]; --d->size; ++d->offset; -- cgit v1.3