513a4314df5fbbbc33fcf0bf50e3336aa99329a8
[vrlugburz] / dynarr.h
1 /* dynarr - dynamic resizable C array data structure
2  * author: John Tsiombikas <nuclear@member.fsf.org>
3  * license: public domain
4  */
5 #ifndef DYNARR_H_
6 #define DYNARR_H_
7
8 /* usage example:
9  * -------------
10  * int *arr = ts_dynarr_alloc(0, sizeof *arr);
11  *
12  * int x = 10;
13  * arr = ts_dynarr_push(arr, &x);
14  * x = 5;
15  * arr = ts_dynarr_push(arr, &x);
16  * x = 42;
17  * arr = ts_dynarr_push(arr, &x);
18  *
19  * for(i=0; i<ts_dynarr_size(arr); i++) {
20  *     printf("%d\n", arr[i]);
21  *  }
22  *  ts_dynarr_free(arr);
23  */
24
25 void *ts_dynarr_alloc(int elem, int szelem);
26 void ts_dynarr_free(void *da);
27 void *ts_dynarr_resize(void *da, int elem);
28
29 int ts_dynarr_empty(void *da);
30 int ts_dynarr_size(void *da);
31
32 void *ts_dynarr_clear(void *da);
33
34 /* stack semantics */
35 void *ts_dynarr_push(void *da, void *item);
36 void *ts_dynarr_pop(void *da);
37
38
39 /* helper macros */
40 #define DYNARR_RESIZE(da, n) \
41         do { (da) = ts_dynarr_resize((da), (n)); } while(0)
42 #define DYNARR_CLEAR(da) \
43         do { (da) = ts_dynarr_clear(da); } while(0)
44 #define DYNARR_PUSH(da, item) \
45         do { (da) = ts_dynarr_push((da), (item)); } while(0)
46 #define DYNARR_POP(da) \
47         do { (da) = ts_dynarr_pop(da); } while(0)
48
49 /* utility macros to push characters to a string. assumes and maintains
50  * the invariant that the last element is always a zero
51  */
52 #define DYNARR_STRPUSH(da, c) \
53         do { \
54                 char cnull = 0, ch = (char)(c); \
55                 (da) = ts_dynarr_pop(da); \
56                 (da) = ts_dynarr_push((da), &ch); \
57                 (da) = ts_dynarr_push((da), &cnull); \
58         } while(0)
59
60 #define DYNARR_STRPOP(da) \
61         do { \
62                 char cnull = 0; \
63                 (da) = ts_dynarr_pop(da); \
64                 (da) = ts_dynarr_pop(da); \
65                 (da) = ts_dynarr_push((da), &cnull); \
66         } while(0)
67
68
69 #endif  /* DYNARR_H_ */