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