示例#1
0
        public T *Alloc()
        {
            T *   result;
            Item *pItem;

            for (nuint i = m_ItemBlocks.size(); unchecked (i-- != 0);)
            {
                ItemBlock *block = m_ItemBlocks[i];

                // This block has some free items: Use first one.
                if (block->FirstFreeIndex != UINT32_MAX)
                {
                    pItem = &block->pItems[block->FirstFreeIndex];
                    block->FirstFreeIndex = pItem->NextFreeIndex;

                    result = (T *)&pItem->Value;
                    return(result);
                }
            }

            // No block has free item: Create new one and use it.
            ItemBlock *newBlock = CreateNewBlock();

            pItem = &newBlock->pItems[0];
            newBlock->FirstFreeIndex = pItem->NextFreeIndex;

            result = (T *)&pItem->Value;
            return(result);
        }
示例#2
0
        public void Free(T *ptr)
        {
            // Search all memory blocks to find ptr.

            for (nuint i = m_ItemBlocks.size(); unchecked (i-- != 0);)
            {
                ItemBlock *block = m_ItemBlocks[i];

                Item *pItemPtr;
                memcpy(&pItemPtr, &ptr, (nuint)sizeof(Item *));

                // Check if pItemPtr is in address range of this block.
                if ((pItemPtr >= block->pItems) && (pItemPtr < block->pItems + block->Capacity))
                {
                    ptr->Dispose(); // Explicit destructor call.
                    uint index = (uint)(pItemPtr - block->pItems);
                    pItemPtr->NextFreeIndex = block->FirstFreeIndex;
                    block->FirstFreeIndex   = index;
                    return;
                }
            }

            D3D12MA_ASSERT(false); // Pointer doesn't belong to this memory pool
        }