private ArraySegment GetWritableBuffer()

in src/RecyclableMemoryStream.cs [696:730]


        private ArraySegment<byte> GetWritableBuffer(int sizeHint)
        {
            this.CheckDisposed();
            if (sizeHint < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(sizeHint), $"{nameof(sizeHint)} must be non-negative.");
            }

            var minimumBufferSize = Math.Max(sizeHint, 1);

            this.EnsureCapacity(this.position + minimumBufferSize);
            if (this.bufferWriterTempBuffer != null)
            {
                this.ReturnTempBuffer(this.bufferWriterTempBuffer);
                this.bufferWriterTempBuffer = null;
            }

            if (this.largeBuffer != null)
            {
                return new ArraySegment<byte>(this.largeBuffer, (int)this.position, this.largeBuffer.Length - (int)this.position);
            }

            BlockAndOffset blockAndOffset = this.GetBlockAndRelativeOffset(this.position);
            int remainingBytesInBlock = this.MemoryManager.BlockSize - blockAndOffset.Offset;
            if (remainingBytesInBlock >= minimumBufferSize)
            {
                return new ArraySegment<byte>(this.blocks[blockAndOffset.Block], blockAndOffset.Offset, this.MemoryManager.BlockSize - blockAndOffset.Offset);
            }

            this.bufferWriterTempBuffer = minimumBufferSize > this.memoryManager.BlockSize ?
                this.memoryManager.GetLargeBuffer(minimumBufferSize, this.id, this.tag) :
                this.memoryManager.GetBlock();

            return new ArraySegment<byte>(this.bufferWriterTempBuffer);
        }