module ecs.block_allocator; import ecs.manager; import std.experimental.allocator; import std.experimental.allocator.mallocator : AlignedMallocator, Mallocator; struct BlockAllocator//(uint block_size, uint blocks_in_allocation) { private uint block_size; private uint blocks_in_allocation; void* next_block = null; void* getBlock() nothrow @nogc { if (next_block is null) allocBlock(); void* ret = next_block; next_block = *cast(void**) next_block; return ret; } void freeBlock(void* block) nothrow @nogc { *cast(void**)block = next_block; next_block = block; } private void allocBlock() nothrow @nogc { next_block = cast(void*) AlignedMallocator.instance.alignedAllocate( block_size * blocks_in_allocation, block_size); foreach (i; 0 .. blocks_in_allocation - 1) { void** pointer = cast(void**)(next_block + i * block_size); *pointer = next_block + (i + 1) * block_size; } void** pointer = cast(void**)( next_block + (blocks_in_allocation - 1) * block_size); *pointer = null; } }