Skip to content

Commit 591df77

Browse files
committed
throw if StringSplitOptions is invalid
1 parent a46a4cc commit 591df77

7 files changed

+63
-7
lines changed

src/Enumerators/Split/SpanSplitStringSplitOptionsEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public SpanSplitStringSplitOptionsEnumerator(ReadOnlySpan<char> source, char del
2929
{
3030
Span = source;
3131
Delimiter = delimiter;
32-
TrimEntries = options.IsTrimEntriesSet();
32+
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
3333
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
3434
EnumerationDone = false;
3535
Current = default;

src/Enumerators/Split/SpanSplitStringSplitOptionsWithCountEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public SpanSplitStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char> source,
3434
Span = source;
3535
Delimiter = delimiter;
3636
CurrentCount = count.ThrowIfNegative();
37-
TrimEntries = options.IsTrimEntriesSet();
37+
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
3838
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
3939
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
4040
EnumerationDone = count == 0;

src/Enumerators/SplitAny/SpanSplitAnyStringSplitOptionsEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public SpanSplitAnyStringSplitOptionsEnumerator(ReadOnlySpan<char> source, ReadO
2929
{
3030
Span = source;
3131
Delimiters = delimiters;
32-
TrimEntries = options.IsTrimEntriesSet();
32+
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
3333
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
3434
EnumerationDone = false;
3535
Current = default;

src/Enumerators/SplitAny/SpanSplitAnyStringSplitOptionsWithCountEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public SpanSplitAnyStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char> sour
3434
Span = source;
3535
Delimiters = delimiters;
3636
CurrentCount = count.ThrowIfNegative();
37-
TrimEntries = options.IsTrimEntriesSet();
37+
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
3838
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
3939
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
4040
EnumerationDone = count == 0;

src/Enumerators/SplitSequence/SpanSplitSequenceStringSplitOptionsEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public SpanSplitSequenceStringSplitOptionsEnumerator(ReadOnlySpan<char> source,
3232
Delimiter = delimiter;
3333
DelimiterLength = Delimiter.Length;
3434
DelimiterIsEmpty = Delimiter.IsEmpty;
35-
TrimEntries = options.IsTrimEntriesSet();
35+
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
3636
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
3737
EnumerationDone = false;
3838
Current = default;

src/Enumerators/SplitSequence/SpanSplitSequenceStringSplitOptionsWithCountEnumerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public SpanSplitSequenceStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char>
3737
DelimiterLength = Delimiter.Length;
3838
DelimiterIsEmpty = Delimiter.IsEmpty;
3939
CurrentCount = DelimiterIsEmpty ? 0 : count.ThrowIfNegative();
40-
TrimEntries = options.IsTrimEntriesSet();
40+
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
4141
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
4242
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
4343
EnumerationDone = count == 0;

src/InternalExtensions.cs

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,39 @@ public static int ThrowIfNegative(this int value)
4646
}
4747
#endif
4848

49+
#if NETCOREAPP3_0_OR_GREATER
50+
/// <summary>
51+
/// Throws an <see cref="ArgumentException"/> if <paramref name="options"/> is not a valid flag.
52+
/// </summary>
53+
/// <param name="options">The argument to validate as a valid flag.</param>
54+
/// <param name="paramName">The name of the parameter with which <paramref name="options"/> corresponds.</param>
55+
/// <returns><paramref name="options"/>.</returns>
56+
public static StringSplitOptions ThrowIfInvalid(this StringSplitOptions options, [CallerArgumentExpression(nameof(options))] string? paramName = null)
57+
{
58+
if((options & ~CombinationOfAllValidStringSplitOptions) != 0)
59+
{
60+
throw new ArgumentException("Value of flag is invalid.", paramName);
61+
}
62+
63+
return options;
64+
}
65+
#else
66+
/// <summary>
67+
/// Throws an <see cref="ArgumentException"/> if <paramref name="options"/> is not a valid flag.
68+
/// </summary>
69+
/// <param name="options">The argument to validate as a valid flag.</param>
70+
/// <returns><paramref name="options"/>.</returns>
71+
public static StringSplitOptions ThrowIfInvalid(this StringSplitOptions options)
72+
{
73+
if((options & ~CombinationOfAllValidStringSplitOptions) != 0)
74+
{
75+
throw new ArgumentException("Value of flag is invalid.");
76+
}
77+
78+
return options;
79+
}
80+
#endif
81+
4982
/// <summary>
5083
/// Determines whether the <see cref="StringSplitOptions.RemoveEmptyEntries"/> bit field is set in the current instance.
5184
/// </summary>
@@ -68,7 +101,7 @@ public static bool IsRemoveEmptyEntriesSet(this StringSplitOptions options)
68101
public static bool IsTrimEntriesSet(this StringSplitOptions options)
69102
{
70103
return options.HasFlag(StringSplitOptions.TrimEntries);
71-
}
104+
}
72105
#else
73106
/// <summary>
74107
/// Always returns false.
@@ -80,5 +113,28 @@ public static bool IsTrimEntriesSet(this StringSplitOptions options)
80113
return false;
81114
}
82115
#endif
116+
117+
/// <summary>
118+
/// Gets all values of an enum and applies the or operation on them.
119+
/// </summary>
120+
/// <typeparam name="T">The target enum type.</typeparam>
121+
/// <returns>The combination of all valid enum values.</returns>
122+
public static T GetCombinationOfAllValidFlags<T>() where T : struct, Enum
123+
{
124+
#if NET5_0_OR_GREATER
125+
T[] flags = Enum.GetValues<T>();
126+
#else
127+
T[] flags = (T[])Enum.GetValues(typeof(T));
128+
#endif
129+
130+
int combination = 0;
131+
foreach(T flag in flags)
132+
{
133+
combination |= (int)(object)flag;
134+
}
135+
return (T)(object)combination;
136+
}
137+
138+
static readonly StringSplitOptions CombinationOfAllValidStringSplitOptions = GetCombinationOfAllValidFlags<StringSplitOptions>();
83139
}
84140
}

0 commit comments

Comments
 (0)