Created
December 29, 2023 15:00
-
-
Save Jomy10/5cd1c99922dea2ec2c4dc4b9871164e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment