/// <summary>Releases given suballocation, making it free. Merges it with adjacent free suballocations if applicable. Returns iterator to new free suballocation at this place.</summary>
        public D3D12MA_List <D3D12MA_Suballocation> .iterator FreeSuballocation(D3D12MA_List <D3D12MA_Suballocation> .iterator suballocItem)
        {
            // Change this suballocation to be marked as free.
            D3D12MA_Suballocation *suballoc = suballocItem.Get();

            suballoc->type     = D3D12MA_SUBALLOCATION_TYPE_FREE;
            suballoc->userData = null;

            // Update totals.
            ++m_FreeCount;
            m_SumFreeSize += suballoc->size;

            // Merge with previous and/or next suballocation if it's also free.
            bool mergeWithNext = false;
            bool mergeWithPrev = false;

            D3D12MA_List <D3D12MA_Suballocation> .iterator nextItem = suballocItem;
            nextItem = nextItem.MoveNext();

            if ((nextItem != m_Suballocations.end()) && (nextItem.Get()->type == D3D12MA_SUBALLOCATION_TYPE_FREE))
            {
                mergeWithNext = true;
            }

            D3D12MA_List <D3D12MA_Suballocation> .iterator prevItem = suballocItem;

            if (suballocItem != m_Suballocations.begin())
            {
                prevItem = prevItem.MoveBack();

                if (prevItem.Get()->type == D3D12MA_SUBALLOCATION_TYPE_FREE)
                {
                    mergeWithPrev = true;
                }
            }

            if (mergeWithNext)
            {
                UnregisterFreeSuballocation(nextItem);
                MergeFreeWithNext(suballocItem);
            }

            if (mergeWithPrev)
            {
                UnregisterFreeSuballocation(prevItem);
                MergeFreeWithNext(prevItem);
                RegisterFreeSuballocation(prevItem);
                return(prevItem);
            }
            else
            {
                RegisterFreeSuballocation(suballocItem);
                return(suballocItem);
            }
        }
        public static void Init(ref D3D12MA_BlockMetadata_Generic pThis, [NativeTypeName("UINT64")] ulong size)
        {
            D3D12MA_BlockMetadata.Init(ref pThis.Base, size);
            pThis.m_ZeroInitializedRange.Reset(size);

            pThis.m_FreeCount   = 1;
            pThis.m_SumFreeSize = size;

            D3D12MA_Suballocation suballoc = default;

            suballoc.offset   = 0;
            suballoc.size     = size;
            suballoc.type     = D3D12MA_SUBALLOCATION_TYPE_FREE;
            suballoc.userData = null;

            D3D12MA_ASSERT((D3D12MA_DEBUG_LEVEL > 0) && (size > MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER));
            pThis.m_Suballocations.push_back(in suballoc);

            D3D12MA_List <D3D12MA_Suballocation> .iterator suballocItem = pThis.m_Suballocations.end();
            suballocItem = suballocItem.MoveBack();

            pThis.m_FreeSuballocationsBySize.push_back(in suballocItem);
        }