Skip to content

Commit 8bb8994

Browse files
committed
handle cases where count is 0 or negative
1 parent 68d321b commit 8bb8994

7 files changed

+49
-12
lines changed

src/Enumerators/Split/SpanSplitStringSplitOptionsWithCountEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ public SpanSplitStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char> source,
3333
{
3434
Span = source;
3535
Delimiter = delimiter;
36-
CurrentCount = Math.Max(1, count);
36+
CurrentCount = count.ThrowIfNegative();
3737
#if NET5_0_OR_GREATER
3838
TrimEntries = options.HasFlag(StringSplitOptions.TrimEntries);
3939
#else
4040
TrimEntries = false;
4141
#endif
4242
RemoveEmptyEntries = options.HasFlag(StringSplitOptions.RemoveEmptyEntries);
4343
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
44-
EnumerationDone = false;
44+
EnumerationDone = count == 0;
4545
Current = default;
4646
}
4747

src/Enumerators/Split/SpanSplitWithCountEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public SpanSplitWithCountEnumerator(ReadOnlySpan<T> source, T delimiter, int cou
3131
{
3232
Span = source;
3333
Delimiter = delimiter;
34-
CurrentCount = Math.Max(1, count);
34+
CurrentCount = count.ThrowIfNegative();
3535
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
36-
EnumerationDone = false;
36+
EnumerationDone = count == 0;
3737
Current = default;
3838
}
3939

src/Enumerators/SplitAny/SpanSplitAnyStringSplitOptionsWithCountEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ public SpanSplitAnyStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char> sour
3333
{
3434
Span = source;
3535
Delimiters = delimiters;
36-
CurrentCount = Math.Max(1, count);
36+
CurrentCount = count.ThrowIfNegative();
3737
#if NET5_0_OR_GREATER
3838
TrimEntries = options.HasFlag(StringSplitOptions.TrimEntries);
3939
#else
4040
TrimEntries = false;
4141
#endif
4242
RemoveEmptyEntries = options.HasFlag(StringSplitOptions.RemoveEmptyEntries);
4343
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
44-
EnumerationDone = false;
44+
EnumerationDone = count == 0;
4545
Current = default;
4646
}
4747

src/Enumerators/SplitAny/SpanSplitAnyWithCountEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public SpanSplitAnyWithCountEnumerator(ReadOnlySpan<T> source, ReadOnlySpan<T> d
3131
{
3232
Span = source;
3333
Delimiters = delimiters;
34-
CurrentCount = Math.Max(1, count);
34+
CurrentCount = count.ThrowIfNegative();
3535
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
36-
EnumerationDone = false;
36+
EnumerationDone = count == 0;
3737
Current = default;
3838
}
3939

src/Enumerators/SplitSequence/SpanSplitSequenceStringSplitOptionsWithCountEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ public SpanSplitSequenceStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char>
3434
Span = source;
3535
Delimiter = delimiter;
3636
DelimiterLength = delimiter.Length;
37-
CurrentCount = Math.Max(1, count);
37+
CurrentCount = count.ThrowIfNegative();
3838
#if NET5_0_OR_GREATER
3939
TrimEntries = options.HasFlag(StringSplitOptions.TrimEntries);
4040
#else
4141
TrimEntries = false;
4242
#endif
4343
RemoveEmptyEntries = options.HasFlag(StringSplitOptions.RemoveEmptyEntries);
4444
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
45-
EnumerationDone = false;
45+
EnumerationDone = count == 0;
4646
Current = default;
4747
}
4848

src/Enumerators/SplitSequence/SpanSplitSequenceWithCountEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ public SpanSplitSequenceWithCountEnumerator(ReadOnlySpan<T> source, ReadOnlySpan
3232
Span = source;
3333
Delimiter = delimiter;
3434
DelimiterLength = delimiter.Length;
35-
CurrentCount = Math.Max(1, count);
35+
CurrentCount = count.ThrowIfNegative();
3636
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
37-
EnumerationDone = false;
37+
EnumerationDone = count == 0;
3838
Current = default;
3939
}
4040

src/InternalExtensions.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Runtime.CompilerServices;
3+
4+
namespace SpanExtensions
5+
{
6+
static class InternalExtensions
7+
{
8+
/// <summary>
9+
/// Throws an <see cref="ArgumentOutOfRangeException"/> if <paramref name="value"/> is negative.
10+
/// </summary>
11+
/// <param name="value">The argument to validate as non-negative.</param>
12+
/// <param name="paramName">The name of the parameter with which <paramref name="value"/> corresponds.</param>
13+
/// <returns><paramref name="value"/>.</returns>
14+
public static int ThrowIfNegative(this int value
15+
#if NETCOREAPP3_0_OR_GREATER
16+
, [CallerArgumentExpression(nameof(value))] string? paramName = null
17+
#endif
18+
)
19+
{
20+
#if NET8_0_OR_GREATER
21+
ArgumentOutOfRangeException.ThrowIfNegative(value, paramName);
22+
#elif NETCOREAPP3_0_OR_GREATER
23+
if(value < 0)
24+
{
25+
throw new ArgumentOutOfRangeException(paramName, value, $"{paramName} ('{value}') must be a non-negative value.");
26+
}
27+
#else
28+
if(value < 0)
29+
{
30+
throw new ArgumentOutOfRangeException(null, value, $" ('{value}') must be a non-negative value.");
31+
}
32+
#endif
33+
34+
return value;
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)