Ejemplo n.º 1
0
        public T[] Rent(int minSize)
        {
            if (minSize < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(minSize));
            }

            if (minSize == 0)
            {
                return(Emptry);
            }

            var bucketIdx = BucketHelper.GetBucketIndex(minSize);

            if (bucketIdx < 0)
            {
                return(new T[minSize]);
            }

            var buff       = _buckets[bucketIdx];
            var returnBuff = buff.TryPop();

            if (returnBuff != null)
            {
                return(returnBuff);
            }

            return(new T[minSize]);
        }
Ejemplo n.º 2
0
        public ArrayPool()
        {
            _buckets = new SlotBuff[BucketHelper.BucketCount];
            for (var i = 0; i < BucketHelper.BucketCount; ++i)
            {
                var maxSlotSize = BucketHelper.GetMaxSizeForBucket(i);

                var slotBuff = new SlotBuff();
                _buckets[i] = slotBuff;

                for (var j = 0; j < SLOT_COUNT; ++j)
                {
                    if (!slotBuff.TryPush(new T[maxSlotSize]))
                    {
                        throw new InvalidOperationException();
                    }
                }
            }
        }
Ejemplo n.º 3
0
        public void Return(T[] buff)
        {
            if (buff == null)
            {
                throw new ArgumentNullException(nameof(buff));
            }

            if (buff.Length == 0)
            {
                return;
            }

            var bucketIndex = BucketHelper.GetBucketIndex(buff.Length);

            if (bucketIndex < 0)
            {
                return;
            }

            var buffer = _buckets[bucketIndex];

            buffer.TryPush(buff);
        }