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)); } }
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); }
internal bool TryGetBuffer(out BufferSpan span) { return(TryGetBuffer(end: default(ReadCursor), span: out span)); }