Пример #1
0
        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;
        }
Пример #2
0
        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;
            }
        }