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