diff options
Diffstat (limited to 'lib/arena.c')
| -rw-r--r-- | lib/arena.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/arena.c b/lib/arena.c index dd12d0c..8cd1748 100644 --- a/lib/arena.c +++ b/lib/arena.c @@ -10,12 +10,18 @@ region *new_region(size_t cap) { return r; } +arena arena_init_cap(size_t cap) { + arena a = {0}; + a.region_cap = cap; + return a; +} + void *arena_alloc(arena *a, size_t size_bytes) { size_t size = (size_bytes + sizeof(uintptr_t)-1)/sizeof(uintptr_t); if (a->end == NULL) { assert(a->beg == NULL); - size_t capacity = ARENA_REGION_DEFAULT_CAPACITY; + size_t capacity = a->region_cap ? a->region_cap : ARENA_REGION_DEFAULT_CAPACITY; if (capacity < size) capacity = size; a->beg = new_region(capacity); a->end = a->beg; @@ -26,7 +32,7 @@ void *arena_alloc(arena *a, size_t size_bytes) { } if (a->end->len + size > a->end->cap) { - size_t capacity = ARENA_REGION_DEFAULT_CAPACITY; + size_t capacity = a->region_cap ? a->region_cap : ARENA_REGION_DEFAULT_CAPACITY; if (capacity < size) capacity = size; a->beg = new_region(capacity); a->end->next = new_region(capacity); @@ -47,6 +53,17 @@ void arena_free(arena *a) { } } +void *arena_realloc(arena *a, void *oldptr, size_t oldsz, size_t newsz) { + if (newsz <= oldsz) return oldptr; + void *newptr = arena_alloc(a, newsz); + char *newptr_char = (char*)newptr; + char *oldptr_char = (char*)oldptr; + for (size_t i = 0; i < oldsz; ++i) { + newptr_char[i] = oldptr_char[i]; + } + return newptr; +} + void grow_da(void *slice, size_t size, arena *arena) { struct { void *data; |
