#include #include typedef void*(*allocator_alloc_fn)(void* userData, size_t cap); typedef void (*allocator_free_fn)(void* userData, void* ptr); typedef void*(*allocator_realloc_fn)(void* userData, void* ptr, size_t cap); typedef struct _allocator { allocator_alloc_fn alloc; allocator_free_fn free; allocator_realloc_fn realloc; void* userData; } Allocator; void* allocator_alloc(Allocator* alloc, int cap) { return alloc->alloc(alloc->userData, cap); } void allocator_free(Allocator* alloc, void* ptr) { alloc->free(alloc->userData, ptr); } void* allocator_realloc(Allocator* alloc, void* ptr, int cap) { return alloc->realloc(alloc->userData, ptr, cap); } static inline void* _allocator_default_alloc(__attribute__((unused)) void* userData, size_t cap) { return malloc(cap); } static inline void _allocator_default_free(__attribute__((unused)) void* userData, void* ptr) { free(ptr); } static inline void* _allocator_default_realloc(__attribute__((unused)) void* userData, void* ptr, size_t cap) { return realloc(ptr, cap); } Allocator default_allocator() { return (Allocator) { .alloc = &_allocator_default_alloc, .free = &_allocator_default_free, .realloc = &_allocator_default_realloc, .userData = NULL, }; } int main() { Allocator alloc = default_allocator(); int* a = allocator_alloc(&alloc, sizeof(int)); *a = 5; printf("%d\n", *a); return 0; }