diff options
author | fschildt <florian.schildt@protonmail.com> | 2025-08-22 15:23:11 +0200 |
---|---|---|
committer | fschildt <florian.schildt@protonmail.com> | 2025-08-22 15:23:11 +0200 |
commit | 2050c0e0576f05156f192aa4caf48834d2f28b14 (patch) | |
tree | ee58bd35b0df0a1bacfbc9700ed99ce80c99294e /src/basic/arena.c |
Diffstat (limited to 'src/basic/arena.c')
-rw-r--r-- | src/basic/arena.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/basic/arena.c b/src/basic/arena.c new file mode 100644 index 0000000..8f2e17e --- /dev/null +++ b/src/basic/arena.c @@ -0,0 +1,76 @@ +#include <basic/arena.h> +#include <assert.h> +#include <string.h> +#include <stdlib.h> + +void +arena_init(Arena *arena, u64 size) +{ + arena->size_used = 0; + arena->size_max = size; + arena->memory = malloc(size); +} + +void +arena_deinit(Arena *arena) +{ + arena->size_used = 0; + arena->size_max = 0; + free(arena->memory); +} + +void +arena_align(Arena *arena, u64 alignment) +{ + // @Incomplete +} + +void* +arena_push(Arena *arena, u64 size) +{ + void *result = arena->memory + arena->size_used; + arena->size_used += size; + assert(arena->size_used <= arena->size_max); + return result; +} + +void +arena_pop_to(Arena *arena, u64 pos) +{ + arena->size_used = pos; +} + +void +arena_pop_size(Arena *arena, u64 size) +{ + arena->size_used -= size; +} + +void +arena_zero(Arena *arena) +{ + memset(arena->memory, 0, arena->size_used); +} + +void +arena_clear(Arena *arena) +{ + arena->size_used = 0; +} + + +ArenaTmp +arena_tmp_begin(Arena *arena) +{ + ArenaTmp tmp; + tmp.arena = arena; + tmp.pos = arena->size_used; + return tmp; +} + +void +arena_tmp_end(ArenaTmp tmp) +{ + tmp.arena->size_used = tmp.pos; +} + |