diff --git a/cpp/Platform.Ranges/EnsureExtensions.h b/cpp/Platform.Ranges/EnsureExtensions.h index d24ace4..d292888 100644 --- a/cpp/Platform.Ranges/EnsureExtensions.h +++ b/cpp/Platform.Ranges/EnsureExtensions.h @@ -1,59 +1,52 @@ namespace Platform::Ranges::Ensure::Always { - const std::string DefaultMaximumShouldBeGreaterOrEqualToMinimumMessage = "Maximum should be greater or equal to minimum."; + constexpr std::string_view DefaultMaximumShouldBeGreaterOrEqualToMinimumMessage = "Maximum should be greater or equal to minimum."; template - void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, const std::string& maximumArgumentName, auto&& messageBuilder) - requires requires { { messageBuilder() } -> std::same_as; } + void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, std::string_view maximumArgumentName, std::string_view message) { if (maximumArgument < minimumArgument) { - throw std::invalid_argument(std::string("Invalid ").append(maximumArgumentName).append(" argument: ").append(messageBuilder()).append(1, '.')); + throw std::invalid_argument(std::string("Invalid ").append(maximumArgumentName).append(" argument: ").append(message).append(1, '.')); } } template - void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, const std::string& maximumArgumentName, std::string message) + void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, std::string_view maximumArgumentName) { - auto messageBuilder = [&message]() { return message; }; - MaximumArgumentIsGreaterOrEqualToMinimum(minimumArgument, maximumArgument, maximumArgumentName, messageBuilder); + MaximumArgumentIsGreaterOrEqualToMinimum(minimumArgument, maximumArgument, maximumArgumentName, DefaultMaximumShouldBeGreaterOrEqualToMinimumMessage); } template - void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, const std::string& maximumArgumentName) - { - MaximumArgumentIsGreaterOrEqualToMinimum(minimumArgument, maximumArgument, "maximumArgument", DefaultMaximumShouldBeGreaterOrEqualToMinimumMessage); + void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument) noexcept(false) + { + MaximumArgumentIsGreaterOrEqualToMinimum(minimumArgument, maximumArgument, "maximumArgument"); } - template - void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument) { MaximumArgumentIsGreaterOrEqualToMinimum(minimumArgument, maximumArgument, "maximumArgument"); } - template > - void ArgumentInRange(TArgument&& argumentValue, Range range, const std::string& argumentName, auto&& messageBuilder) - requires requires { { messageBuilder() } -> std::same_as; } + void ArgumentInRange(TArgument&& argumentValue, const Range& range, std::string_view argumentName, std::string_view message) { if (!range.Contains(argumentValue)) { - throw std::invalid_argument(std::string("Value [").append(Converters::To(argumentValue)).append("] of argument [").append(argumentName).append("] is out of range: ").append(messageBuilder()).append(1, '.')); + throw std::invalid_argument(std::string("Value [").append(Converters::To(argumentValue)).append("] of argument [").append(argumentName).append("] is out of range: ").append(message).append(1, '.')); } } template > - void ArgumentInRange(TArgument&& argumentValue, const Range& range, const std::string& argumentName, const std::string& message) + void ArgumentInRange(TArgument&& argumentValue, const Range& range, std::string_view argumentName = {}) { - auto messageBuilder = [&message](){ return message; }; - ArgumentInRange(argumentValue, range, argumentName, messageBuilder); - } - - template > - void ArgumentInRange(TArgument&& argumentValue, const Range& range, const std::string& argumentName = {}) - { - auto messageBuilder = [&argumentValue, &range]() { return std::string("Argument value [").append(Converters::To(argumentValue)).append("] is out of range ").append(Converters::To(range)).append(1, '.'); }; - ArgumentInRange(argumentValue, range, argumentName, messageBuilder); + if (!range.Contains(argumentValue)) + { + std::string message = std::string("Argument value [").append(Converters::To(argumentValue)).append("] is out of range ").append(Converters::To(range)).append(1, '.'); + throw std::invalid_argument(std::string("Value [").append(Converters::To(argumentValue)).append("] of argument [").append(argumentName).append("] is out of range: ").append(message).append(1, '.')); + } } template - void ArgumentInRange(TArgument&& argumentValue, TArgument&& minimum, TArgument&& maximum, const std::string& argumentName = {}) { ArgumentInRange(argumentValue, Range{minimum, maximum}, argumentName); } + void ArgumentInRange(TArgument&& argumentValue, TArgument&& minimum, TArgument&& maximum, std::string_view argumentName = {}) + { + ArgumentInRange(argumentValue, Range{minimum, maximum}, argumentName); + } } namespace Platform::Ranges::Ensure::OnDebug diff --git a/cpp/Platform.Ranges/Range[T].h b/cpp/Platform.Ranges/Range[T].h index d575556..7bdc008 100644 --- a/cpp/Platform.Ranges/Range[T].h +++ b/cpp/Platform.Ranges/Range[T].h @@ -31,7 +31,7 @@ namespace Ensure::Always { template - void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, const std::string& maximumArgumentName); + void MaximumArgumentIsGreaterOrEqualToMinimum(TArgument&& minimumArgument, TArgument&& maximumArgument, std::string_view maximumArgumentName); } template struct Range;