diff --git a/src/core/mem/arena/mem_arena.c b/src/core/mem/arena/mem_arena.c index 3158e0e..2bd75de 100644 --- a/src/core/mem/arena/mem_arena.c +++ b/src/core/mem/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 @@ -24,8 +25,40 @@ struct arena { #endif // ifdef WAPP_PLATFORM_WINDOWS }; -// PUBLIC API +#pragma region Arena Allocator wrappers declarations +internal inline void *mem_arena_alloc(u64 size, void *alloc_obj); +internal inline void *mem_arena_alloc_aligned(u64 size, u64 alignment, + void *alloc_obj); +#pragma endregion Arena Allocator wrappers declarations +#pragma region Arena Allocator API definitions +Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, + MemAllocFlags flags, + bool zero_buffer) { + Allocator allocator = {0}; + bool initialised = wapp_mem_arena_init_custom( + (Arena **)(&allocator.obj), base_capacity, flags, zero_buffer); + if (!initialised) { + return allocator; + } + + allocator.alloc = mem_arena_alloc; + allocator.alloc_aligned = mem_arena_alloc_aligned; + + return allocator; +} + +void wapp_mem_arena_allocator_clear(Allocator *allocator) { + wapp_mem_arena_clear((Arena *)(allocator->obj)); +} + +void wapp_mem_arena_allocator_destroy(Allocator *allocator) { + wapp_mem_arena_destroy((Arena **)(&(allocator->obj))); + *allocator = (Allocator){0}; +} +#pragma endregion Arena Allocator API definitions + +#pragma region API definitions bool wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, bool zero_buffer) { if (!arena || *arena || base_capacity == 0) { @@ -116,3 +149,17 @@ void wapp_mem_arena_destroy(Arena **arena) { free(*arena); *arena = NULL; } +#pragma endregion API definitions + +#pragma region Arena Allocator wrappers definitions +internal inline void *mem_arena_alloc(u64 size, void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; + return wapp_mem_arena_alloc(arena, size); +} + +internal inline 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); +} +#pragma endregion Arena Allocator wrappers definitions diff --git a/src/core/mem/arena/mem_arena.h b/src/core/mem/arena/mem_arena.h index ca6c680..793208b 100644 --- a/src/core/mem/arena/mem_arena.h +++ b/src/core/mem/arena/mem_arena.h @@ -2,6 +2,7 @@ #define MEM_ARENA_H #include "aliases.h" +#include "mem_allocator.h" #include "mem_utils.h" #include @@ -11,6 +12,41 @@ extern "C" { typedef struct arena Arena; +#pragma region Allocator wrapper macros +#define wapp_mem_arena_allocator_init(base_capacity) \ + (wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE, \ + false)) +#define wapp_mem_arena_allocator_init_commit(base_capacity) \ + (wapp_mem_arena_allocator_init_custom( \ + base_capacity, WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, false)) +#define wapp_mem_arena_allocator_init_zero(base_capacity) \ + (wapp_mem_arena_allocator_init_custom(base_capacity, WAPP_MEM_ALLOC_RESERVE, \ + true)) +#define wapp_mem_arena_allocator_init_commit_and_zero(base_capacity) \ + (wapp_mem_arena_allocator_init_custom( \ + base_capacity, WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, true)) +#pragma endregion Arena Allocator wrapper macros + +#pragma region Allocator API declarations +/** + * Wraps an Arena in an Allocator object. It attempts to initialise the Arena + * and, if successful, defines the operations supported by it to be used by the + * Allocator. + * + * An Arena allocator only supports normal allocation and aligned allocation. + * Reallocation, aligned reallocation and freeing aren't implemented. + * + * The `wapp_mem_arena_allocator_init_custom` provides the most control over how + * the Arena is initialised. Wrapper macros are provided for easier use. + */ +Allocator wapp_mem_arena_allocator_init_custom(u64 base_capacity, + MemAllocFlags flags, + bool zero_buffer); +void wapp_mem_arena_allocator_clear(Allocator *allocator); +void wapp_mem_arena_allocator_destroy(Allocator *allocator); +#pragma endregion Arena Allocator API declarations + +#pragma region wrapper macros #define wapp_mem_arena_init(arena_dptr, base_capacity) \ (wapp_mem_arena_init_custom(arena_dptr, base_capacity, \ WAPP_MEM_ALLOC_RESERVE, false)) @@ -25,13 +61,21 @@ typedef struct arena Arena; (wapp_mem_arena_init_custom(arena_dptr, base_capacity, \ WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, \ true)) +#pragma endregion Arena wrapper macros +#pragma region Arena API declarations +/** + * Arena initialisation function. `wapp_mem_arena_init_custom` provides the most + * control over how the Arena is initialised. Wrapper macros are provided for + * easier use. + */ bool wapp_mem_arena_init_custom(Arena **arena, u64 base_capacity, MemAllocFlags flags, bool zero_buffer); void *wapp_mem_arena_alloc(Arena *arena, u64 size); void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment); void wapp_mem_arena_clear(Arena *arena); void wapp_mem_arena_destroy(Arena **arena); +#pragma endregion Arena API declarations #ifdef __cplusplus }