Exemplo n.º 1
0
        internal bool TryGetBuffer(ReadCursor end, out BufferSpan span)
        {
            if (IsDefault)
            {
                span = default(BufferSpan);
                return(false);
            }

            var segment = _segment;
            var index   = _index;

            if (end.Segment == segment)
            {
                var following = end.Index - index;

                if (following > 0)
                {
                    span = new BufferSpan(segment, index, following);

                    _index = index + following;
                    return(true);
                }

                span = default(BufferSpan);
                return(false);
            }
            else
            {
                return(TryGetBufferMultiBlock(end, out span));
            }
        }
Exemplo n.º 2
0
        internal bool TryGetBuffer(ReadCursor end, out BufferSpan span)
        {
            span = default(BufferSpan);

            if (IsDefault)
            {
                return(false);
            }

            var segment = _segment;
            var index   = _index;

            // Determine if we might attempt to copy data from segment.Next before
            // calculating "following" so we don't risk skipping data that could
            // be added after segment.End when we decide to copy from segment.Next.
            // segment.End will always be advanced before segment.Next is set.

            int following = 0;

            while (true)
            {
                var wasLastBlock = segment.Next == null || end.Segment == segment;

                if (end.Segment == segment)
                {
                    following = end.Index - index;
                }
                else
                {
                    following = segment.End - index;
                }

                if (following > 0)
                {
                    break;
                }

                if (wasLastBlock)
                {
                    return(false);
                }
                else
                {
                    segment = segment.Next;
                    index   = segment.Start;
                }
            }

            span = new BufferSpan(segment, index, following);

            _segment = segment;
            _index   = index + following;
            return(true);
        }
Exemplo n.º 3
0
 internal bool TryGetBuffer(out BufferSpan span)
 {
     return(TryGetBuffer(end: default(ReadCursor), span: out span));
 }