Skip to content

Instantly share code, notes, and snippets.

@Jomy10
Created December 29, 2023 15:00
Show Gist options
  • Save Jomy10/5cd1c99922dea2ec2c4dc4b9871164e0 to your computer and use it in GitHub Desktop.
Save Jomy10/5cd1c99922dea2ec2c4dc4b9871164e0 to your computer and use it in GitHub Desktop.
#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