@@ -16,27 +16,26 @@ public static SpanSplitEnumerator<T> SplitAny<T>(this ReadOnlySpan<T> source, [S
1616 public static SpanSplitEnumerator < T > SplitAny < T > ( this ReadOnlySpan < T > source , SearchValues < T > separators )
1717 where T : IEquatable < T > => new SpanSplitEnumerator < T > ( source , separators ) ;
1818
19- public ref struct SpanSplitEnumerator < T > where T : IEquatable < T >
19+ private enum SpanSplitEnumeratorMode
2020 {
21- private enum SplitMode
22- {
23- None = 0 ,
24- SingleToken ,
25- Sequence ,
26- Any ,
27- SearchValues
28- }
21+ None = 0 ,
22+ SingleToken ,
23+ Sequence ,
24+ EmptySequence ,
25+ Any ,
26+ SearchValues
27+ }
2928
29+ public ref struct SpanSplitEnumerator < T > where T : IEquatable < T >
30+ {
3031 private readonly ReadOnlySpan < T > _span ;
3132
3233 private readonly T _separator = default ! ;
3334 private readonly ReadOnlySpan < T > _separatorBuffer ;
3435 private readonly SearchValues < T > _searchValues = default ! ;
3536
3637 private readonly int _separatorLength ;
37- private readonly SplitMode _splitMode ;
38-
39- private readonly bool _isInitialized = true ;
38+ private readonly SpanSplitEnumeratorMode _splitMode ;
4039
4140 private int _startCurrent = 0 ;
4241 private int _endCurrent = 0 ;
@@ -49,54 +48,53 @@ private enum SplitMode
4948 internal SpanSplitEnumerator ( ReadOnlySpan < T > span , SearchValues < T > searchValues )
5049 {
5150 _span = span ;
52- _separatorLength = 1 ;
53- _splitMode = SplitMode . SearchValues ;
51+ _splitMode = SpanSplitEnumeratorMode . SearchValues ;
5452 _searchValues = searchValues ;
5553 }
5654
5755 internal SpanSplitEnumerator ( ReadOnlySpan < T > span , ReadOnlySpan < T > separator , bool treatAsSingleSeparator )
5856 {
5957 _span = span ;
6058 _separatorBuffer = separator ;
61- _separatorLength = ( _separatorBuffer . Length , treatAsSingleSeparator ) switch
59+ _splitMode = ( separator . Length , treatAsSingleSeparator ) switch
6260 {
63- ( 0 , true ) or ( _, false ) => 1 ,
64- _ => separator . Length
61+ ( 0 , true ) => SpanSplitEnumeratorMode . EmptySequence ,
62+ ( _, true ) => SpanSplitEnumeratorMode . Sequence ,
63+ _ => SpanSplitEnumeratorMode . Any
6564 } ;
66- _splitMode = treatAsSingleSeparator ? SplitMode . Sequence : SplitMode . Any ;
6765 }
6866
6967 internal SpanSplitEnumerator ( ReadOnlySpan < T > span , T separator )
7068 {
7169 _span = span ;
7270 _separator = separator ;
73- _separatorLength = 1 ;
74- _splitMode = SplitMode . SingleToken ;
71+ _splitMode = SpanSplitEnumeratorMode . SingleToken ;
7572 }
7673
7774 public bool MoveNext ( )
7875 {
79- if ( ! _isInitialized || _startNext > _span . Length )
76+ if ( _splitMode is SpanSplitEnumeratorMode . None || _startNext > _span . Length )
8077 {
8178 return false ;
8279 }
8380
8481 ReadOnlySpan < T > slice = _span [ _startNext ..] ;
8582
86- int separatorIndex = _splitMode switch
83+ ( int separatorIndex , int separatorLength ) = _splitMode switch
8784 {
88- SplitMode . SingleToken => slice . IndexOf ( _separator ) ,
89- SplitMode . Sequence => slice . IndexOf ( _separatorBuffer ) ,
90- SplitMode . Any => slice . IndexOfAny ( _separatorBuffer ) ,
91- SplitMode . SearchValues => _searchValues . IndexOfAny ( _span ) ,
85+ SpanSplitEnumeratorMode . SingleToken => ( slice . IndexOf ( _separator ) , 1 ) ,
86+ SpanSplitEnumeratorMode . Sequence => ( slice . IndexOf ( _separatorBuffer ) , _separatorBuffer . Length ) ,
87+ SpanSplitEnumeratorMode . EmptySequence => ( slice . IndexOf ( _separatorBuffer ) , 1 ) ,
88+ SpanSplitEnumeratorMode . Any => ( slice . IndexOfAny ( _separatorBuffer ) , 1 ) ,
89+ SpanSplitEnumeratorMode . SearchValues => ( _searchValues . IndexOfAny ( _span ) , 1 ) ,
9290 _ => throw new UnreachableException ( )
9391 } ;
9492
9593 int elementLength = ( separatorIndex != - 1 ? separatorIndex : slice . Length ) ;
9694
9795 _startCurrent = _startNext ;
9896 _endCurrent = _startCurrent + elementLength ;
99- _startNext = _endCurrent + _separatorLength ;
97+ _startNext = _endCurrent + separatorLength ;
10098 return true ;
10199 }
102100 }
0 commit comments