haberman / gazelle

A system for creating fast, reusable parsers

This URL has Read+Write access

gazelle / runtime / include / gazelle / dynarray.h
100644 32 lines (24 sloc) 0.883 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define MAX(a, b) ((a) > (b) ? (a) : (b))
 
#define DEFINE_DYNARRAY(name, type) \
type *name; \
int name ## _len; \
int name ## _size;
 
#define RESIZE_DYNARRAY(name, desired_len) { \
int orig_size = name ## _size; \
while(name ## _size < (desired_len)) \
name ## _size *= 2; \
/* don't bother shrinking for now. when/if we do, we'll want to bake in \
* some kind of hysteresis so that we don't shrink until we've been under \
* for a while. */ \
if(name ## _size != orig_size) \
name = realloc(name, name ## _size * sizeof(*name)); \
name ## _len = desired_len; \
}
 
#define INIT_DYNARRAY(name, initial_len, initial_size) \
name ## _len = initial_len; \
name ## _size = initial_size; \
name = realloc(NULL, name ## _size * sizeof(*name))
 
#define FREE_DYNARRAY(name) \
free(name);
 
#define DYNARRAY_GET_TOP(name) \
(&name[name ## _len - 1])