diff --git a/include/arena.h b/include/arena.h index 189bb8b..a01d3ff 100644 --- a/include/arena.h +++ b/include/arena.h @@ -26,7 +26,10 @@ typedef struct { bool is_valid; union { ArenaErr err; - uint8_t *address; + struct { + Arena *arena; + size_t offset; + }; }; } ArenaPointer; @@ -53,6 +56,8 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment); ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment); ArenaErr arena_realloc(Arena *arena, size_t new_capacity); +void *arena_unwrap_pointer(ArenaPointer p); + SizeResult get_arena_align_padding(Arena *arena, size_t alignment); ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment); // Should be moved to something like general utilities, @@ -60,7 +65,4 @@ ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment); bool mul_size_t_safe(size_t a, size_t b, size_t *out); - - - #endif // !ARENA_H diff --git a/src/arena.c b/src/arena.c index 9613e0b..a248b37 100644 --- a/src/arena.c +++ b/src/arena.c @@ -5,6 +5,8 @@ #include #include + + ArenaResult arena_init(size_t capacity) { if (capacity < 1) { return (ArenaResult) {.is_valid = false, .err = ARENA_INVALID_SIZE}; @@ -41,7 +43,6 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { return (ArenaPointer) {.is_valid = false, .err = padding.err}; } - if (arena->offset + padding.val >= arena->capacity) { return (ArenaPointer) {.is_valid = false, .err = ARENA_OUT_OF_SPACE}; } @@ -53,7 +54,7 @@ ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment) { size_t aligned_offset = arena->offset + padding.val; arena->offset = aligned_offset + size; - return (ArenaPointer) {.is_valid = true, .address = arena->buffer + aligned_offset}; + return (ArenaPointer) {.is_valid = true, .offset = aligned_offset, .arena = arena}; } ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment) { @@ -104,7 +105,7 @@ ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment) } memcpy( - pointer.address, + arena_unwrap_pointer(pointer), data, size); @@ -126,6 +127,8 @@ ArenaErr arena_realloc(Arena *arena, size_t new_capacity) { return ARENA_OK; } + + SizeResult get_arena_align_padding(Arena *arena, size_t alignment) { if (arena == NULL) { return (SizeResult) {.is_valid = false, .err = ARENA_NULL_ARG}; @@ -141,6 +144,13 @@ SizeResult get_arena_align_padding(Arena *arena, size_t alignment) { return (SizeResult) {.is_valid = true, .err = aligned - current_address}; } +void *arena_unwrap_pointer(ArenaPointer p) { + if (!p.is_valid) { + return NULL; + } + return p.arena->buffer + p.offset; +} + bool mul_size_t_safe(size_t a, size_t b, size_t *out) { if (out == NULL) { return true;