diff --git a/mem/include/arena/mem_arena.h b/mem/include/arena/mem_arena.h index 1e39d21..29d76b2 100644 --- a/mem/include/arena/mem_arena.h +++ b/mem/include/arena/mem_arena.h @@ -2,6 +2,7 @@ #define MEM_ARENA_H #include "aliases.h" +#include "mem_allocator.h" #include #ifdef __cplusplus @@ -10,6 +11,7 @@ extern "C" { typedef struct growing_arena Arena; +Allocator wapp_mem_arena_allocator(Arena *arena); bool wapp_mem_arena_init(Arena **arena, u64 base_capacity); void *wapp_mem_arena_alloc(Arena *arena, u64 size); void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment); diff --git a/mem/src/arena/mem_arena.c b/mem/src/arena/mem_arena.c index decb484..25c2f23 100644 --- a/mem/src/arena/mem_arena.c +++ b/mem/src/arena/mem_arena.c @@ -1,5 +1,6 @@ #include "mem_arena.h" #include "aliases.h" +#include "mem_allocator.h" #include "mem_utils.h" #include #include @@ -49,8 +50,25 @@ internal void base_arena_clear(BaseArena *arena); internal void base_arena_free(BaseArena *arena); internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr); +internal void *mem_arena_alloc(u64 size, void *alloc_obj); +internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj); +internal void *mem_arena_realloc(void *ptr, u64 size, void *alloc_obj); +internal void *mem_arena_realloc_aligned(void *ptr, u64 size, u64 alignment, + void *alloc_obj); + // PUBLIC API +Allocator wapp_mem_arena_allocator(Arena *arena) { + return (Allocator){ + .obj = (void *)arena, + .alloc = mem_arena_alloc, + .alloc_aligned = mem_arena_alloc_aligned, + .realloc = mem_arena_realloc, + .realloc_aligned = mem_arena_realloc_aligned, + .free = NULL, + }; +} + bool wapp_mem_arena_init(Arena **arena, u64 base_capacity) { if (!arena || *arena || base_capacity == 0) { return false; @@ -337,7 +355,7 @@ internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) { max_search_end > arena_buf_start ? max_search_end : arena_buf_start; bool match; - for (; current >= search_end; --current) { + for (; current >= search_end; --current) { match = true; for (u64 i = 0; i < HDR_MAGIC_BYTE_COUNT; ++i) { @@ -350,7 +368,32 @@ internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) { if (match) { return (ArenaAllocHDR *)current; } - } + } return NULL; } + +internal void *mem_arena_alloc(u64 size, void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; + + return wapp_mem_arena_alloc(arena, size); +} + +internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; + + return wapp_mem_arena_alloc_aligned(arena, size, alignment); +} + +internal void *mem_arena_realloc(void *ptr, u64 size, void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; + + return wapp_mem_arena_realloc(arena, ptr, size); +} + +internal void *mem_arena_realloc_aligned(void *ptr, u64 size, u64 alignment, + void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; + + return wapp_mem_arena_realloc_aligned(arena, ptr, size, alignment); +}