Skip to content

Commit 2d377c0

Browse files
committed
fixed edge case when delimiter length is 0
1 parent c9d777d commit 2d377c0

File tree

4 files changed

+17
-9
lines changed

4 files changed

+17
-9
lines changed

src/Enumerators/SplitSequence/SpanSplitSequenceEnumerator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace SpanExtensions.Enumerators
1111
ReadOnlySpan<T> Span;
1212
readonly ReadOnlySpan<T> Delimiter;
1313
readonly int DelimiterLength;
14+
readonly bool DelimiterIsEmpty;
1415
bool EnumerationDone;
1516

1617
/// <summary>
@@ -28,6 +29,7 @@ public SpanSplitSequenceEnumerator(ReadOnlySpan<T> source, ReadOnlySpan<T> delim
2829
Span = source;
2930
Delimiter = delimiter;
3031
DelimiterLength = Delimiter.Length;
32+
DelimiterIsEmpty = Delimiter.IsEmpty;
3133
EnumerationDone = false;
3234
Current = default;
3335
}
@@ -53,7 +55,7 @@ public bool MoveNext()
5355

5456
int delimiterIndex = Span.IndexOf(Delimiter);
5557

56-
if(delimiterIndex == -1)
58+
if(delimiterIndex == -1 || DelimiterIsEmpty)
5759
{
5860
EnumerationDone = true;
5961

src/Enumerators/SplitSequence/SpanSplitSequenceStringSplitOptionsEnumerator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public ref struct SpanSplitSequenceStringSplitOptionsEnumerator
1010
ReadOnlySpan<char> Span;
1111
readonly ReadOnlySpan<char> Delimiter;
1212
readonly int DelimiterLength;
13+
readonly bool DelimiterIsEmpty;
1314
readonly bool TrimEntries;
1415
readonly bool RemoveEmptyEntries;
1516
bool EnumerationDone;
@@ -29,7 +30,8 @@ public SpanSplitSequenceStringSplitOptionsEnumerator(ReadOnlySpan<char> source,
2930
{
3031
Span = source;
3132
Delimiter = delimiter;
32-
DelimiterLength = delimiter.Length;
33+
DelimiterLength = Delimiter.Length;
34+
DelimiterIsEmpty = Delimiter.IsEmpty;
3335
TrimEntries = options.IsTrimEntriesSet();
3436
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
3537
EnumerationDone = false;
@@ -59,7 +61,7 @@ public bool MoveNext()
5961
{
6062
int delimiterIndex = Span.IndexOf(Delimiter);
6163

62-
if(delimiterIndex == -1)
64+
if(delimiterIndex == -1 || DelimiterIsEmpty)
6365
{
6466
EnumerationDone = true;
6567

src/Enumerators/SplitSequence/SpanSplitSequenceStringSplitOptionsWithCountEnumerator.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public ref struct SpanSplitSequenceStringSplitOptionsWithCountEnumerator
1010
ReadOnlySpan<char> Span;
1111
readonly ReadOnlySpan<char> Delimiter;
1212
readonly int DelimiterLength;
13+
readonly bool DelimiterIsEmpty;
1314
readonly bool TrimEntries;
1415
readonly bool RemoveEmptyEntries;
1516
readonly CountExceedingBehaviour CountExceedingBehaviour;
@@ -33,8 +34,9 @@ public SpanSplitSequenceStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char>
3334
{
3435
Span = source;
3536
Delimiter = delimiter;
36-
DelimiterLength = delimiter.Length;
37-
CurrentCount = count.ThrowIfNegative();
37+
DelimiterLength = Delimiter.Length;
38+
DelimiterIsEmpty = Delimiter.IsEmpty;
39+
CurrentCount = DelimiterIsEmpty ? 0 : count.ThrowIfNegative();
3840
TrimEntries = options.IsTrimEntriesSet();
3941
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
4042
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
@@ -100,7 +102,7 @@ public bool MoveNext()
100102
}
101103
else
102104
{
103-
Current = delimiterIndex == -1 || CountExceedingBehaviour.IsIncludeRemainingElements() ? Span : Span[..delimiterIndex];
105+
Current = delimiterIndex == -1 || CountExceedingBehaviour.IsIncludeRemainingElements() || DelimiterIsEmpty ? Span : Span[..delimiterIndex];
104106
}
105107

106108
if(TrimEntries)

src/Enumerators/SplitSequence/SpanSplitSequenceWithCountEnumerator.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace SpanExtensions.Enumerators
1111
ReadOnlySpan<T> Span;
1212
readonly ReadOnlySpan<T> Delimiter;
1313
readonly int DelimiterLength;
14+
readonly bool DelimiterIsEmpty;
1415
readonly CountExceedingBehaviour CountExceedingBehaviour;
1516
int CurrentCount;
1617
bool EnumerationDone;
@@ -31,8 +32,9 @@ public SpanSplitSequenceWithCountEnumerator(ReadOnlySpan<T> source, ReadOnlySpan
3132
{
3233
Span = source;
3334
Delimiter = delimiter;
34-
DelimiterLength = delimiter.Length;
35-
CurrentCount = count.ThrowIfNegative();
35+
DelimiterLength = Delimiter.Length;
36+
DelimiterIsEmpty = Delimiter.IsEmpty;
37+
CurrentCount = DelimiterIsEmpty ? 1 : count.ThrowIfNegative();
3638
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
3739
EnumerationDone = count == 0;
3840
Current = default;
@@ -63,7 +65,7 @@ public bool MoveNext()
6365
{
6466
EnumerationDone = true;
6567

66-
Current = delimiterIndex == -1 || CountExceedingBehaviour.IsIncludeRemainingElements() ? Span : Span[..delimiterIndex];
68+
Current = delimiterIndex == -1 || CountExceedingBehaviour.IsIncludeRemainingElements() || DelimiterIsEmpty ? Span : Span[..delimiterIndex];
6769

6870
return true;
6971
}

0 commit comments

Comments
 (0)