initial commit
[meshfrac] / src / darray.h
1 #ifndef DYNAMIC_ARRAY_H_
2 #define DYNAMIC_ARRAY_H_
3
4 void *darr_alloc(int elem, int szelem);
5 void darr_free(void *da);
6 void *darr_resize_impl(void *da, int elem);
7 #define darr_resize(da, elem)   do { (da) = darr_resize_impl(da, elem); } while(0)
8
9 int darr_empty(void *da);
10 int darr_size(void *da);
11
12 void *darr_clear_impl(void *da);
13 #define darr_clear(da)                  do { (da) = darr_clear_impl(da); } while(0)
14
15 /* stack semantics */
16 void *darr_push_impl(void *da, void *item);
17 #define darr_push(da, item)             do { (da) = darr_push_impl(da, item); } while(0)
18 #define darr_pushi(da, val)             do { int v = val; (da) = darr_push_impl(da, &v); } while(0)
19 #define darr_pushf(da, val)             do { float v = val; (da) = darr_push_impl(da, &v); } while(0)
20 void *darr_pop_impl(void *da);
21 #define darr_pop(da)                    do { (da) = darr_pop_impl(da); } while(0)
22
23 /* Finalize the array. No more resizing is possible after this call.
24  * Use free() instead of dynarr_free() to deallocate a finalized array.
25  * Returns pointer to the finalized array.
26  * Complexity: O(n)
27  */
28 void *darr_finalize(void *da);
29
30 /* utility macros to push characters to a string. assumes and maintains
31  * the invariant that the last element is always a zero
32  */
33 #define darr_strpush(da, c) \
34         do { \
35                 char cnull = 0, ch = (char)(c); \
36                 (da) = dynarr_pop_impl(da); \
37                 (da) = dynarr_push_impl((da), &ch); \
38                 (da) = dynarr_push_impl((da), &cnull); \
39         } while(0)
40
41 #define darr_strpop(da) \
42         do { \
43                 char cnull = 0; \
44                 (da) = dynarr_pop_impl(da); \
45                 (da) = dynarr_pop_impl(da); \
46                 (da) = dynarr_push_impl((da), &cnull); \
47         } while(0)
48
49
50 #endif  /* DYNAMIC_ARRAY_H_ */