bubel-ecs/source/ecs/entity_allocator.d

29 lines
817 B
D

module ecs.entity_allocator;
import ecs.manager;
import std.experimental.allocator.mallocator : Mallocator, AlignedMallocator;
import std.experimental.allocator;
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;
}
}
}