Skip to content

Commit 4fe1abe

Browse files
committed
Moves SpanSplitEnumeratorMode outside of enumerator
1 parent 5d9feb7 commit 4fe1abe

File tree

1 file changed

+25
-27
lines changed

1 file changed

+25
-27
lines changed

src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.Split.cs

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)