From ce537b7494fdd9470cfb71d71ff8035de8bab48e Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 7 Sep 2024 15:42:36 +0100 Subject: [PATCH] Restore Allocator implementation --- src/core/mem/allocator/mem_allocator.c | 47 ++++++++++++++++++++++++++ src/core/mem/allocator/mem_allocator.h | 46 +++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 src/core/mem/allocator/mem_allocator.c create mode 100644 src/core/mem/allocator/mem_allocator.h diff --git a/src/core/mem/allocator/mem_allocator.c b/src/core/mem/allocator/mem_allocator.c new file mode 100644 index 0000000..1a53e80 --- /dev/null +++ b/src/core/mem/allocator/mem_allocator.c @@ -0,0 +1,47 @@ +#include "mem_allocator.h" +#include + +#pragma region Allocator API definitions +void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size) { + if (!allocator || !(allocator->alloc)) { + return NULL; + } + + return allocator->alloc(size, allocator->obj); +} + +void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, + u64 alignment) { + if (!allocator || !(allocator->alloc_aligned)) { + return NULL; + } + + return allocator->alloc_aligned(size, alignment, allocator->obj); +} + +void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, + u64 size) { + if (!allocator || !(allocator->realloc)) { + return NULL; + } + + return allocator->realloc(ptr, size, allocator->obj); +} + +void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, + u64 size, u64 alignment) { + if (!allocator || !(allocator->realloc_aligned)) { + return NULL; + } + + return allocator->realloc_aligned(ptr, size, alignment, allocator->obj); +} + +void wapp_mem_allocator_free(const Allocator *allocator, void **ptr) { + if (!allocator || !(allocator->free)) { + return; + } + + allocator->free(ptr, allocator->obj); +} +#pragma endregion Allocator API definitions diff --git a/src/core/mem/allocator/mem_allocator.h b/src/core/mem/allocator/mem_allocator.h new file mode 100644 index 0000000..5da4128 --- /dev/null +++ b/src/core/mem/allocator/mem_allocator.h @@ -0,0 +1,46 @@ +#ifndef MEM_ALLOCATOR_H +#define MEM_ALLOCATOR_H + +#include "aliases.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#pragma region Allocator function pointer types +typedef void *(MemAllocFunc)(u64 size, void *alloc_obj); +typedef void *(MemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj); +typedef void *(MemReallocFunc)(void *ptr, u64 size, void *alloc_obj); +typedef void *(MemReallocAlignedFunc)(void *ptr, u64 size, u64 alignment, + void *alloc_obj); +typedef void(MemFreeFunc)(void **ptr, void *alloc_obj); +#pragma endregion Allocator function pointer types + +#pragma region Allocator type +typedef struct allocator Allocator; +struct allocator { + void *obj; + MemAllocFunc *alloc; + MemAllocAlignedFunc *alloc_aligned; + MemReallocFunc *realloc; + MemReallocAlignedFunc *realloc_aligned; + MemFreeFunc *free; +}; +#pragma endregion Allocator type + +#pragma region Allocator API declarations +void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size); +void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, + u64 alignment); +void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, + u64 size); +void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, + u64 size, u64 alignment); +void wapp_mem_allocator_free(const Allocator *allocator, void **ptr); +#pragma endregion Allocator API declarations + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // !MEM_ALLOCATOR_H