public ArraySegment <byte> Available(int minimumSize)
        {
            if (Buffer.Count == 0 && Buffer.Offset != 0)
            {
                Buffer = new ArraySegment <byte>(Buffer.Array, 0, 0);
            }

            var availableSize = Buffer.Array.Length - Buffer.Offset - Buffer.Count;

            if (availableSize < minimumSize)
            {
                if (availableSize + Buffer.Offset >= minimumSize)
                {
                    Array.Copy(Buffer.Array, Buffer.Offset, Buffer.Array, 0, Buffer.Count);
                    if (Buffer.Count != 0)
                    {
                        Buffer = new ArraySegment <byte>(Buffer.Array, 0, Buffer.Count);
                    }
                    availableSize = Buffer.Array.Length - Buffer.Offset - Buffer.Count;
                }
                else
                {
                    var largerSize = Buffer.Array.Length + Math.Max(Buffer.Array.Length, minimumSize);
                    var larger     = new ArraySegment <byte>(_memory.AllocByte(largerSize), 0, Buffer.Count);
                    if (Buffer.Count != 0)
                    {
                        Array.Copy(Buffer.Array, Buffer.Offset, larger.Array, 0, Buffer.Count);
                    }
                    _memory.FreeByte(Buffer.Array);
                    Buffer        = larger;
                    availableSize = Buffer.Array.Length - Buffer.Offset - Buffer.Count;
                }
            }
            return(new ArraySegment <byte>(Buffer.Array, Buffer.Offset + Buffer.Count, availableSize));
        }
Example #2
0
        private void Grow(int minimumAvailable)
        {
            if (_dataArray.Length - _dataEnd >= minimumAvailable)
            {
                return;
            }

            var newLength = _dataArray.Length + Math.Max(_dataArray.Length, minimumAvailable);
            var newArray  = _memory.AllocByte(newLength);

            Array.Copy(_dataArray, 0, newArray, 0, _dataEnd);
            _memory.FreeByte(_dataArray);
            _dataArray = newArray;
        }