Beispiel #1
0
    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;
    }