added scr_lvled, a bunch of libraries, and improved framework code
[raydungeon] / libs / goat3d / src / 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 #define dynarr_alloc    g3dimpl_dynarr_alloc
9 #define dynarr_free             g3dimpl_dynarr_free
10 #define dynarr_resize   g3dimpl_dynarr_resize
11 #define dynarr_empty    g3dimpl_dynarr_empty
12 #define dynarr_size             g3dimpl_dynarr_size
13 #define dynarr_clear    g3dimpl_dynarr_clear
14 #define dynarr_push             g3dimpl_dynarr_push
15 #define dynarr_pop              g3dimpl_dynarr_pop
16 #define dynarr_finalize g3dimpl_dynarr_finalize
17
18 /* usage example:
19  * -------------
20  * int *arr = dynarr_alloc(0, sizeof *arr);
21  *
22  * int x = 10;
23  * arr = dynarr_push(arr, &x);
24  * x = 5;
25  * arr = dynarr_push(arr, &x);
26  * x = 42;
27  * arr = dynarr_push(arr, &x);
28  *
29  * for(i=0; i<dynarr_size(arr); i++) {
30  *     printf("%d\n", arr[i]);
31  *  }
32  *  dynarr_free(arr);
33  */
34
35 void *dynarr_alloc(int elem, int szelem);
36 void dynarr_free(void *da);
37 void *dynarr_resize(void *da, int elem);
38
39 /* dynarr_empty returns non-zero if the array is empty
40  * Complexity: O(1) */
41 int dynarr_empty(void *da);
42 /* dynarr_size returns the number of elements in the array
43  * Complexity: O(1) */
44 int dynarr_size(void *da);
45
46 void *dynarr_clear(void *da);
47
48 /* stack semantics */
49 void *dynarr_push(void *da, void *item);
50 void *dynarr_pop(void *da);
51
52 /* Finalize the array. No more resizing is possible after this call.
53  * Use free() instead of dynarr_free() to deallocate a finalized array.
54  * Returns pointer to the finalized array.
55  * dynarr_finalize can't fail.
56  * Complexity: O(n)
57  */
58 void *dynarr_finalize(void *da);
59
60 /* helper macros */
61 #define DYNARR_RESIZE(da, n) \
62         do { (da) = dynarr_resize((da), (n)); } while(0)
63 #define DYNARR_CLEAR(da) \
64         do { (da) = dynarr_clear(da); } while(0)
65 #define DYNARR_PUSH(da, item) \
66         do { (da) = dynarr_push((da), (item)); } while(0)
67 #define DYNARR_POP(da) \
68         do { (da) = dynarr_pop(da); } while(0)
69
70 /* utility macros to push characters to a string. assumes and maintains
71  * the invariant that the last element is always a zero
72  */
73 #define DYNARR_STRPUSH(da, c) \
74         do { \
75                 char cnull = 0, ch = (char)(c); \
76                 (da) = dynarr_pop(da); \
77                 (da) = dynarr_push((da), &ch); \
78                 (da) = dynarr_push((da), &cnull); \
79         } while(0)
80
81 #define DYNARR_STRPOP(da) \
82         do { \
83                 char cnull = 0; \
84                 (da) = dynarr_pop(da); \
85                 (da) = dynarr_pop(da); \
86                 (da) = dynarr_push((da), &cnull); \
87         } while(0)
88
89
90 #endif  /* DYNARR_H_ */