| 1745 | |
| 1746 | template<typename T> |
| 1747 | void PoolAllocator<T>::Free(T* ptr) |
| 1748 | { |
| 1749 | // Search all memory blocks to find ptr. |
| 1750 | for(size_t i = m_ItemBlocks.size(); i--; ) |
| 1751 | { |
| 1752 | ItemBlock& block = m_ItemBlocks[i]; |
| 1753 | |
| 1754 | Item* pItemPtr; |
| 1755 | memcpy(&pItemPtr, &ptr, sizeof(pItemPtr)); |
| 1756 | |
| 1757 | // Check if pItemPtr is in address range of this block. |
| 1758 | if((pItemPtr >= block.pItems) && (pItemPtr < block.pItems + block.Capacity)) |
| 1759 | { |
| 1760 | ptr->~T(); // Explicit destructor call. |
| 1761 | const UINT index = static_cast<UINT>(pItemPtr - block.pItems); |
| 1762 | pItemPtr->NextFreeIndex = block.FirstFreeIndex; |
| 1763 | block.FirstFreeIndex = index; |
| 1764 | return; |
| 1765 | } |
| 1766 | } |
| 1767 | D3D12MA_ASSERT(0 && "Pointer doesn't belong to this memory pool."); |
| 1768 | } |
| 1769 | |
| 1770 | template<typename T> |
| 1771 | typename PoolAllocator<T>::ItemBlock& PoolAllocator<T>::CreateNewBlock() |
no test coverage detected