diff options
Diffstat (limited to 'lib/arena.h')
| -rw-r--r-- | lib/arena.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/arena.h b/lib/arena.h new file mode 100644 index 0000000..1ddddac --- /dev/null +++ b/lib/arena.h @@ -0,0 +1,40 @@ +#ifndef ARENA_H_ +#define ARENA_H_ + +#include <stdlib.h> +#include <stddef.h> +#include <stdint.h> +#include <assert.h> +#include <string.h> + +typedef struct region region; + +struct region { + region *next; + size_t cap; + size_t len; + uintptr_t data[]; +}; + +typedef struct { + region *beg; + region *end; +} arena; + +void *arena_alloc(arena *a, size_t size); +void arena_free(arena *a); +void grow_da(void *slice, size_t size, arena *arena); + + +#define new(a, t, c) (t *)arena_alloc(a, sizeof(t)*c) + +#define ARENA_REGION_DEFAULT_CAPACITY (8*1024); + +// from nullprogram +#define push(slice, arena) \ + ((slice)->len >= (slice)->cap \ + ? grow_da(slice, sizeof(*(slice)->data), arena), \ + (slice)->data + (slice)->len++ \ + : (slice)->data + (slice)->len++) + +#endif //ARENA_H_ |
