aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deque.c26
1 files changed, 23 insertions, 3 deletions
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)
172 d->offset = CHUNK_CAPACITY; 172 d->offset = CHUNK_CAPACITY;
173 } 173 }
174 174
175 ++d->size;
175 --d->offset; 176 --d->offset;
176 177
177 size_t chunk_num = (d->offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity; 178 size_t chunk_num = (d->offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity;
178 179
179 d->map[chunk_num][d->offset] = data; 180 d->map[chunk_num][d->offset] = data;
180 ++d->size; 181}
182
183bool
184deque_pop_back(struct deque *d, T *data)
185{
186 if ( d->size == 0 )
187 return false;
188
189 --d->size;
190
191 const size_t offset = d->offset + d->size;
192 const size_t chunk_off = offset % CHUNK_CAPACITY;
193 const size_t chunk_num = (offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity;
194
195 *data = d->map[chunk_num][chunk_off];
196
197 if ( d->size == 0 || chunk_off == 0 ) {
198 map_remove_tail_chunk(d);
199 }
200
201 return true;
181} 202}
182 203
183bool 204bool
@@ -186,10 +207,9 @@ deque_pop_front(struct deque *d, T *data)
186 if ( d->size == 0 ) 207 if ( d->size == 0 )
187 return false; 208 return false;
188 209
189 const size_t chunk_off = d->offset % CHUNK_CAPACITY;
190 const size_t chunk_num = (d->offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity; 210 const size_t chunk_num = (d->offset / CHUNK_CAPACITY + d->map_begin) % d->map_capacity;
191 211
192 *data = d->map[chunk_num][chunk_off]; 212 *data = d->map[chunk_num][d->offset];
193 213
194 --d->size; 214 --d->size;
195 ++d->offset; 215 ++d->offset;