#include #include #include rr_generic_arena_s rr_new_arena(rr_generic_allocator_s *allocator, usz_t capacity) { rr_arena_s *specifics = rr_alloc(allocator, sizeof(rr_arena_s) + capacity); specifics->capacity = capacity; specifics->offset = 0; // The arena allocation is right after the head structure. specifics->allocation = (void *) (specifics + sizeof(rr_arena_s)); specifics->allocator = allocator; rr_generic_arena_s arena; arena.fn_alloc = &rr_arena_alloc; arena.fn_destruct = &rr_destruct_arena; arena.specifics = specifics; return arena; } void rr_destruct_arena(rr_generic_arena_s *generic_arena) { rr_arena_s *arena = generic_arena->specifics; rr_free(arena->allocator, generic_arena->specifics); } void * rr_arena_alloc(rr_generic_arena_s *generic_arena, usz_t length) { rr_arena_s *arena = generic_arena->specifics; if((arena->offset + length) > arena->capacity) return NULL; void *block = &arena->allocation[arena->offset]; arena->offset += length; return block; } char * rr_arena_clone_string(rr_generic_arena_s *generic_arena, const char *string) { usz_t len_string = rr_measure_string(string); char *cloned_string = rr_arena_alloc(generic_arena, len_string+1); if(cloned_string == NULL) return NULL; rr_memcopy(cloned_string, string, len_string); cloned_string[len_string] = 0x00; return cloned_string; }