void* AllocatorReserve(DiAllocatorBlock* allocator) { if (!allocator) { return 0; } if (allocator->mFree) { DiAllocatorNode* freeNode = allocator->mFree; void* ptr = (reinterpret_cast<unsigned char*>(freeNode)) + sizeof(DiAllocatorNode); allocator->mFree = freeNode->mNext; freeNode->mNext = 0; return ptr; } // Free nodes have been exhausted. Allocate a new larger block unsigned newCapacity = (allocator->mCapacity + 1) >> 1; AllocatorReserveBlock(allocator, allocator->mNodeSize, newCapacity); allocator->mCapacity += newCapacity; // We should have new free node(s) chained DiAllocatorNode* freeNode = allocator->mFree; void* ptr = (reinterpret_cast<unsigned char*>(freeNode)) + sizeof(DiAllocatorNode); allocator->mFree = freeNode->mNext; freeNode->mNext = 0; return ptr; }
void* AllocatorReserve(AllocatorBlock* allocator) { if (!allocator) return 0; if (!allocator->free_) { // Free nodes have been exhausted. Allocate a new larger block unsigned newCapacity = (allocator->capacity_ + 1) >> 1; AllocatorReserveBlock(allocator, allocator->nodeSize_, newCapacity); allocator->capacity_ += newCapacity; }