cdcontainers  0.1.1
Library of data containers and collections for C programming language.
deque.h
Go to the documentation of this file.
1 // The MIT License (MIT)
2 // Copyright (c) 2019 Maksim Andrianov
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to
6 // deal in the Software without restriction, including without limitation the
7 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 // sell copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 // IN THE SOFTWARE.
27 #ifndef CDCONTAINERS_INCLUDE_CDCONTAINERS_DEQUE_H
28 #define CDCONTAINERS_INCLUDE_CDCONTAINERS_DEQUE_H
29 
30 #include <cdcontainers/common.h>
31 #include <cdcontainers/status.h>
33 
34 #include <assert.h>
35 #include <stdarg.h>
36 #include <stdbool.h>
37 #include <stdlib.h>
38 
49 struct cdc_deque {
50  void *container;
51  const struct cdc_sequence_table *table;
52 };
53 
54 //Base
68  struct cdc_deque **d, struct cdc_data_info *info);
69 
80  struct cdc_deque **d, struct cdc_data_info *info,
81  ...);
82 
93  struct cdc_deque **d, struct cdc_data_info *info,
94  va_list args);
95 
100 void cdc_deque_dtor(struct cdc_deque *d);
103 // Element access
115 static inline void *cdc_deque_get(struct cdc_deque *d, size_t index)
116 {
117  assert(d != NULL);
118 
119  return d->table->get(d->container, index);
120 }
121 
128 static inline void *cdc_deque_front(struct cdc_deque *d)
129 {
130  assert(d != NULL);
131 
132  return d->table->front(d->container);
133 }
134 
141 static inline void *cdc_deque_back(struct cdc_deque *d)
142 {
143  assert(d != NULL);
144 
145  return d->table->back(d->container);
146 }
149 // Capacity
160 static inline bool cdc_deque_empty(struct cdc_deque *d)
161 {
162  assert(d != NULL);
163 
164  return d->table->empty(d->container);
165 }
166 
172 static inline size_t cdc_deque_size(struct cdc_deque *d)
173 {
174  assert(d != NULL);
175 
176  return d->table->size(d->container);
177 }
180 // Modifiers
192 static inline void cdc_deque_set(struct cdc_deque *d, size_t index, void *value)
193 {
194  assert(d != NULL);
195 
196  d->table->set(d->container, index, value);
197 }
198 
209 static inline enum cdc_stat cdc_deque_insert(struct cdc_deque *d, size_t index,
210  void *value)
211 {
212  assert(d != NULL);
213 
214  return d->table->insert(d->container, index, value);
215 }
216 
223 static inline void cdc_deque_erase(struct cdc_deque *d, size_t index)
224 {
225  assert(d != NULL);
226 
227  d->table->erase(d->container, index);
228 }
229 
234 static inline void cdc_deque_clear(struct cdc_deque *d)
235 {
236  assert(d != NULL);
237 
238  d->table->clear(d->container);
239 }
240 
248 static inline enum cdc_stat cdc_deque_push_back(struct cdc_deque *d,
249  void *value)
250 {
251  assert(d != NULL);
252 
253  return d->table->push_back(d->container, value);
254 }
255 
260 static inline void cdc_deque_pop_back(struct cdc_deque *d)
261 {
262  assert(d != NULL);
263 
264  d->table->pop_back(d->container);
265 }
266 
274 static inline enum cdc_stat cdc_deque_push_front(struct cdc_deque *d,
275  void *value)
276 {
277  assert(d != NULL);
278 
279  return d->table->push_front(d->container, value);
280 }
281 
286 static inline void cdc_deque_pop_front(struct cdc_deque *d)
287 {
288  assert(d != NULL);
289 
290  d->table->pop_front(d->container);
291 }
292 
299 void cdc_deque_swap(struct cdc_deque *a, struct cdc_deque *b);
302 // Short names
303 #ifdef CDC_USE_SHORT_NAMES
304 typedef struct cdc_deque deque_t;
305 
306 // Base
307 #define deque_ctor(...) cdc_deque_ctor(__VA_ARGS__)
308 #define deque_ctorl(...) cdc_deque_ctorl(__VA_ARGS__)
309 #define deque_ctorv(...) cdc_deque_ctorv(__VA_ARGS__)
310 #define deque_dtor(...) cdc_deque_dtor(__VA_ARGS__)
311 
312 // Element access
313 #define deque_get(...) cdc_deque_get(__VA_ARGS__)
314 #define deque_front(...) cdc_deque_front(__VA_ARGS__)
315 #define deque_back(...) cdc_deque_back(__VA_ARGS__)
316 
317 // Capacity
318 #define deque_empty(...) cdc_deque_empty(__VA_ARGS__)
319 #define deque_size(...) cdc_deque_size(__VA_ARGS__)
320 
321 // Modifiers
322 #define deque_set(...) cdc_deque_set(__VA_ARGS__)
323 #define deque_insert(...) cdc_deque_insert(__VA_ARGS__)
324 #define deque_erase(...) cdc_deque_erase(__VA_ARGS__)
325 #define deque_clear(...) cdc_deque_clear(__VA_ARGS__)
326 #define deque_push_back(...) cdc_deque_push_back(__VA_ARGS__)
327 #define deque_pop_back(...) cdc_deque_pop_back(__VA_ARGS__)
328 #define deque_push_front(...) cdc_deque_push_front(__VA_ARGS__)
329 #define deque_pop_front(...) cdc_deque_pop_back(__VA_ARGS__)
330 #define deque_swap(...) cdc_deque_swap(__VA_ARGS__)
331 #endif
332 
333 #endif // CDCONTAINERS_INCLUDE_CDCONTAINERS_DEQUE_H
void(* pop_back)(void *cntr)
Definition: isequence.h:50
static void * cdc_deque_get(struct cdc_deque *d, size_t index)
Returns the item at index position index in the deque. Index must be a valid index position in the de...
Definition: deque.h:115
void cdc_deque_dtor(struct cdc_deque *d)
Destroys the deque.
enum cdc_stat(* insert)(void *cntr, size_t index, void *value)
Definition: isequence.h:53
void *(* get)(void *cntr, size_t index)
Definition: isequence.h:56
void *(* front)(void *cntr)
Definition: isequence.h:45
enum cdc_stat cdc_deque_ctorl(const struct cdc_sequence_table *table, struct cdc_deque **d, struct cdc_data_info *info,...)
Constructs a deque, initialized by an arbitrary number of pointers. The last item must be NULL...
static void cdc_deque_pop_back(struct cdc_deque *d)
Removes the last item in the deque.
Definition: deque.h:260
static void cdc_deque_clear(struct cdc_deque *d)
Removes all the elements from the deque.
Definition: deque.h:234
static void cdc_deque_erase(struct cdc_deque *d, size_t index)
Removes the element at index position. Index must be a valid index position in the deque...
Definition: deque.h:223
void(* clear)(void *cntr)
Definition: isequence.h:55
static size_t cdc_deque_size(struct cdc_deque *d)
Returns the number of items in the deque.
Definition: deque.h:172
static enum cdc_stat cdc_deque_push_front(struct cdc_deque *d, void *value)
Inserts value at the beginning of the deque.
Definition: deque.h:274
enum cdc_stat(* push_front)(void *cntr, void *elem)
Definition: isequence.h:51
static enum cdc_stat cdc_deque_insert(struct cdc_deque *d, size_t index, void *value)
Inserts value at index position in the deque. If index is 0, the value is prepended to the deque...
Definition: deque.h:209
void cdc_deque_swap(struct cdc_deque *a, struct cdc_deque *b)
Swaps deques a and b. This operation is very fast and never fails.
void *(* back)(void *cntr)
Definition: isequence.h:46
The cdc_sequence_table is a sequence container interface.
void * container
Definition: deque.h:50
bool(* empty)(void *cntr)
Definition: isequence.h:47
void(* set)(void *cntr, size_t index, void *value)
Definition: isequence.h:57
cdc_stat
Definition: status.h:24
size_t(* size)(void *cntr)
Definition: isequence.h:48
static void cdc_deque_set(struct cdc_deque *d, size_t index, void *value)
Sets the deque at index position to the value. The function is not called to free memory...
Definition: deque.h:192
const struct cdc_sequence_table * table
Definition: deque.h:51
enum cdc_stat cdc_deque_ctorv(const struct cdc_sequence_table *table, struct cdc_deque **d, struct cdc_data_info *info, va_list args)
Constructs a deque, initialized by args. The last item must be NULL.
static void * cdc_deque_front(struct cdc_deque *d)
Returns a pointer to the first item in the deque. This function assumes that the deque isn&#39;t empty...
Definition: deque.h:128
enum cdc_stat(* push_back)(void *cntr, void *elem)
Definition: isequence.h:49
enum cdc_stat cdc_deque_ctor(const struct cdc_sequence_table *table, struct cdc_deque **d, struct cdc_data_info *info)
Constructs an empty deque.
void(* pop_front)(void *cntr)
Definition: isequence.h:52
static bool cdc_deque_empty(struct cdc_deque *d)
Returns true if the deque has size 0; otherwise returns false.
Definition: deque.h:160
The cdc_data_info struct used to initialize contaners.
Definition: common.h:71
static enum cdc_stat cdc_deque_push_back(struct cdc_deque *d, void *value)
Inserts value at the end of the deque.
Definition: deque.h:248
The cdc_deque struct.
Definition: deque.h:49
static void * cdc_deque_back(struct cdc_deque *d)
Returns a pointer to the last item in the deque. This function assumes that the deque isn&#39;t empty...
Definition: deque.h:141
void(* erase)(void *cntr, size_t index)
Definition: isequence.h:54
static void cdc_deque_pop_front(struct cdc_deque *d)
Removes the first item in the deque.
Definition: deque.h:286
The cdc_sequence_table struct.
Definition: isequence.h:41