#include "world.h" #include void tc_reset_chunk_pool(tc_chunk_pool_s *chunk_pool) { chunk_pool->used_entries = 0; chunk_pool->first_free = chunk_pool->entries; uint32_t entry_index = 0; while(entry_index < chunk_pool->capacity) { chunk_pool->entries[entry_index].next = &chunk_pool->entries[entry_index+1]; chunk_pool->entries[entry_index].previous = &chunk_pool->entries[entry_index-1]; ++entry_index; } chunk_pool->entries[0].previous = NULL; chunk_pool->entries[chunk_pool->capacity-1].next = NULL; } tc_chunk_pool_s * tc_new_chunk_pool(uint32_t capacity) { tc_chunk_pool_s *pool = malloc(sizeof(tc_chunk_pool_s)); pool->capacity = capacity; pool->entries = calloc(sizeof(tc_chunk_pool_entry_s), pool->capacity); tc_reset_chunk_pool(pool); return pool; } tc_chunk_pool_entry_s * tc_allocate_chunk_pool_entry(tc_chunk_pool_s *pool) { if(pool->first_free == NULL) { pool->continuation = tc_new_chunk_pool(pool->capacity * 2); return tc_allocate_chunk_pool_entry(pool->continuation); } tc_chunk_pool_entry_s *allocated = pool->first_free; pool->first_free = allocated->next; return allocated; } tc_chunk_s * tc_allocate_chunk(tc_world_s *world) { tc_chunk_pool_entry_s *entry = tc_allocate_chunk_pool_entry(world->pool); entry->chunk.superstructure = entry; return &entry->chunk; } void tc_free_chunk(tc_world_s *world, tc_chunk_s *chunk) { tc_chunk_pool_s *pool = world->pool; chunk->superstructure->next = pool->first_free; pool->first_free = chunk->superstructure; }