diff --git a/include/arena.h b/include/arena.h index 397da80..12685f8 100644 --- a/include/arena.h +++ b/include/arena.h @@ -7,7 +7,7 @@ #include typedef struct { - void *data; + uint8_t *data; size_t size; size_t offset; } Arena; @@ -24,7 +24,7 @@ typedef struct { bool is_valid; union { ArenaErr err; - void *pointer; + uint8_t *pointer; }; } ArenaPointer; diff --git a/src/arena.c b/src/arena.c index ab7a690..89d7168 100644 --- a/src/arena.c +++ b/src/arena.c @@ -1,6 +1,7 @@ #include "arena.h" #include #include +#include ArenaResult arena_init(size_t size) { @@ -43,3 +44,30 @@ void arena_destroy(Arena *arena) { arena->size = 0; free(arena->data); } + +ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { + if (arena == NULL) { + ArenaPointer err = { + .is_valid = false, + .err = ARENA_NULL_ARG, + }; + return err; + } + + size_t new_offset = align_arena_offset(arena, alignment); + if (new_offset + size >= arena->size) { + ArenaPointer err = { + .is_valid = false, + .err = ARENA_OUT_OF_SPACE, + }; + return err; + } + + arena->offset = new_offset; + + ArenaPointer val = { + .is_valid = true, + .pointer = arena->data + arena->offset, + }; + return val; +}