diff options
Diffstat (limited to 'lib/arena.h')
| -rw-r--r-- | lib/arena.h | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/lib/arena.h b/lib/arena.h index 1ddddac..7535f8a 100644 --- a/lib/arena.h +++ b/lib/arena.h @@ -1,3 +1,5 @@ +// Most of the code is from https://github.com/tsoding/arena + #ifndef ARENA_H_ #define ARENA_H_ @@ -19,22 +21,31 @@ struct region { typedef struct { region *beg; region *end; + size_t region_cap; } arena; +arena arena_init_cap(size_t cap); void *arena_alloc(arena *a, size_t size); void arena_free(arena *a); -void grow_da(void *slice, size_t size, arena *arena); - +void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz); #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++) +#define ARENA_REGION_DEFAULT_CAPACITY (8*1024) +#define ARENA_DA_INIT_CAP (2) + +#define arena_da_append(a, da, item) \ + do { \ + if ((da)->len >= (da)->cap) { \ + size_t new_cap = (da)->cap == 0 ? ARENA_DA_INIT_CAP : (da)->cap*2; \ + (da)->data = arena_realloc( \ + (a), (da)->data, \ + (da)->cap*sizeof(*(da)->data), \ + new_cap*sizeof(*(da)->data)); \ + (da)->cap = new_cap; \ + } \ + \ + (da)->data[(da)->len++] = (item); \ + } while (0) #endif //ARENA_H_ |
