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); }
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 }