Add function to check memory op support for allocators
Release / release (push) Successful in 7s

This commit is contained in:
Abdelrahman Said
2026-06-28 14:03:58 +01:00
parent ffdeb5fdc2
commit 5804c5d345
3 changed files with 56 additions and 2 deletions
+1 -1
View File
@@ -1 +1 @@
2.0.1
2.1.0
+44 -1
View File
@@ -7,29 +7,72 @@
void *wpMemAllocatorAlloc(const WpAllocator *allocator, u64 size) {
wpDebugAssert(allocator != NULL && (allocator->alloc) != NULL, "`allocator` and `allocator->alloc` should not be NULL");
if (wpMemAllocatorOpSupported(allocator, WP_MEM_OP_ALLOC)) {
return NULL;
}
return allocator->alloc(size, allocator->obj);
}
void *wpMemAllocatorAllocAligned(const WpAllocator *allocator, u64 size, u64 alignment) {
wpDebugAssert(allocator != NULL && (allocator->alloc_aligned) != NULL, "`allocator` and `allocator->alloc_aligned` should not be NULL");
if (wpMemAllocatorOpSupported(allocator, WP_MEM_OP_ALLOC_ALIGNED)) {
return NULL;
}
return allocator->alloc_aligned(size, alignment, allocator->obj);
}
void *wpMemAllocatorRealloc(const WpAllocator *allocator, void *ptr, u64 old_size, u64 new_size) {
wpDebugAssert(allocator != NULL && (allocator->realloc) != NULL, "`allocator` and `allocator->realloc` should not be NULL");
if (wpMemAllocatorOpSupported(allocator, WP_MEM_OP_REALLOC)) {
return NULL;
}
return allocator->realloc(ptr, old_size, new_size, allocator->obj);
}
void *wpMemAllocatorReallocAligned(const WpAllocator *allocator, void *ptr, u64 old_size,
u64 new_size, u64 alignment) {
wpDebugAssert(allocator != NULL && (allocator->realloc_aligned) != NULL, "`allocator` and `allocator->realloc_aligned` should not be NULL");
if (wpMemAllocatorOpSupported(allocator, WP_MEM_OP_REALLOC_ALIGNED)) {
return NULL;
}
return allocator->realloc_aligned(ptr, old_size, new_size, alignment, allocator->obj);
}
void wpMemAllocatorFree(const WpAllocator *allocator, void **ptr, u64 size) {
if (!allocator || !(allocator->free)) {
wpDebugAssert(allocator != NULL && (allocator->free) != NULL, "`allocator` and `allocator->free` should not be NULL");
if (wpMemAllocatorOpSupported(allocator, WP_MEM_OP_FREE)) {
return;
}
allocator->free(ptr, size, allocator->obj);
}
b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op) {
wpDebugAssert(allocator != NULL, "`allocator` should not be NULL");
switch (op) {
case WP_MEM_OP_ALLOC:
return allocator->alloc != NULL;
case WP_MEM_OP_ALLOC_ALIGNED:
return allocator->alloc_aligned != NULL;
case WP_MEM_OP_REALLOC:
return allocator->realloc != NULL;
case WP_MEM_OP_REALLOC_ALIGNED:
return allocator->realloc_aligned != NULL;
case WP_MEM_OP_FREE:
return allocator->free != NULL;
default:
break;
}
return false;
}
+11
View File
@@ -11,6 +11,16 @@
BEGIN_C_LINKAGE
#endif // !WP_PLATFORM_CPP
typedef enum {
WP_MEM_OP_ALLOC,
WP_MEM_OP_ALLOC_ALIGNED,
WP_MEM_OP_REALLOC,
WP_MEM_OP_REALLOC_ALIGNED,
WP_MEM_OP_FREE,
COUNT_MEM_OPS
} WpMemOp;
typedef void *(WpMemAllocFunc)(u64 size, void *alloc_obj);
typedef void *(WpMemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj);
typedef void *(WpMemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj);
@@ -42,6 +52,7 @@ void *wpMemAllocatorRealloc(const WpAllocator *allocator, void *ptr, u64 old_siz
void *wpMemAllocatorReallocAligned(const WpAllocator *allocator, void *ptr, u64 old_size,
u64 new_size, u64 alignment);
void wpMemAllocatorFree(const WpAllocator *allocator, void **ptr, u64 size);
b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op);
#ifdef WP_PLATFORM_CPP
END_C_LINKAGE