diff --git a/mem_arena/arena.c b/mem_arena/arena.c new file mode 100644 index 0000000..248b643 --- /dev/null +++ b/mem_arena/arena.c @@ -0,0 +1,47 @@ +#include "arena.h" +#include "../aliases.h" +#include +#include + +bool arena_init(arena_t *arena, u64 capacity) { + arena->buf = (u8 *)malloc(capacity); + if (!(arena->buf)) { + return false; + } + + arena->capacity = capacity; + + arena->offset = arena->buf; + + return true; +} + +u8 *arena_alloc(arena_t *arena, u64 size) { + if (arena->offset + size >= arena->buf + arena->capacity) { + return NULL; + } + + u8 *output = arena->offset; + + arena->offset += size; + + return output; +} + +void arena_clear(arena_t *arena) { + memset(arena->buf, 0, arena->offset - arena->buf); + + arena->offset = arena->buf; +} + +void arena_free(arena_t *arena) { + arena->capacity = 0; + + arena->offset = NULL; + + if (arena->buf) { + free(arena->buf); + } + + arena->buf = NULL; +} diff --git a/mem_arena/arena.h b/mem_arena/arena.h new file mode 100644 index 0000000..509444e --- /dev/null +++ b/mem_arena/arena.h @@ -0,0 +1,18 @@ +#ifndef ARENA_H +#define ARENA_H + +#include "../aliases.h" +#include + +typedef struct { + u64 capacity; + u8 *buf; + u8 *offset; +} arena_t; + +bool arena_init(arena_t *arena, u64 capacity); +u8 *arena_alloc(arena_t *arena, u64 size); +void arena_clear(arena_t *arena); +void arena_free(arena_t *arena); + +#endif // !ARENA_H