diff --git a/src/arena_allocator.c b/src/arena_allocator.c new file mode 100644 index 0000000..01374b0 --- /dev/null +++ b/src/arena_allocator.c @@ -0,0 +1,28 @@ +#include "arena_allocator.h" +#include +#include +#include +#include + +Arena arena_init(size_t capacity) { + Arena result = {.capacity = capacity, .size = 0, .data = malloc(capacity)}; + assert(result.data != NULL); + return result; +} + +void arena_deinit(Arena *arena) { + free(arena->data); + *arena = (Arena){.capacity = NAN, .size = 0, .data = NULL}; +} + +void *arena_alloc(Arena *arena, size_t size) { + assert(arena->size + size <= arena->capacity); + void *result = &arena->data[arena->size]; + arena->size += size; + return result; +} + +void *arena_clear(Arena *arena) { + arena->size = 0; + return arena->data; +} diff --git a/src/arena_allocator.h b/src/arena_allocator.h new file mode 100644 index 0000000..c883209 --- /dev/null +++ b/src/arena_allocator.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +typedef struct { + size_t capacity; + size_t size; + void *data; +} Arena; + +Arena arena_init(size_t capacity); +void arena_deinit(Arena *arena); + +void *arena_alloc(Arena *arena, size_t size); +void *arena_clear(Arena *arena);