csnip  0.1
arr.h
Go to the documentation of this file.
1 #ifndef CSNIP_ARR_H
2 #define CSNIP_ARR_H
3 
29 #include <stddef.h>
30 
31 #include <csnip/err.h>
32 #include <csnip/mem.h>
33 #include <csnip/util.h>
34 #include <csnip/preproc.h>
35 
41 #define csnip_arr_Init(a, n, cap, initial_cap, err) \
42  do { \
43  (n) = 0; \
44  if (((cap) = (initial_cap)) > 0) { \
45  csnip_mem_Alloc(initial_cap, a, err); \
46  } else { \
47  (a) = NULL; \
48  } \
49  } while(0)
50 
65 #define csnip_arr_Reserve(a, n, cap, least_cap, err) \
66  csnip_arr__Reserve((a), (n), (cap), (least_cap), (err), \
67  csnip__i, csnip__err2)
68 
70 #define csnip_arr__Reserve(a, n, cap, least_cap, err, i, err2) \
71  do { \
72  size_t i = csnip_next_pow_of_2(csnip_Max(least_cap, n)); \
73  if(i != (size_t)cap) { \
74  int err2 = 0; \
75  csnip_mem_Realloc(i, a, err2); \
76  if (err2) { \
77  csnip_err_Raise(err2, err); \
78  break; \
79  } \
80  cap = i; \
81  } \
82  } while(0)
89 #define csnip_arr_Push(a, n, cap, value, err) \
90  do { \
91  int csnip_err = 0; \
92  csnip_arr_Reserve(a, n, cap, (n) + 1, csnip_err); \
93  if (csnip_err) { \
94  csnip_err_Raise(csnip_err, err); \
95  break; \
96  } \
97  (a)[(n)++] = (value); \
98  } while(0)
99 
107 #define csnip_arr_Pop(a, n, cap, err) \
108  do { \
109  if ((n) <= 0) { \
110  csnip_err_Raise(csnip_err_UNDERFLOW, err); \
111  break; \
112  } \
113  --(n); \
114  } while(0);
115 
116 
124 #define csnip_arr_InsertAt(a, n, cap, index, val, err) \
125  do { \
126  int csnip_err = 0; \
127  csnip_arr_Reserve(a, n, cap, (n) + 1, csnip_err); \
128  if (csnip_err) { \
129  csnip_err_Raise(csnip_err, err); \
130  break; \
131  } \
132  for (int csnip_i = (n); csnip_i > (index); --csnip_i)\
133  { \
134  (a)[csnip_i] = (a)[csnip_i - 1]; \
135  } \
136  (a)[(index)] = (val); \
137  } while(0)
138 
146 #define csnip_arr_DeleteAt(a, n, cap, index, err) \
147  do { \
148  int csnip_i; \
149  --(n); \
150  for (csnip_i = (index); csnip_i < (n); ++csnip_i) \
151  { \
152  (a)[csnip_i] = (a)[csnip_i + 1]; \
153  } \
154  } while(0)
155 
163 #define csnip_arr_Free(a, n, cap) \
164  do { \
165  csnip_mem_Free(a); \
166  (n) = 0; \
167  (cap) = 0; \
168  } while(0)
169 
191 #define CSNIP_ARR_DECL_FUNCS(scope, prefix, val_type, gen_args) \
192  scope void prefix ## init(csnip_pp_prepend_##gen_args \
193  size_t cs); \
194  scope void prefix ## reserve(csnip_pp_prepend_##gen_args \
195  size_t least_cap); \
196  scope void prefix ## push(csnip_pp_prepend_##gen_args \
197  val_type v); \
198  scope void prefix ## pop(csnip_pp_list_##gen_args); \
199  scope void prefix ## insert_at(csnip_pp_prepend_##gen_args \
200  size_t i, val_type v); \
201  scope void prefix ## delete_at(csnip_pp_prepend_##gen_args \
202  size_t i); \
203  scope void prefix ## free(csnip_pp_list_##gen_args);
204 
227 #define CSNIP_ARR_DEF_FUNCS(scope, prefix, val_type, gen_args, a, n, cap, err) \
228  scope void prefix ## init(csnip_pp_prepend_##gen_args \
229  size_t cs) \
230  { \
231  csnip_arr_Init(a, n, cap, cs, err); \
232  } \
233  \
234  scope void prefix ## reserve(csnip_pp_prepend_##gen_args \
235  size_t least_cap) \
236  { \
237  csnip_arr_Reserve(a, n, cap, least_cap, err); \
238  } \
239  \
240  scope void prefix ## push(csnip_pp_prepend_##gen_args \
241  val_type v) \
242  { \
243  csnip_arr_Push(a, n, cap, v, err); \
244  } \
245  \
246  scope void prefix ## pop(csnip_pp_list_##gen_args) \
247  { \
248  csnip_arr_Pop(a, n, cap, err); \
249  } \
250  \
251  scope void prefix ## insert_at(csnip_pp_prepend_##gen_args \
252  size_t i, val_type v) \
253  { \
254  csnip_arr_InsertAt(a, n, cap, i, v, err); \
255  } \
256  \
257  scope void prefix ## delete_at(csnip_pp_prepend_##gen_args \
258  size_t i) \
259  { \
260  csnip_arr_DeleteAt(a, n, cap, i, err); \
261  } \
262  scope void prefix ## free(csnip_pp_list_##gen_args) \
263  { \
264  csnip_arr_Free(a, n, cap); \
265  }
268 #endif /* CSNIP_ARR_H */
269 
270 #if defined(CSNIP_SHORT_NAMES) && !defined(CSNIP_ARR_HAVE_SHORT_NAMES)
271 #define arr_Init csnip_arr_Init
272 #define arr_Reserve csnip_arr_Reserve
273 #define arr_Push csnip_arr_Push
274 #define arr_Pop csnip_arr_Pop
275 #define arr_InsertAt csnip_arr_InsertAt
276 #define arr_DeleteAt csnip_arr_DeleteAt
277 #define arr_Free csnip_arr_Free
278 #define CSNIP_ARR_HAVE_SHORT_NAMES
279 #endif /* CSNIP_SHORT_NAMES && !CSNIP_ARR_HAVE_SHORT_NAMES */
Error handling.