Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ReadOnlySequence.cs
Go to the documentation of this file.
6
7namespace System.Buffers;
8
9[DebuggerTypeProxy(typeof(ReadOnlySequenceDebugView<>))]
10[DebuggerDisplay("{ToString(),raw}")]
11public readonly struct ReadOnlySequence<T>
12{
13 public struct Enumerator
14 {
16
18
20
22
23 public Enumerator(in ReadOnlySequence<T> sequence)
24 {
26 _next = sequence.Start;
27 _sequence = sequence;
28 }
29
30 public bool MoveNext()
31 {
32 if (_next.GetObject() == null)
33 {
34 return false;
35 }
36 return _sequence.TryGet(ref _next, out _currentMemory);
37 }
38 }
39
40 private enum SequenceType
41 {
42 MultiSegment,
43 Array,
44 MemoryManager,
45 String,
46 Empty
47 }
48
49 private readonly object _startObject;
50
51 private readonly object _endObject;
52
53 private readonly int _startInteger;
54
55 private readonly int _endInteger;
56
57 public static readonly ReadOnlySequence<T> Empty = new ReadOnlySequence<T>(Array.Empty<T>());
58
59 public long Length => GetLength();
60
61 public bool IsEmpty => Length == 0;
62
63 public bool IsSingleSegment
64 {
65 [MethodImpl(MethodImplOptions.AggressiveInlining)]
66 get
67 {
68 return _startObject == _endObject;
69 }
70 }
71
73
75
77 {
78 [MethodImpl(MethodImplOptions.AggressiveInlining)]
79 get
80 {
82 }
83 }
84
86 {
87 [MethodImpl(MethodImplOptions.AggressiveInlining)]
88 get
89 {
91 }
92 }
93
94 [MethodImpl(MethodImplOptions.AggressiveInlining)]
95 private ReadOnlySequence(object startSegment, int startIndexAndFlags, object endSegment, int endIndexAndFlags)
96 {
99 _startInteger = startIndexAndFlags;
100 _endInteger = endIndexAndFlags;
101 }
102
114
116 {
117 if (array == null)
118 {
119 System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.array);
120 }
123 _startInteger = 0;
125 }
126
127 public ReadOnlySequence(T[] array, int start, int length)
128 {
129 if (array == null || (uint)start > (uint)array.Length || (uint)length > (uint)(array.Length - start))
130 {
132 }
137 }
138
140 {
141 ArraySegment<T> segment;
142 if (MemoryMarshal.TryGetMemoryManager<T, MemoryManager<T>>(memory, out MemoryManager<T> manager, out int start, out int length))
143 {
148 }
149 else if (MemoryMarshal.TryGetArray(memory, out segment))
150 {
151 T[] array = segment.Array;
152 int offset = segment.Offset;
157 }
158 else if (typeof(T) == typeof(char))
159 {
160 if (!MemoryMarshal.TryGetString((ReadOnlyMemory<char>)(object)memory, out string text, out int start2, out length))
161 {
163 }
168 }
169 else
170 {
172 _startObject = null;
173 _endObject = null;
174 _startInteger = 0;
175 _endInteger = 0;
176 }
177 }
178
180 {
181 if (start < 0 || length < 0)
182 {
184 }
187 object startObject = _startObject;
188 object endObject = _endObject;
189 SequencePosition start2;
191 if (startObject != endObject)
192 {
193 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)startObject;
194 int num = readOnlySequenceSegment.Memory.Length - index;
195 if (num > start)
196 {
197 index += (int)start;
198 start2 = new SequencePosition(startObject, index);
199 end = GetEndPosition(readOnlySequenceSegment, startObject, index, endObject, index2, length);
200 }
201 else
202 {
203 if (num < 0)
204 {
206 }
207 start2 = SeekMultiSegment(readOnlySequenceSegment.Next, endObject, index2, start - num, System.ExceptionArgument.start);
208 int integer = start2.GetInteger();
209 object @object = start2.GetObject();
210 if (@object != endObject)
211 {
212 end = GetEndPosition((ReadOnlySequenceSegment<T>)@object, @object, integer, endObject, index2, length);
213 }
214 else
215 {
216 if (index2 - integer < length)
217 {
219 }
220 end = new SequencePosition(@object, integer + (int)length);
221 }
222 }
223 }
224 else
225 {
226 if (index2 - index < start)
227 {
229 }
230 index += (int)start;
231 start2 = new SequencePosition(startObject, index);
232 if (index2 - index < length)
233 {
235 }
236 end = new SequencePosition(startObject, index + (int)length);
237 }
238 return SliceImpl(in start2, in end);
239 }
240
242 {
243 if (start < 0)
244 {
246 }
247 uint index = (uint)GetIndex(_startInteger);
248 object startObject = _startObject;
249 uint index2 = (uint)GetIndex(_endInteger);
250 object endObject = _endObject;
251 uint num = (uint)end.GetInteger();
252 object obj = end.GetObject();
253 if (obj == null)
254 {
256 num = index;
257 }
258 if (startObject == endObject)
259 {
260 if (!InRange(num, index, index2))
261 {
263 }
264 if (num - index < start)
265 {
267 }
268 }
269 else
270 {
271 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)startObject;
272 ulong num2 = (ulong)(readOnlySequenceSegment.RunningIndex + index);
273 ulong num3 = (ulong)(((ReadOnlySequenceSegment<T>)obj).RunningIndex + num);
274 if (!InRange(num3, num2, (ulong)(((ReadOnlySequenceSegment<T>)endObject).RunningIndex + index2)))
275 {
277 }
278 if ((ulong)((long)num2 + start) > num3)
279 {
281 }
282 int num4 = readOnlySequenceSegment.Memory.Length - (int)index;
283 if (num4 <= start)
284 {
285 if (num4 < 0)
286 {
288 }
289 SequencePosition start2 = SeekMultiSegment(readOnlySequenceSegment.Next, obj, (int)num, start - num4, System.ExceptionArgument.start);
290 return SliceImpl(in start2, in end);
291 }
292 }
293 SequencePosition start3 = new SequencePosition(startObject, (int)index + (int)start);
294 SequencePosition end2 = new SequencePosition(obj, (int)num);
295 return SliceImpl(in start3, in end2);
296 }
297
299 {
300 uint index = (uint)GetIndex(_startInteger);
301 object startObject = _startObject;
302 uint index2 = (uint)GetIndex(_endInteger);
303 object endObject = _endObject;
304 uint num = (uint)start.GetInteger();
305 object obj = start.GetObject();
306 if (obj == null)
307 {
308 num = index;
310 }
311 if (startObject == endObject)
312 {
313 if (!InRange(num, index, index2))
314 {
316 }
317 if (length < 0)
318 {
320 }
321 if (index2 - num < length)
322 {
324 }
325 }
326 else
327 {
329 ulong num2 = (ulong)(readOnlySequenceSegment.RunningIndex + num);
330 ulong start2 = (ulong)(((ReadOnlySequenceSegment<T>)startObject).RunningIndex + index);
331 ulong num3 = (ulong)(((ReadOnlySequenceSegment<T>)endObject).RunningIndex + index2);
332 if (!InRange(num2, start2, num3))
333 {
335 }
336 if (length < 0)
337 {
339 }
340 if ((ulong)((long)num2 + length) > num3)
341 {
343 }
344 int num4 = readOnlySequenceSegment.Memory.Length - (int)num;
345 if (num4 < length)
346 {
347 if (num4 < 0)
348 {
350 }
351 SequencePosition end = SeekMultiSegment(readOnlySequenceSegment.Next, endObject, (int)index2, length - num4, System.ExceptionArgument.length);
352 return SliceImpl(in start, in end);
353 }
354 }
355 SequencePosition start3 = new SequencePosition(obj, (int)num);
356 SequencePosition end2 = new SequencePosition(obj, (int)num + (int)length);
357 return SliceImpl(in start3, in end2);
358 }
359
361 {
362 return Slice((long)start, (long)length);
363 }
364
366 {
367 return Slice((long)start, end);
368 }
369
371 {
372 return Slice(start, (long)length);
373 }
374
375 [MethodImpl(MethodImplOptions.AggressiveInlining)]
377 {
378 BoundsCheck((uint)start.GetInteger(), start.GetObject(), (uint)end.GetInteger(), end.GetObject());
379 return SliceImpl(in start, in end);
380 }
381
382 [MethodImpl(MethodImplOptions.AggressiveInlining)]
384 {
385 bool flag = start.GetObject() != null;
386 BoundsCheck(in start, flag);
387 SequencePosition start2 = (flag ? start : Start);
388 return SliceImpl(in start2);
389 }
390
392 {
393 if (start < 0)
394 {
396 }
397 if (start == 0L)
398 {
399 return this;
400 }
401 SequencePosition start2 = Seek(start, System.ExceptionArgument.start);
402 return SliceImpl(in start2);
403 }
404
405 public override string ToString()
406 {
407 if (typeof(T) == typeof(char))
408 {
411 if (state.TryGetString(out var text, out var start, out var length))
412 {
413 return text.Substring(start, length);
414 }
415 if (Length < int.MaxValue)
416 {
417 return string.Create((int)Length, state, delegate(Span<char> span, ReadOnlySequence<char> sequence)
418 {
419 sequence.CopyTo(span);
420 });
421 }
422 }
423 return $"System.Buffers.ReadOnlySequence<{typeof(T).Name}>[{Length}]";
424 }
425
427 {
428 return new Enumerator(in this);
429 }
430
432 {
433 if (offset < 0)
434 {
436 }
437 return Seek(offset);
438 }
439
440 public long GetOffset(SequencePosition position)
441 {
442 object obj = position.GetObject();
443 bool flag = obj == null;
444 BoundsCheck(in position, !flag);
445 object startObject = _startObject;
446 object endObject = _endObject;
447 uint num = (uint)position.GetInteger();
448 if (flag)
449 {
451 num = (uint)GetIndex(_startInteger);
452 }
453 if (startObject == endObject)
454 {
455 return num;
456 }
458 {
460 }
461 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)startObject;
462 while (readOnlySequenceSegment != null && readOnlySequenceSegment != obj)
463 {
464 readOnlySequenceSegment = readOnlySequenceSegment.Next;
465 }
466 if (readOnlySequenceSegment == null)
467 {
469 }
470 return readOnlySequenceSegment.RunningIndex + num;
471 }
472
474 {
475 if (offset < 0)
476 {
478 }
479 return Seek(in origin, offset);
480 }
481
482 public bool TryGet(ref SequencePosition position, out ReadOnlyMemory<T> memory, bool advance = true)
483 {
484 SequencePosition next;
485 bool result = TryGetBuffer(in position, out memory, out next);
486 if (advance)
487 {
488 position = next;
489 }
490 return result;
491 }
492
493 [MethodImpl(MethodImplOptions.AggressiveInlining)]
494 internal bool TryGetBuffer(in SequencePosition position, out ReadOnlyMemory<T> memory, out SequencePosition next)
495 {
496 object @object = position.GetObject();
497 next = default(SequencePosition);
498 if (@object == null)
499 {
500 memory = default(ReadOnlyMemory<T>);
501 return false;
502 }
503 SequenceType sequenceType = GetSequenceType();
504 object endObject = _endObject;
505 int integer = position.GetInteger();
507 if (sequenceType == SequenceType.MultiSegment)
508 {
509 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)@object;
510 if (readOnlySequenceSegment != endObject)
511 {
512 ReadOnlySequenceSegment<T> next2 = readOnlySequenceSegment.Next;
513 if (next2 == null)
514 {
516 }
517 next = new SequencePosition(next2, 0);
518 memory = readOnlySequenceSegment.Memory.Slice(integer);
519 }
520 else
521 {
522 memory = readOnlySequenceSegment.Memory.Slice(integer, index - integer);
523 }
524 }
525 else
526 {
527 if (@object != endObject)
528 {
530 }
531 if (sequenceType == SequenceType.Array)
532 {
533 memory = new ReadOnlyMemory<T>((T[])@object, integer, index - integer);
534 }
535 else if (typeof(T) == typeof(char) && sequenceType == SequenceType.String)
536 {
537 memory = (ReadOnlyMemory<T>)(object)((string)@object).AsMemory(integer, index - integer);
538 }
539 else
540 {
541 memory = ((MemoryManager<T>)@object).Memory.Slice(integer, index - integer);
542 }
543 }
544 return true;
545 }
546
547 [MethodImpl(MethodImplOptions.AggressiveInlining)]
549 {
550 object startObject = _startObject;
551 if (startObject == null)
552 {
553 return default(ReadOnlyMemory<T>);
554 }
555 int startInteger = _startInteger;
556 int endInteger = _endInteger;
557 bool flag = startObject != _endObject;
558 if ((startInteger | endInteger) >= 0)
559 {
560 ReadOnlyMemory<T> memory = ((ReadOnlySequenceSegment<T>)startObject).Memory;
561 if (flag)
562 {
563 return memory.Slice(startInteger);
564 }
565 return memory.Slice(startInteger, endInteger - startInteger);
566 }
567 return GetFirstBufferSlow(startObject, flag);
568 }
569
570 [MethodImpl(MethodImplOptions.NoInlining)]
571 private ReadOnlyMemory<T> GetFirstBufferSlow(object startObject, bool isMultiSegment)
572 {
573 if (isMultiSegment)
574 {
576 }
577 int startInteger = _startInteger;
578 int endInteger = _endInteger;
579 if (startInteger >= 0)
580 {
581 return new ReadOnlyMemory<T>((T[])startObject, startInteger, (endInteger & 0x7FFFFFFF) - startInteger);
582 }
583 if (typeof(T) == typeof(char) && endInteger < 0)
584 {
585 return (ReadOnlyMemory<T>)(object)((string)startObject).AsMemory(startInteger & 0x7FFFFFFF, endInteger - startInteger);
586 }
587 startInteger &= 0x7FFFFFFF;
588 return ((MemoryManager<T>)startObject).Memory.Slice(startInteger, endInteger - startInteger);
589 }
590
591 [MethodImpl(MethodImplOptions.AggressiveInlining)]
593 {
594 object startObject = _startObject;
595 if (startObject == null)
596 {
597 return default(ReadOnlySpan<T>);
598 }
599 int startInteger = _startInteger;
600 int endInteger = _endInteger;
601 bool flag = startObject != _endObject;
602 if ((startInteger | endInteger) >= 0)
603 {
604 ReadOnlySpan<T> span = ((ReadOnlySequenceSegment<T>)startObject).Memory.Span;
605 if (flag)
606 {
607 return span.Slice(startInteger);
608 }
609 return span.Slice(startInteger, endInteger - startInteger);
610 }
611 return GetFirstSpanSlow(startObject, flag);
612 }
613
614 [MethodImpl(MethodImplOptions.NoInlining)]
615 private ReadOnlySpan<T> GetFirstSpanSlow(object startObject, bool isMultiSegment)
616 {
617 if (isMultiSegment)
618 {
620 }
621 int startInteger = _startInteger;
622 int endInteger = _endInteger;
623 if (startInteger >= 0)
624 {
625 return ((ReadOnlySpan<T>)(T[])startObject).Slice(startInteger, (endInteger & 0x7FFFFFFF) - startInteger);
626 }
627 if (typeof(T) == typeof(char) && endInteger < 0)
628 {
629 return ((ReadOnlyMemory<T>)(object)((string)startObject).AsMemory()).Span.Slice(startInteger & 0x7FFFFFFF, endInteger - startInteger);
630 }
631 startInteger &= 0x7FFFFFFF;
632 return ((MemoryManager<T>)startObject).Memory.Span.Slice(startInteger, endInteger - startInteger);
633 }
634
635 [MethodImpl(MethodImplOptions.AggressiveInlining)]
636 internal SequencePosition Seek(long offset, System.ExceptionArgument exceptionArgument = System.ExceptionArgument.offset)
637 {
638 object startObject = _startObject;
639 object endObject = _endObject;
642 if (startObject != endObject)
643 {
644 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)startObject;
645 int num = readOnlySequenceSegment.Memory.Length - index;
646 if (num <= offset && offset != 0L)
647 {
648 if (num < 0)
649 {
651 }
652 return SeekMultiSegment(readOnlySequenceSegment.Next, endObject, index2, offset - num, exceptionArgument);
653 }
654 }
655 else if (index2 - index < offset)
656 {
658 }
659 return new SequencePosition(startObject, index + (int)offset);
660 }
661
662 [MethodImpl(MethodImplOptions.AggressiveInlining)]
664 {
665 object @object = start.GetObject();
666 object endObject = _endObject;
667 int integer = start.GetInteger();
669 if (@object != endObject)
670 {
671 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)@object;
672 int num = readOnlySequenceSegment.Memory.Length - integer;
673 if (num <= offset)
674 {
675 if (num < 0)
676 {
678 }
679 return SeekMultiSegment(readOnlySequenceSegment.Next, endObject, index, offset - num, System.ExceptionArgument.offset);
680 }
681 }
682 else if (index - integer < offset)
683 {
685 }
686 return new SequencePosition(@object, integer + (int)offset);
687 }
688
689 [MethodImpl(MethodImplOptions.NoInlining)]
690 private static SequencePosition SeekMultiSegment(ReadOnlySequenceSegment<T> currentSegment, object endObject, int endIndex, long offset, System.ExceptionArgument argument)
691 {
692 while (true)
693 {
694 if (currentSegment != null && currentSegment != endObject)
695 {
696 int length = currentSegment.Memory.Length;
697 if (length > offset)
698 {
699 break;
700 }
701 offset -= length;
702 currentSegment = currentSegment.Next;
703 continue;
704 }
705 if (currentSegment == null || endIndex < offset)
706 {
708 }
709 break;
710 }
711 return new SequencePosition(currentSegment, (int)offset);
712 }
713
714 private void BoundsCheck(in SequencePosition position, bool positionIsNotNull)
715 {
716 uint integer = (uint)position.GetInteger();
717 object startObject = _startObject;
718 object endObject = _endObject;
719 uint index = (uint)GetIndex(_startInteger);
720 uint index2 = (uint)GetIndex(_endInteger);
721 if (startObject == endObject)
722 {
723 if (!InRange(integer, index, index2))
724 {
726 }
727 return;
728 }
729 ulong start = (ulong)(((ReadOnlySequenceSegment<T>)startObject).RunningIndex + index);
730 long num = 0L;
731 if (positionIsNotNull)
732 {
733 num = ((ReadOnlySequenceSegment<T>)position.GetObject()).RunningIndex;
734 }
735 if (!InRange((ulong)(num + integer), start, (ulong)(((ReadOnlySequenceSegment<T>)endObject).RunningIndex + index2)))
736 {
738 }
739 }
740
741 private void BoundsCheck(uint sliceStartIndex, object sliceStartObject, uint sliceEndIndex, object sliceEndObject)
742 {
743 object startObject = _startObject;
744 object endObject = _endObject;
745 uint index = (uint)GetIndex(_startInteger);
746 uint index2 = (uint)GetIndex(_endInteger);
747 if (startObject == endObject)
748 {
749 if (sliceStartObject != sliceEndObject || sliceStartObject != startObject || sliceStartIndex > sliceEndIndex || sliceStartIndex < index || sliceEndIndex > index2)
750 {
752 }
753 return;
754 }
755 ulong num = sliceStartIndex;
756 ulong num2 = sliceEndIndex;
757 if (sliceStartObject != null)
758 {
759 num += (ulong)((ReadOnlySequenceSegment<T>)sliceStartObject).RunningIndex;
760 }
761 if (sliceEndObject != null)
762 {
763 num2 += (ulong)((ReadOnlySequenceSegment<T>)sliceEndObject).RunningIndex;
764 }
765 if (num > num2)
766 {
768 }
769 if (num < (ulong)(((ReadOnlySequenceSegment<T>)startObject).RunningIndex + index) || num2 > (ulong)(((ReadOnlySequenceSegment<T>)endObject).RunningIndex + index2))
770 {
772 }
773 }
774
775 private static SequencePosition GetEndPosition(ReadOnlySequenceSegment<T> startSegment, object startObject, int startIndex, object endObject, int endIndex, long length)
776 {
777 int num = startSegment.Memory.Length - startIndex;
778 if (num > length)
779 {
780 return new SequencePosition(startObject, startIndex + (int)length);
781 }
782 if (num < 0)
783 {
785 }
786 return SeekMultiSegment(startSegment.Next, endObject, endIndex, length - num, System.ExceptionArgument.length);
787 }
788
789 [MethodImpl(MethodImplOptions.AggressiveInlining)]
791 {
792 return (SequenceType)(-(2 * (_startInteger >> 31) + (_endInteger >> 31)));
793 }
794
795 [MethodImpl(MethodImplOptions.AggressiveInlining)]
796 private static int GetIndex(int Integer)
797 {
798 return Integer & 0x7FFFFFFF;
799 }
800
801 [MethodImpl(MethodImplOptions.AggressiveInlining)]
803 {
804 return new ReadOnlySequence<T>(start.GetObject(), start.GetInteger() | (_startInteger & int.MinValue), end.GetObject(), end.GetInteger() | (_endInteger & int.MinValue));
805 }
806
807 [MethodImpl(MethodImplOptions.AggressiveInlining)]
809 {
810 return new ReadOnlySequence<T>(start.GetObject(), start.GetInteger() | (_startInteger & int.MinValue), _endObject, _endInteger);
811 }
812
813 [MethodImpl(MethodImplOptions.AggressiveInlining)]
814 private long GetLength()
815 {
816 object startObject = _startObject;
817 object endObject = _endObject;
820 if (startObject != endObject)
821 {
822 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)startObject;
823 ReadOnlySequenceSegment<T> readOnlySequenceSegment2 = (ReadOnlySequenceSegment<T>)endObject;
824 return readOnlySequenceSegment2.RunningIndex + index2 - (readOnlySequenceSegment.RunningIndex + index);
825 }
826 return index2 - index;
827 }
828
829 internal bool TryGetReadOnlySequenceSegment([NotNullWhen(true)] out ReadOnlySequenceSegment<T> startSegment, out int startIndex, [NotNullWhen(true)] out ReadOnlySequenceSegment<T> endSegment, out int endIndex)
830 {
831 object startObject = _startObject;
832 if (startObject == null || GetSequenceType() != 0)
833 {
834 startSegment = null;
835 startIndex = 0;
836 endSegment = null;
837 endIndex = 0;
838 return false;
839 }
844 return true;
845 }
846
847 internal bool TryGetArray(out ArraySegment<T> segment)
848 {
849 if (GetSequenceType() != SequenceType.Array)
850 {
851 segment = default(ArraySegment<T>);
852 return false;
853 }
856 return true;
857 }
858
859 internal bool TryGetString([NotNullWhen(true)] out string text, out int start, out int length)
860 {
861 if (typeof(T) != typeof(char) || GetSequenceType() != SequenceType.String)
862 {
863 start = 0;
864 length = 0;
865 text = null;
866 return false;
867 }
871 return true;
872 }
873
874 private static bool InRange(uint value, uint start, uint end)
875 {
876 return value - start <= end - start;
877 }
878
879 private static bool InRange(ulong value, ulong start, ulong end)
880 {
881 return value - start <= end - start;
882 }
883
884 [MethodImpl(MethodImplOptions.AggressiveInlining)]
885 internal void GetFirstSpan(out ReadOnlySpan<T> first, out SequencePosition next)
886 {
887 first = default(ReadOnlySpan<T>);
888 next = default(SequencePosition);
889 object startObject = _startObject;
890 int startInteger = _startInteger;
891 if (startObject == null)
892 {
893 return;
894 }
895 bool flag = startObject != _endObject;
896 int endInteger = _endInteger;
897 if (startInteger >= 0)
898 {
899 if (endInteger >= 0)
900 {
901 ReadOnlySequenceSegment<T> readOnlySequenceSegment = (ReadOnlySequenceSegment<T>)startObject;
902 first = readOnlySequenceSegment.Memory.Span;
903 if (flag)
904 {
905 first = first.Slice(startInteger);
906 next = new SequencePosition(readOnlySequenceSegment.Next, 0);
907 }
908 else
909 {
910 first = first.Slice(startInteger, endInteger - startInteger);
911 }
912 }
913 else
914 {
915 if (flag)
916 {
918 }
919 first = new ReadOnlySpan<T>((T[])startObject, startInteger, (endInteger & 0x7FFFFFFF) - startInteger);
920 }
921 }
922 else
923 {
924 first = GetFirstSpanSlow(startObject, startInteger, endInteger, flag);
925 }
926 }
927
928 [MethodImpl(MethodImplOptions.NoInlining)]
929 private static ReadOnlySpan<T> GetFirstSpanSlow(object startObject, int startIndex, int endIndex, bool hasMultipleSegments)
930 {
931 if (hasMultipleSegments)
932 {
934 }
935 if (typeof(T) == typeof(char) && endIndex < 0)
936 {
937 ReadOnlySpan<char> span = ((string)startObject).AsSpan(startIndex & 0x7FFFFFFF, endIndex - startIndex);
938 return MemoryMarshal.CreateReadOnlySpan(ref Internal.Runtime.CompilerServices.Unsafe.As<char, T>(ref MemoryMarshal.GetReference(span)), span.Length);
939 }
940 startIndex &= 0x7FFFFFFF;
941 return ((MemoryManager<T>)startObject).Memory.Span.Slice(startIndex, endIndex - startIndex);
942 }
943}
944internal static class ReadOnlySequence
945{
946 [MethodImpl(MethodImplOptions.AggressiveInlining)]
947 public static int ArrayToSequenceEnd(int endIndex)
948 {
949 return endIndex | int.MinValue;
950 }
951
952 [MethodImpl(MethodImplOptions.AggressiveInlining)]
954 {
955 return startIndex | int.MinValue;
956 }
957
958 [MethodImpl(MethodImplOptions.AggressiveInlining)]
959 public static int StringToSequenceStart(int startIndex)
960 {
961 return startIndex | int.MinValue;
962 }
963
964 [MethodImpl(MethodImplOptions.AggressiveInlining)]
965 public static int StringToSequenceEnd(int endIndex)
966 {
967 return endIndex | int.MinValue;
968 }
969}
SequenceType
static bool TryGetString(ReadOnlyMemory< char > memory, [NotNullWhen(true)] out string? text, out int start, out int length)
static void ThrowArgumentOutOfRangeException(System.ExceptionArgument argument)
static void ThrowInvalidOperationException()
static void ThrowArgumentOutOfRangeException_PositionOutOfRange()
static void ThrowArgumentNullException(string name)
static void ThrowStartOrEndArgumentValidationException(long start)
static void ThrowInvalidOperationException_EndPositionNotReached()
static void ThrowArgumentOutOfRangeException_OffsetOutOfRange()
static void ThrowArgumentValidationException(Array array, int start)
Enumerator(in ReadOnlySequence< T > sequence)
readonly ReadOnlySequence< T > _sequence
ReadOnlySequence(ReadOnlySequenceSegment< T > startSegment, int startIndex, ReadOnlySequenceSegment< T > endSegment, int endIndex)
static SequencePosition SeekMultiSegment(ReadOnlySequenceSegment< T > currentSegment, object endObject, int endIndex, long offset, System.ExceptionArgument argument)
bool TryGetReadOnlySequenceSegment([NotNullWhen(true)] out ReadOnlySequenceSegment< T > startSegment, out int startIndex, [NotNullWhen(true)] out ReadOnlySequenceSegment< T > endSegment, out int endIndex)
ReadOnlySequence< T > Slice(int start, int length)
static bool InRange(ulong value, ulong start, ulong end)
ReadOnlySequence< T > Slice(SequencePosition start, int length)
SequencePosition GetPosition(long offset)
bool TryGetString([NotNullWhen(true)] out string text, out int start, out int length)
void BoundsCheck(uint sliceStartIndex, object sliceStartObject, uint sliceEndIndex, object sliceEndObject)
ReadOnlyMemory< T > GetFirstBuffer()
static int StringToSequenceStart(int startIndex)
ReadOnlySequence< T > Slice(long start, long length)
static int MemoryManagerToSequenceStart(int startIndex)
static int ArrayToSequenceEnd(int endIndex)
ReadOnlySequence< T > Slice(SequencePosition start, SequencePosition end)
ReadOnlySequence(object startSegment, int startIndexAndFlags, object endSegment, int endIndexAndFlags)
ReadOnlySequence< T > SliceImpl(in SequencePosition start, in SequencePosition end)
SequencePosition Seek(in SequencePosition start, long offset)
static SequencePosition GetEndPosition(ReadOnlySequenceSegment< T > startSegment, object startObject, int startIndex, object endObject, int endIndex, long length)
static bool InRange(uint value, uint start, uint end)
void GetFirstSpan(out ReadOnlySpan< T > first, out SequencePosition next)
ReadOnlySequence< T > SliceImpl(in SequencePosition start)
static int StringToSequenceEnd(int endIndex)
bool TryGetBuffer(in SequencePosition position, out ReadOnlyMemory< T > memory, out SequencePosition next)
SequencePosition Seek(long offset, System.ExceptionArgument exceptionArgument=System.ExceptionArgument.offset)
long GetOffset(SequencePosition position)
ReadOnlyMemory< T > GetFirstBufferSlow(object startObject, bool isMultiSegment)
ReadOnlySequence< T > Slice(int start, SequencePosition end)
ReadOnlySpan< T > GetFirstSpanSlow(object startObject, bool isMultiSegment)
ReadOnlySequence< T > Slice(SequencePosition start, long length)
ReadOnlySequence< T > Slice(long start)
ReadOnlySequence(ReadOnlyMemory< T > memory)
ReadOnlySequence(T[] array, int start, int length)
static int GetIndex(int Integer)
SequencePosition GetPosition(long offset, SequencePosition origin)
bool TryGet(ref SequencePosition position, out ReadOnlyMemory< T > memory, bool advance=true)
void BoundsCheck(in SequencePosition position, bool positionIsNotNull)
ReadOnlySequence< T > Slice(SequencePosition start)
bool TryGetArray(out ArraySegment< T > segment)
static ReadOnlySpan< T > GetFirstSpanSlow(object startObject, int startIndex, int endIndex, bool hasMultipleSegments)
ReadOnlySequence< T > Slice(long start, SequencePosition end)
Memory< T > Slice(int start)
Definition Memory.cs:194
unsafe Span< T > Span
Definition Memory.cs:28
ReadOnlyMemory< T > Slice(int start)
ReadOnlySpan< T > Slice(int start)