private unsafe int AddNewBin(ref SizeBin bin, int index)
        {
            // If there are no free block lists, make a new one
            if (m_BlocksFreelist.IsEmpty)
            {
                bin.blocksId = m_Blocks.Length;
                m_Blocks.Add(new BlocksOfSize(0));
            }
            else
            {
                int last = m_BlocksFreelist.Length - 1;
                bin.blocksId = m_BlocksFreelist[last];
                m_BlocksFreelist.ResizeUninitialized(last);
            }

#if DEBUG_ASSERTS
            Assert.IsTrue(m_Blocks[bin.blocksId].Empty);
#endif

            int tail = m_SizeBins.Length - index;
            m_SizeBins.ResizeUninitialized(m_SizeBins.Length + 1);
            SizeBin *p = (SizeBin *)m_SizeBins.GetUnsafePtr();
            UnsafeUtility.MemMove(
                p + (index + 1),
                p + index,
                tail * UnsafeUtility.SizeOf <SizeBin>());
            p[index] = bin;

            return(index);
        }
        private unsafe int AddNewBin(SizeBin bin, int index)
        {
            int tail = m_SizeBins.Length - index;

            m_SizeBins.ResizeUninitialized(m_SizeBins.Length + 1);
            SizeBin *p = (SizeBin *)m_SizeBins.GetUnsafePtr();

            UnsafeUtility.MemMove(
                p + (index + 1),
                p + index,
                tail * UnsafeUtility.SizeOf <SizeBin>());
            p[index] = bin;
            return(index);
        }
        private unsafe void RemoveEmptyBins(SizeBin bin, int index)
        {
            if (!m_Blocks[bin.blocksId].Empty)
            {
                return;
            }

            int      tail = m_SizeBins.Length - (index + 1);
            SizeBin *p    = (SizeBin *)m_SizeBins.GetUnsafePtr();

            UnsafeUtility.MemMove(
                p + index,
                p + (index + 1),
                tail * UnsafeUtility.SizeOf <SizeBin>());
            m_SizeBins.ResizeUninitialized(m_SizeBins.Length - 1);
        }