module ecs.entity_allocator; import ecs.manager; import std.experimental.allocator; import std.experimental.allocator.mallocator : AlignedMallocator, Mallocator; struct EntityAllocator { void* next_block; void* getBlock() { if (next_block is null) allocBlock(); void* ret = next_block; next_block = *cast(void**) next_block; return ret; } private void allocBlock() { next_block = cast(void*) AlignedMallocator.instance.alignedAllocate( EntityManager.page_size * EntityManager.pages_in_block, EntityManager.page_size); foreach (i; 0 .. EntityManager.pages_in_block - 1) { void** pointer = cast(void**)(next_block + i * EntityManager.page_size); *pointer = next_block + (i + 1) * EntityManager.page_size; } void** pointer = cast(void**)( next_block + (EntityManager.pages_in_block - 1) * EntityManager.page_size); *pointer = null; } }