diff --git a/include/lae_arena.h b/include/lae_arena.h index b9f7bf3..cd52638 100644 --- a/include/lae_arena.h +++ b/include/lae_arena.h @@ -30,6 +30,15 @@ typedef struct { }; } ArenaPointer; +typedef struct { + bool is_valid; + + union { + ArenaErr err; + Allocator allocator; + }; +} ArenaAllocResult; + typedef struct { bool is_valid; union { @@ -54,4 +63,6 @@ ArenaSizeResult arena_get_align_padding(Arena *arena, size_t alignment); // I shouldn't cover. ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment); +ArenaAllocResult arena_get_allocator(Arena *arena); + #endif // !RENA_H diff --git a/src/lae_arena.c b/src/lae_arena.c index 0d08a25..e8ee80c 100644 --- a/src/lae_arena.c +++ b/src/lae_arena.c @@ -1,5 +1,6 @@ #include "lae_arena.h" #include "lae_allocator.h" +#include #include #include #include @@ -14,6 +15,16 @@ struct Arena { Allocator allocator; }; +static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment); +static void *arena_allocator_realloc( + void *ctx, + void *pointer, + size_t old_size, + size_t new_size, + size_t alignment); +static void +arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment); + ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) { if (arena == NULL) { return ARENA_NULL_ARG; @@ -23,14 +34,15 @@ ArenaErr arena_init(Arena **arena, Allocator allocator, size_t capacity) { return ARENA_INVALID_SIZE; } - Arena *new_arena = allocator.alloc(allocator.ctx, sizeof(Arena)); + Arena *new_arena = + allocator.alloc(allocator.ctx, sizeof(Arena), alignof(Arena)); if (new_arena == NULL) { return ARENA_BAD_ALLOC; } - void *buffer = allocator.alloc(allocator.ctx, capacity); + void *buffer = allocator.alloc(allocator.ctx, capacity, 0); if (buffer == NULL) { - allocator.free(allocator.ctx, new_arena, capacity); + allocator.free(allocator.ctx, new_arena, capacity, 0); return ARENA_BAD_ALLOC; } @@ -52,11 +64,12 @@ ArenaErr arena_destroy(Arena **arena) { } Arena *tmp = *arena; - tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity); + tmp->allocator.free(tmp->allocator.ctx, tmp->buffer, tmp->capacity, 0); tmp->buffer = NULL; tmp->offset = 0; tmp->capacity = 0; - tmp->allocator.free(tmp->allocator.ctx, *arena, sizeof(Arena)); + tmp->allocator + .free(tmp->allocator.ctx, *arena, sizeof(Arena), alignof(Arena)); *arena = NULL; return ARENA_OK; @@ -200,7 +213,8 @@ ArenaErr arena_resize(Arena *arena, size_t new_capacity) { arena->allocator.ctx, arena->buffer, arena->capacity, - new_capacity); + new_capacity, + 0); if (tmp == NULL) { return ARENA_BAD_ALLOC; } @@ -233,3 +247,40 @@ void *arena_unwrap_pointer(ArenaPointer p) { } return p.arena->buffer + p.offset; } + +static void *arena_allocator_alloc(void *ctx, size_t size, size_t alignment) { + Arena *arena = ctx; + + return arena_unwrap_pointer(arena_alloc(arena, size, alignment)); +} + +static void *arena_allocator_realloc( + void *ctx, + void *pointer, + size_t old_size, + size_t new_size, + size_t alignment) { + return NULL; +} + +static void +arena_allocator_free(void *ctx, void *pointer, size_t size, size_t alignment) { + return; +} + +ArenaAllocResult arena_get_allocator(Arena *arena) { + if (arena == NULL) { + return (ArenaAllocResult){ + .is_valid = false, + .err = ARENA_NULL_ARG, + }; + } + + Allocator allocator = { + .alloc = arena_allocator_alloc, + .realloc = arena_allocator_realloc, + .free = arena_allocator_free, + .ctx = arena}; + + return (ArenaAllocResult){.is_valid = true, .allocator = allocator}; +} diff --git a/xmake.lua b/xmake.lua index 34b97f0..6001592 100644 --- a/xmake.lua +++ b/xmake.lua @@ -78,12 +78,12 @@ if has_config("tests") then target("test_arena") set_kind("binary") + add_files("test/test_arena.c") + add_deps("lae_arena") add_packages("cmocka") - add_files("test/test_arena.c") - add_tests("default") if has_config("asan") then