diff --git a/src/Weaving/Extensions/System/Throw.cs b/src/Weaving/Extensions/System/Throw.cs
new file mode 100644
index 0000000..eea3e12
--- /dev/null
+++ b/src/Weaving/Extensions/System/Throw.cs
@@ -0,0 +1,992 @@
+//
+#region License
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// Adapted from https://github.com/dotnet/extensions/blob/main/src/Shared/Throw/Throw.cs
+#endregion
+
+#nullable enable
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.CompilerServices;
+
+#pragma warning disable CA1716
+namespace System;
+#pragma warning restore CA1716
+
+///
+/// Defines static methods used to throw exceptions.
+///
+///
+/// The main purpose is to reduce code size, improve performance, and standardize exception
+/// messages.
+///
+[SuppressMessage("Minor Code Smell", "S4136:Method overloads should be grouped together", Justification = "Doesn't work with the region layout")]
+[SuppressMessage("Minor Code Smell", "S2333:Partial is gratuitous in this context", Justification = "Some projects add additional partial parts.")]
+[SuppressMessage("Design", "CA1716", Justification = "Not part of an API")]
+
+#if !SHARED_PROJECT
+[ExcludeFromCodeCoverage]
+#endif
+
+static partial class Throw
+{
+ #region For Object
+
+ ///
+ /// Throws an if the specified argument is .
+ ///
+ /// Argument type to be checked for .
+ /// Object to be checked for .
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [return: NotNull]
+ public static T IfNull([NotNull] T argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument is null)
+ {
+ ArgumentNullException(paramName);
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified argument is ,
+ /// or if the specified member is .
+ ///
+ /// Argument type to be checked for .
+ /// Member type to be checked for .
+ /// Argument to be checked for .
+ /// Object member to be checked for .
+ /// The name of the parameter being checked.
+ /// The name of the member.
+ /// The original value of .
+ ///
+ ///
+ /// Throws.IfNullOrMemberNull(myObject, myObject?.MyProperty)
+ ///
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [return: NotNull]
+ public static TMember IfNullOrMemberNull(
+ [NotNull] TParameter argument,
+ [NotNull] TMember member,
+ [CallerArgumentExpression(nameof(argument))] string paramName = "",
+ [CallerArgumentExpression(nameof(member))] string memberName = "")
+ {
+ if (argument is null)
+ {
+ ArgumentNullException(paramName);
+ }
+
+ if (member is null)
+ {
+ ArgumentException(paramName, $"Member {memberName} of {paramName} is null");
+ }
+
+ return member;
+ }
+
+ ///
+ /// Throws an if the specified member is .
+ ///
+ /// Argument type.
+ /// Member type to be checked for .
+ /// Argument to which member belongs.
+ /// Object member to be checked for .
+ /// The name of the parameter being checked.
+ /// The name of the member.
+ /// The original value of .
+ ///
+ ///
+ /// Throws.IfMemberNull(myObject, myObject.MyProperty)
+ ///
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [return: NotNull]
+ [SuppressMessage("Style", "IDE0060:Remove unused parameter", Justification = "Analyzer isn't seeing the reference to 'argument' in the attribute")]
+ public static TMember IfMemberNull(
+ TParameter argument,
+ [NotNull] TMember member,
+ [CallerArgumentExpression(nameof(argument))] string paramName = "",
+ [CallerArgumentExpression(nameof(member))] string memberName = "")
+ where TParameter : notnull
+ {
+ if (member is null)
+ {
+ ArgumentException(paramName, $"Member {memberName} of {paramName} is null");
+ }
+
+ return member;
+ }
+
+ #endregion
+
+ #region For String
+
+ ///
+ /// Throws either an or an
+ /// if the specified string is or whitespace respectively.
+ ///
+ /// String to be checked for or whitespace.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [return: NotNull]
+ public static string IfNullOrWhitespace([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+#if !NETCOREAPP3_1_OR_GREATER
+ if (argument == null)
+ {
+ ArgumentNullException(paramName);
+ }
+#endif
+
+ if (string.IsNullOrWhiteSpace(argument))
+ {
+ if (argument == null)
+ {
+ ArgumentNullException(paramName);
+ }
+ else
+ {
+ ArgumentException(paramName, "Argument is whitespace");
+ }
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the string is ,
+ /// or if it is empty.
+ ///
+ /// String to be checked for or empty.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [return: NotNull]
+ public static string IfNullOrEmpty([NotNull] string? argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+#if !NETCOREAPP3_1_OR_GREATER
+ if (argument == null)
+ {
+ ArgumentNullException(paramName);
+ }
+#endif
+
+ if (string.IsNullOrEmpty(argument))
+ {
+ if (argument == null)
+ {
+ ArgumentNullException(paramName);
+ }
+ else
+ {
+ ArgumentException(paramName, "Argument is an empty string");
+ }
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region For Buffer
+
+ ///
+ /// Throws an if the argument's buffer size is less than the required buffer size.
+ ///
+ /// The actual buffer size.
+ /// The required buffer size.
+ /// The name of the parameter to be checked.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void IfBufferTooSmall(int bufferSize, int requiredSize, string paramName = "")
+ {
+ if (bufferSize < requiredSize)
+ {
+ ArgumentException(paramName, $"Buffer too small, needed a size of {requiredSize} but got {bufferSize}");
+ }
+ }
+
+ #endregion
+
+ #region For Enums
+
+ ///
+ /// Throws an if the enum value is not valid.
+ ///
+ /// The argument to evaluate.
+ /// The name of the parameter being checked.
+ /// The type of the enumeration.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static T IfOutOfRange(T argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ where T : struct, Enum
+ {
+#if NET5_0_OR_GREATER
+ if (!Enum.IsDefined(argument))
+#else
+ if (!Enum.IsDefined(typeof(T), argument))
+#endif
+ {
+ ArgumentOutOfRangeException(paramName, $"{argument} is an invalid value for enum type {typeof(T)}");
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region For Collections
+
+ ///
+ /// Throws an if the collection is ,
+ /// or if it is empty.
+ ///
+ /// The collection to evaluate.
+ /// The name of the parameter being checked.
+ /// The type of objects in the collection.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ [return: NotNull]
+
+ // The method has actually 100% coverage, but due to a bug in the code coverage tool,
+ // a lower number is reported. Therefore, we temporarily exclude this method
+ // from the coverage measurements. Once the bug in the code coverage tool is fixed,
+ // the exclusion attribute can be removed.
+ [ExcludeFromCodeCoverage]
+ public static IEnumerable IfNullOrEmpty([NotNull] IEnumerable? argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument == null)
+ {
+ ArgumentNullException(paramName);
+ }
+ else
+ {
+ switch (argument)
+ {
+ case ICollection collection:
+ if (collection.Count == 0)
+ {
+ ArgumentException(paramName, "Collection is empty");
+ }
+
+ break;
+ case IReadOnlyCollection readOnlyCollection:
+ if (readOnlyCollection.Count == 0)
+ {
+ ArgumentException(paramName, "Collection is empty");
+ }
+
+ break;
+ default:
+ using (IEnumerator enumerator = argument.GetEnumerator())
+ {
+ if (!enumerator.MoveNext())
+ {
+ ArgumentException(paramName, "Collection is empty");
+ }
+ }
+
+ break;
+ }
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region Exceptions
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentNullException(string paramName)
+ => throw new ArgumentNullException(paramName);
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+ /// A message that describes the error.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentNullException(string paramName, string? message)
+ => throw new ArgumentNullException(paramName, message);
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentOutOfRangeException(string paramName)
+ => throw new ArgumentOutOfRangeException(paramName);
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+ /// A message that describes the error.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentOutOfRangeException(string paramName, string? message)
+ => throw new ArgumentOutOfRangeException(paramName, message);
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+ /// The value of the argument that caused this exception.
+ /// A message that describes the error.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentOutOfRangeException(string paramName, object? actualValue, string? message)
+ => throw new ArgumentOutOfRangeException(paramName, actualValue, message);
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+ /// A message that describes the error.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentException(string paramName, string? message)
+ => throw new ArgumentException(message, paramName);
+
+ ///
+ /// Throws an .
+ ///
+ /// The name of the parameter that caused the exception.
+ /// A message that describes the error.
+ /// The exception that is the cause of the current exception.
+ ///
+ /// If the is not a , the current exception is raised in a catch
+ /// block that handles the inner exception.
+ ///
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void ArgumentException(string paramName, string? message, Exception? innerException)
+ => throw new ArgumentException(message, paramName, innerException);
+
+ ///
+ /// Throws an .
+ ///
+ /// A message that describes the error.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void InvalidOperationException(string message)
+ => throw new InvalidOperationException(message);
+
+ ///
+ /// Throws an .
+ ///
+ /// A message that describes the error.
+ /// The exception that is the cause of the current exception.
+#if !NET6_0_OR_GREATER
+ [MethodImpl(MethodImplOptions.NoInlining)]
+#endif
+ [DoesNotReturn]
+ public static void InvalidOperationException(string message, Exception? innerException)
+ => throw new InvalidOperationException(message, innerException);
+
+ #endregion
+
+ #region For Integer
+
+ ///
+ /// Throws an if the specified number is less than min.
+ ///
+ /// Number to be expected being less than min.
+ /// The number that must be less than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int IfLessThan(int argument, int min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater than max.
+ ///
+ /// Number to be expected being greater than max.
+ /// The number that must be greater than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int IfGreaterThan(int argument, int max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is less or equal than min.
+ ///
+ /// Number to be expected being less or equal than min.
+ /// The number that must be less or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int IfLessThanOrEqual(int argument, int min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument <= min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater or equal than max.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The number that must be greater or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int IfGreaterThanOrEqual(int argument, int max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument >= max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is not in the specified range.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The lower bound of the allowed range of argument values.
+ /// The upper bound of the allowed range of argument values.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int IfOutOfRange(int argument, int min, int max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min || argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is equal to 0.
+ ///
+ /// Number to be expected being not equal to zero.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int IfZero(int argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument == 0)
+ {
+ ArgumentOutOfRangeException(paramName, "Argument is zero");
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region For Unsigned Integer
+
+ ///
+ /// Throws an if the specified number is less than min.
+ ///
+ /// Number to be expected being less than min.
+ /// The number that must be less than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint IfLessThan(uint argument, uint min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater than max.
+ ///
+ /// Number to be expected being greater than max.
+ /// The number that must be greater than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint IfGreaterThan(uint argument, uint max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is less or equal than min.
+ ///
+ /// Number to be expected being less or equal than min.
+ /// The number that must be less or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint IfLessThanOrEqual(uint argument, uint min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument <= min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater or equal than max.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The number that must be greater or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint IfGreaterThanOrEqual(uint argument, uint max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument >= max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is not in the specified range.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The lower bound of the allowed range of argument values.
+ /// The upper bound of the allowed range of argument values.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint IfOutOfRange(uint argument, uint min, uint max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min || argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is equal to 0.
+ ///
+ /// Number to be expected being not equal to zero.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static uint IfZero(uint argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument == 0U)
+ {
+ ArgumentOutOfRangeException(paramName, "Argument is zero");
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region For Long
+
+ ///
+ /// Throws an if the specified number is less than min.
+ ///
+ /// Number to be expected being less than min.
+ /// The number that must be less than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static long IfLessThan(long argument, long min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater than max.
+ ///
+ /// Number to be expected being greater than max.
+ /// The number that must be greater than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static long IfGreaterThan(long argument, long max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is less or equal than min.
+ ///
+ /// Number to be expected being less or equal than min.
+ /// The number that must be less or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static long IfLessThanOrEqual(long argument, long min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument <= min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater or equal than max.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The number that must be greater or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static long IfGreaterThanOrEqual(long argument, long max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument >= max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is not in the specified range.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The lower bound of the allowed range of argument values.
+ /// The upper bound of the allowed range of argument values.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static long IfOutOfRange(long argument, long min, long max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min || argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is equal to 0.
+ ///
+ /// Number to be expected being not equal to zero.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static long IfZero(long argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument == 0L)
+ {
+ ArgumentOutOfRangeException(paramName, "Argument is zero");
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region For Unsigned Long
+
+ ///
+ /// Throws an if the specified number is less than min.
+ ///
+ /// Number to be expected being less than min.
+ /// The number that must be less than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ulong IfLessThan(ulong argument, ulong min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater than max.
+ ///
+ /// Number to be expected being greater than max.
+ /// The number that must be greater than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ulong IfGreaterThan(ulong argument, ulong max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is less or equal than min.
+ ///
+ /// Number to be expected being less or equal than min.
+ /// The number that must be less or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ulong IfLessThanOrEqual(ulong argument, ulong min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument <= min)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater or equal than max.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The number that must be greater or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ulong IfGreaterThanOrEqual(ulong argument, ulong max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument >= max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is not in the specified range.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The lower bound of the allowed range of argument values.
+ /// The upper bound of the allowed range of argument values.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ulong IfOutOfRange(ulong argument, ulong min, ulong max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument < min || argument > max)
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is equal to 0.
+ ///
+ /// Number to be expected being not equal to zero.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static ulong IfZero(ulong argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ if (argument == 0UL)
+ {
+ ArgumentOutOfRangeException(paramName, "Argument is zero");
+ }
+
+ return argument;
+ }
+
+ #endregion
+
+ #region For Double
+
+ ///
+ /// Throws an if the specified number is less than min.
+ ///
+ /// Number to be expected being less than min.
+ /// The number that must be less than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static double IfLessThan(double argument, double min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ // strange conditional needed in order to handle NaN values correctly
+#pragma warning disable S1940 // Boolean checks should not be inverted
+ if (!(argument >= min))
+#pragma warning restore S1940 // Boolean checks should not be inverted
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater than max.
+ ///
+ /// Number to be expected being greater than max.
+ /// The number that must be greater than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static double IfGreaterThan(double argument, double max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ // strange conditional needed in order to handle NaN values correctly
+#pragma warning disable S1940 // Boolean checks should not be inverted
+ if (!(argument <= max))
+#pragma warning restore S1940 // Boolean checks should not be inverted
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is less or equal than min.
+ ///
+ /// Number to be expected being less or equal than min.
+ /// The number that must be less or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static double IfLessThanOrEqual(double argument, double min, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ // strange conditional needed in order to handle NaN values correctly
+#pragma warning disable S1940 // Boolean checks should not be inverted
+ if (!(argument > min))
+#pragma warning restore S1940 // Boolean checks should not be inverted
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument less or equal than minimum value {min}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is greater or equal than max.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The number that must be greater or equal than the argument.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static double IfGreaterThanOrEqual(double argument, double max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ // strange conditional needed in order to handle NaN values correctly
+#pragma warning disable S1940 // Boolean checks should not be inverted
+ if (!(argument < max))
+#pragma warning restore S1940 // Boolean checks should not be inverted
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument greater or equal than maximum value {max}");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is not in the specified range.
+ ///
+ /// Number to be expected being greater or equal than max.
+ /// The lower bound of the allowed range of argument values.
+ /// The upper bound of the allowed range of argument values.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static double IfOutOfRange(double argument, double min, double max, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+ // strange conditional needed in order to handle NaN values correctly
+ if (!(min <= argument && argument <= max))
+ {
+ ArgumentOutOfRangeException(paramName, argument, $"Argument not in the range [{min}..{max}]");
+ }
+
+ return argument;
+ }
+
+ ///
+ /// Throws an if the specified number is equal to 0.
+ ///
+ /// Number to be expected being not equal to zero.
+ /// The name of the parameter being checked.
+ /// The original value of .
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static double IfZero(double argument, [CallerArgumentExpression(nameof(argument))] string paramName = "")
+ {
+#pragma warning disable S1244 // Floating point numbers should not be tested for equality
+ if (argument == 0.0)
+#pragma warning restore S1244 // Floating point numbers should not be tested for equality
+ {
+ ArgumentOutOfRangeException(paramName, "Argument is zero");
+ }
+
+ return argument;
+ }
+
+ #endregion
+}