// vim:fileencoding=utf-8:foldmethod=marker #ifndef MEM_ARENA_ALLOCATOR_H #define MEM_ARENA_ALLOCATOR_H #include "../../mem/mem_os.h" #include "../../../common/aliases/aliases.h" #include "../../../common/platform/platform.h" #include "../../../base/mem/allocator/mem_allocator.h" #ifdef WAPP_PLATFORM_CPP BEGIN_C_LINKAGE #endif // !WAPP_PLATFORM_CPP #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)) /** * 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, b8 zero_buffer); Allocator wapp_mem_arena_allocator_init_with_buffer(u8 *buffer, u64 buffer_size); void wapp_mem_arena_allocator_temp_begin(const Allocator *allocator); void wapp_mem_arena_allocator_temp_end(const Allocator *allocator); void wapp_mem_arena_allocator_clear(Allocator *allocator); void wapp_mem_arena_allocator_destroy(Allocator *allocator); #ifdef WAPP_PLATFORM_CPP END_C_LINKAGE #endif // !WAPP_PLATFORM_CPP #endif // !MEM_ARENA_ALLOCATOR_H