[go: nahoru, domu]

Skip to content

Commit

Permalink
throw if StringSplitOptions is invalid
Browse files Browse the repository at this point in the history
  • Loading branch information
Guiorgy committed Feb 24, 2024
1 parent a46a4cc commit 591df77
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public SpanSplitStringSplitOptionsEnumerator(ReadOnlySpan<char> source, char del
{
Span = source;
Delimiter = delimiter;
TrimEntries = options.IsTrimEntriesSet();
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
EnumerationDone = false;
Current = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public SpanSplitStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char> source,
Span = source;
Delimiter = delimiter;
CurrentCount = count.ThrowIfNegative();
TrimEntries = options.IsTrimEntriesSet();
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
EnumerationDone = count == 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public SpanSplitAnyStringSplitOptionsEnumerator(ReadOnlySpan<char> source, ReadO
{
Span = source;
Delimiters = delimiters;
TrimEntries = options.IsTrimEntriesSet();
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
EnumerationDone = false;
Current = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public SpanSplitAnyStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char> sour
Span = source;
Delimiters = delimiters;
CurrentCount = count.ThrowIfNegative();
TrimEntries = options.IsTrimEntriesSet();
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
EnumerationDone = count == 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public SpanSplitSequenceStringSplitOptionsEnumerator(ReadOnlySpan<char> source,
Delimiter = delimiter;
DelimiterLength = Delimiter.Length;
DelimiterIsEmpty = Delimiter.IsEmpty;
TrimEntries = options.IsTrimEntriesSet();
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
EnumerationDone = false;
Current = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public SpanSplitSequenceStringSplitOptionsWithCountEnumerator(ReadOnlySpan<char>
DelimiterLength = Delimiter.Length;
DelimiterIsEmpty = Delimiter.IsEmpty;
CurrentCount = DelimiterIsEmpty ? 0 : count.ThrowIfNegative();
TrimEntries = options.IsTrimEntriesSet();
TrimEntries = options.ThrowIfInvalid().IsTrimEntriesSet();
RemoveEmptyEntries = options.IsRemoveEmptyEntriesSet();
CountExceedingBehaviour = countExceedingBehaviour.ThrowIfInvalid();
EnumerationDone = count == 0;
Expand Down
58 changes: 57 additions & 1 deletion src/InternalExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,39 @@ public static int ThrowIfNegative(this int value)
}
#endif

#if NETCOREAPP3_0_OR_GREATER
/// <summary>
/// Throws an <see cref="ArgumentException"/> if <paramref name="options"/> is not a valid flag.
/// </summary>
/// <param name="options">The argument to validate as a valid flag.</param>
/// <param name="paramName">The name of the parameter with which <paramref name="options"/> corresponds.</param>
/// <returns><paramref name="options"/>.</returns>
public static StringSplitOptions ThrowIfInvalid(this StringSplitOptions options, [CallerArgumentExpression(nameof(options))] string? paramName = null)
{
if((options & ~CombinationOfAllValidStringSplitOptions) != 0)
{
throw new ArgumentException("Value of flag is invalid.", paramName);
}

return options;
}
#else
/// <summary>
/// Throws an <see cref="ArgumentException"/> if <paramref name="options"/> is not a valid flag.
/// </summary>
/// <param name="options">The argument to validate as a valid flag.</param>
/// <returns><paramref name="options"/>.</returns>
public static StringSplitOptions ThrowIfInvalid(this StringSplitOptions options)
{
if((options & ~CombinationOfAllValidStringSplitOptions) != 0)
{
throw new ArgumentException("Value of flag is invalid.");
}

return options;
}
#endif

/// <summary>
/// Determines whether the <see cref="StringSplitOptions.RemoveEmptyEntries"/> bit field is set in the current instance.
/// </summary>
Expand All @@ -68,7 +101,7 @@ public static bool IsRemoveEmptyEntriesSet(this StringSplitOptions options)
public static bool IsTrimEntriesSet(this StringSplitOptions options)
{
return options.HasFlag(StringSplitOptions.TrimEntries);
}
}
#else
/// <summary>
/// Always returns false.
Expand All @@ -80,5 +113,28 @@ public static bool IsTrimEntriesSet(this StringSplitOptions options)
return false;
}
#endif

/// <summary>
/// Gets all values of an enum and applies the or operation on them.
/// </summary>
/// <typeparam name="T">The target enum type.</typeparam>
/// <returns>The combination of all valid enum values.</returns>
public static T GetCombinationOfAllValidFlags<T>() where T : struct, Enum
{
#if NET5_0_OR_GREATER
T[] flags = Enum.GetValues<T>();
#else
T[] flags = (T[])Enum.GetValues(typeof(T));
#endif

int combination = 0;
foreach(T flag in flags)
{
combination |= (int)(object)flag;
}
return (T)(object)combination;
}

static readonly StringSplitOptions CombinationOfAllValidStringSplitOptions = GetCombinationOfAllValidFlags<StringSplitOptions>();
}
}

0 comments on commit 591df77

Please sign in to comment.