88 lines
3.1 KiB
C
88 lines
3.1 KiB
C
// vim:fileencoding=utf-8:foldmethod=marker
|
|
|
|
#include "mem_arena_allocator.h"
|
|
#include "mem_arena.h"
|
|
#include "../../mem/mem_os.h"
|
|
#include "../../../common/aliases/aliases.h"
|
|
#include "../../../common/assert/assert.h"
|
|
|
|
wp_intern void initialiseArenaAllocator(WpAllocator *allocator);
|
|
wp_intern void *memArenaAlloc(u64 size, void *alloc_obj);
|
|
wp_intern void *memArenaAllocAligned(u64 size, u64 alignment, void *alloc_obj);
|
|
wp_intern void *memArenaRealloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
|
|
wp_intern void *memArenaReallocAligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
|
|
void *alloc_obj);
|
|
|
|
WpAllocator wpMemArenaAllocatorInitWithBuffer(u8 *buffer, u64 buffer_size) {
|
|
WpAllocator allocator = {0};
|
|
b8 initialised = wpMemArenaInitBuffer((WpArena **)(&allocator.obj), buffer, buffer_size);
|
|
if (!initialised) {
|
|
return allocator;
|
|
}
|
|
|
|
initialiseArenaAllocator(&allocator);
|
|
|
|
return allocator;
|
|
}
|
|
|
|
WpAllocator wpMemArenaAllocatorInitCustom(u64 base_capacity, WpMemAllocFlags flags, b8 zero_buffer) {
|
|
WpAllocator allocator = {0};
|
|
b8 initialised = wpMemArenaInitAllocatedCustom((WpArena **)(&allocator.obj), base_capacity, flags, zero_buffer);
|
|
if (!initialised) {
|
|
return allocator;
|
|
}
|
|
|
|
initialiseArenaAllocator(&allocator);
|
|
|
|
return allocator;
|
|
}
|
|
|
|
void wpMemArenaAllocatorTempBegin(const WpAllocator *allocator) {
|
|
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
|
|
wpMemArenaTempBegin((WpArena *)(allocator->obj));
|
|
}
|
|
|
|
void wpMemArenaAllocatorTempEnd(const WpAllocator *allocator) {
|
|
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
|
|
wpMemArenaTempEnd((WpArena *)(allocator->obj));
|
|
}
|
|
|
|
void wpMemArenaAllocatorClear(WpAllocator *allocator) {
|
|
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
|
|
wpMemArenaClear((WpArena *)(allocator->obj));
|
|
}
|
|
|
|
void wpMemArenaAllocatorDestroy(WpAllocator *allocator) {
|
|
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
|
|
wpMemArenaDestroy((WpArena **)(&(allocator->obj)));
|
|
*allocator = (WpAllocator){0};
|
|
}
|
|
|
|
wp_intern void initialiseArenaAllocator(WpAllocator *allocator) {
|
|
allocator->alloc = memArenaAlloc;
|
|
allocator->alloc_aligned = memArenaAllocAligned;
|
|
allocator->realloc = memArenaRealloc;
|
|
allocator->realloc_aligned = memArenaReallocAligned;
|
|
}
|
|
|
|
wp_intern void *memArenaAlloc(u64 size, void *alloc_obj) {
|
|
WpArena *arena = (WpArena *)alloc_obj;
|
|
return wpMemArenaAlloc(arena, size);
|
|
}
|
|
|
|
wp_intern void *memArenaAllocAligned(u64 size, u64 alignment, void *alloc_obj) {
|
|
WpArena *arena = (WpArena *)alloc_obj;
|
|
return wpMemArenaAllocAligned(arena, size, alignment);
|
|
}
|
|
|
|
wp_intern void *memArenaRealloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj) {
|
|
WpArena *arena = (WpArena *)alloc_obj;
|
|
return wpMemArenaRealloc(arena, ptr, old_size, new_size);
|
|
}
|
|
|
|
wp_intern void *memArenaReallocAligned(void *ptr, u64 old_size, u64 new_size, u64 alignment,
|
|
void *alloc_obj) {
|
|
WpArena *arena = (WpArena *)alloc_obj;
|
|
return wpMemArenaReallocAligned(arena, ptr, old_size, new_size, alignment);
|
|
}
|