#include "lrhi.h" void *lrhi_allocator_allocate(struct lrhi_allocator *allocator, ptrdiff_t size) { return allocator->allocate(size, allocator->ctx); } void lrhi_allocator_free(struct lrhi_allocator *allocator, ptrdiff_t size, void *ptr) { allocator->free(ptr, size, allocator->ctx); } struct lrhi_arena { unsigned char *data; int allocated; int capacity; }; lrhi_arena *lrhi_arena_create(struct lrhi_allocator *allocator, ptrdiff_t arena_size) { lrhi_arena *arena = lrhi_allocator_allocate(allocator, sizeof(lrhi_arena)); arena->data = lrhi_allocator_allocate(allocator, arena_size); arena->allocated = 0; arena->capacity = arena_size; return arena; } void lrhi_arena_destroy(struct lrhi_allocator *allocator, lrhi_arena *arena) { lrhi_allocator_free(allocator, arena->capacity, arena->data); lrhi_allocator_free(allocator, sizeof(lrhi_arena), arena); } void *lrhi_arena_allocate(lrhi_arena *arena, ptrdiff_t size) { if (arena->allocated + size > arena->capacity) { LRHI_PANIC("Arena is full, allocation failed"); } unsigned char *ptr = arena->data + arena->allocated; arena->allocated += size; return ptr; } void lrhi_arena_reset(lrhi_arena *arena) { arena->allocated = 0; } static void *arena_allocator_allocate(ptrdiff_t size, void *ctx) { return lrhi_arena_allocate((lrhi_arena *)ctx, size); } static void arena_allocator_free(void *ptr, ptrdiff_t size, void *ctx) { (void)ptr; (void)size; (void)ctx; } struct lrhi_allocator lrhi_arena_allocator(lrhi_arena *arena) { return (struct lrhi_allocator){.allocate = arena_allocator_allocate, .free = arena_allocator_free, .ctx = arena}; }