public void SetCapacity(int targetCapacity) { if (targetCapacity <= Capacity) { return; } if (targetCapacity < 64) { targetCapacity = 64; } else { targetCapacity = CollectionHelper.CeilPow2(targetCapacity); } var newPtr = (byte *)UnsafeUtility.Malloc(targetCapacity, Alignment, Allocator); if (Ptr != null) { UnsafeUtility.MemCpy(newPtr, Ptr, Size); UnsafeUtility.Free(Ptr, Allocator); } Ptr = newPtr; Capacity = targetCapacity; }
void SetCapacity(int sizeOf, int alignOf, int targetCapacity, Allocator allocator) { if (targetCapacity > 0) { var itemsPerCacheLine = 64 / sizeOf; if (targetCapacity < itemsPerCacheLine) { targetCapacity = itemsPerCacheLine; } targetCapacity = CollectionHelper.CeilPow2(targetCapacity); } var newCapacity = targetCapacity; if (newCapacity == m_capacity) { return; } void *newPointer = null; if (newCapacity > 0) { var bytesToMalloc = sizeOf * newCapacity; newPointer = UnsafeUtility.Malloc(bytesToMalloc, alignOf, allocator); if (m_capacity > 0) { var itemsToCopy = newCapacity < m_capacity ? newCapacity : m_capacity; var bytesToCopy = itemsToCopy * sizeOf; UnsafeUtility.MemCpy(newPointer, m_pointer, bytesToCopy); } } if (m_capacity > 0) { UnsafeUtility.Free(m_pointer, allocator); } m_pointer = newPointer; m_capacity = newCapacity; if (m_size > m_capacity) { m_size = m_capacity; } }