30#include "MeshKernel/Exceptions.hpp"
31#include "MeshKernel/Formatting.hpp"
38#include <unordered_map>
48 !std::same_as<T, bool> &&
49 !std::same_as<T, char> &&
50 !std::same_as<T, char8_t> &&
51 !std::same_as<T, char16_t> &&
52 !std::same_as<T, char32_t> &&
53 !std::same_as<T, wchar_t>);
66 InRightHalfOpenInterval,
67 InLeftHalfOpenInterval,
68 OutsideClosedInterval,
75 inline static std::unordered_map<Comparison, std::string>
const ValidRangeFormat = {
76 {Comparison::Equal,
"value = {}"},
77 {Comparison::NotEqual,
"value != {}"},
78 {Comparison::Greater,
"value > {}"},
79 {Comparison::GreaterEqual,
"value >= {}"},
80 {Comparison::Less,
"value < {}"},
81 {Comparison::LessEqual,
"value <= {}"},
82 {Comparison::InClosedInterval,
"{} <= value <= {}"},
83 {Comparison::InOpenInterval,
"{} < value < {}"},
84 {Comparison::InRightHalfOpenInterval,
"{} <= value < {}"},
85 {Comparison::InLeftHalfOpenInterval,
"{} < value <= {}"},
86 {Comparison::OutsideClosedInterval,
"value < {} and value > {}"},
87 {Comparison::OutsideOpenInterval,
"value <= {} and value >= {}"},
88 {Comparison::OneOf,
"value is one of {}"},
89 {Comparison::NoneOf,
"value is none of {}"}};
99 template <RangeCheckableType T>
100 inline static void CheckRange(T
const& value,
102 std::function<
bool(T
const&, T
const&)> predicate,
103 Comparison
const comparison,
104 std::string_view
const variable_name)
106 if (!predicate(value, bound))
109 fmt_ns::format(
"{{}} = {{}} is invalid. Valid range: {}.",
110 ValidRangeFormat.at(comparison)),
126 template <RangeCheckableType T>
127 inline static void CheckRange(T
const& value,
128 T
const& interval_lower_bound,
129 T
const& interval_upper_bound,
130 std::function<
bool(T
const&, T
const&, T
const&)> predicate,
131 Comparison
const comparison,
132 std::string_view
const variable_name)
134 if (!predicate(value, interval_lower_bound, interval_upper_bound))
137 fmt_ns::format(
"{{}} = {{}} is invalid. Valid range: {}.",
138 ValidRangeFormat.at(comparison)),
141 interval_lower_bound,
142 interval_upper_bound);
154 template <RangeCheckableType T>
155 inline static void CheckRange(T
const& value,
156 std::vector<T>
const& values,
157 std::function<
bool(T
const&, std::vector<T>
const&)> predicate,
158 Comparison
const comparison,
159 std::string_view
const variable_name)
161 if (!predicate(value, values))
164 fmt_ns::format(
"{{}} = {{}} is invalid. Valid range: {}.",
165 ValidRangeFormat.at(comparison)),
178 template <RangeCheckableType T>
179 inline static void CheckEqual(T
const& value,
180 T
const& other_value,
181 std::string_view
const variable_name)
196 template <RangeCheckableType T>
197 inline static void CheckNotEqual(T
const& value,
198 T
const& other_value,
199 std::string_view
const variable_name)
203 std::not_equal_to<T>(),
204 Comparison::NotEqual,
214 template <RangeCheckableType T>
215 inline static void CheckGreater(T
const& value,
217 std::string_view
const variable_name)
232 template <RangeCheckableType T>
233 inline static void CheckGreaterEqual(T
const& value,
235 std::string_view
const variable_name)
239 std::greater_equal<T>(),
240 Comparison::GreaterEqual,
250 template <RangeCheckableType T>
251 inline static void CheckLess(T
const& value,
253 std::string_view
const variable_name)
268 template <RangeCheckableType T>
269 inline static void CheckLessEqual(T
const& value,
271 std::string_view
const variable_name)
275 std::less_equal<T>(),
276 Comparison::LessEqual,
287 template <RangeCheckableType T>
288 inline static void CheckInClosedInterval(T
const& value,
289 T
const& interval_lower_bound,
290 T
const& interval_upper_bound,
291 std::string_view
const variable_name)
293 auto const predicate = [](T
const& v, T
const& l, T
const& u)
295 return std::less_equal{}(l, v) && std::less_equal{}(v, u);
299 interval_lower_bound,
300 interval_upper_bound,
302 Comparison::InClosedInterval,
312 template <RangeCheckableType T>
313 inline static void CheckInClosedInterval(T
const& value,
314 std::pair<T, T>
const& inteval_bounds,
315 std::string_view
const variable_name)
317 CheckInClosedInterval(value,
318 inteval_bounds.first,
319 inteval_bounds.second,
330 template <RangeCheckableType T>
331 inline static void CheckInOpenInterval(T
const& value,
332 T
const& interval_lower_bound,
333 T
const& interval_upper_bound,
334 std::string_view
const variable_name)
336 auto const predicate = [](T
const& v, T
const& l, T
const& u)
338 return std::less{}(l, v) && std::less{}(v, u);
342 interval_lower_bound,
343 interval_upper_bound,
345 Comparison::InOpenInterval,
355 template <RangeCheckableType T>
356 inline static void CheckInOpenInterval(T
const& value,
357 std::pair<T, T>
const& interval_bounds,
358 std::string_view
const variable_name)
360 CheckInOpenInterval(value,
361 interval_bounds.first,
362 interval_bounds.second,
373 template <RangeCheckableType T>
374 inline static void CheckInRightHalfOpenInterval(T
const& value,
375 T
const& interval_lower_bound,
376 T
const& interval_upper_bound,
377 std::string_view
const variable_name)
379 auto const predicate = [](T
const& v, T
const& l, T
const& u)
381 return std::less_equal{}(l, v) && std::less{}(v, u);
385 interval_lower_bound,
386 interval_upper_bound,
388 Comparison::InRightHalfOpenInterval,
398 template <RangeCheckableType T>
399 inline static void CheckInRightHalfOpenInterval(T
const& value,
400 std::pair<T, T>
const& interval_bounds,
401 std::string_view
const variable_name)
403 CheckInRightHalfOpenInterval(value,
404 interval_bounds.first,
405 interval_bounds.second,
416 template <RangeCheckableType T>
417 inline static void CheckInLeftHalfOpenInterval(T
const& value,
418 T
const& interval_lower_bound,
419 T
const& interval_upper_bound,
420 std::string_view
const variable_name)
422 auto const predicate = [](T
const& v, T
const& l, T
const& u)
424 return std::less{}(l, v) && std::less_equal{}(v, u);
428 interval_lower_bound,
429 interval_upper_bound,
431 Comparison::InLeftHalfOpenInterval,
441 template <RangeCheckableType T>
442 inline static void CheckInLeftHalfOpenInterval(T
const& value,
443 std::pair<T, T>
const& interval_bounds,
444 std::string_view
const variable_name)
446 CheckInLeftHalfOpenInterval(value,
447 interval_bounds.first,
448 interval_bounds.second,
459 template <RangeCheckableType T>
460 inline static void CheckOutsideClosedInterval(T
const& value,
461 T
const& interval_lower_bound,
462 T
const& interval_upper_bound,
463 std::string_view
const variable_name)
465 auto const predicate = [](T
const& v, T
const& l, T
const& u)
467 return std::less{}(v, l) || std::greater{}(v, u);
471 interval_lower_bound,
472 interval_upper_bound,
474 Comparison::OutsideClosedInterval,
484 template <RangeCheckableType T>
485 inline static void CheckOutsideClosedInterval(T
const& value,
486 std::pair<T, T>
const& interval_bounds,
487 std::string_view
const variable_name)
489 CheckOutsideClosedInterval(value,
490 interval_bounds.first,
491 interval_bounds.second,
502 template <RangeCheckableType T>
503 inline static void CheckOutsideOpenInterval(T
const& value,
504 T
const& interval_lower_bound,
505 T
const& interval_upper_bound,
506 std::string_view
const variable_name)
508 auto const predicate = [](T
const& v, T
const& l, T
const& u)
510 return std::less_equal{}(v, l) || std::greater_equal{}(v, u);
514 interval_lower_bound,
515 interval_upper_bound,
517 Comparison::OutsideClosedInterval,
527 template <RangeCheckableType T>
528 inline static void CheckOutsideOpenInterval(T
const& value,
529 std::pair<T, T>
const& interval_bounds,
530 std::string_view
const variable_name)
532 CheckOutsideOpenInterval(value,
533 interval_bounds.first,
534 interval_bounds.second,
544 template <RangeCheckableType T>
545 inline static void CheckOneOf(T
const& value,
546 std::vector<T>
const& values,
547 std::string_view
const variable_name)
549 auto const predicate = [](T
const& v, std::vector<T>
const& l)
551 return std::any_of(l.begin(), l.end(), [&v](T
const& i)
552 { return std::equal_to<T>{}(i, v); });
568 template <RangeCheckableType T>
569 inline static void CheckNoneOf(T
const& value,
570 std::vector<T>
const& values,
571 std::string_view
const variable_name)
573 auto const predicate = [](T
const& v, std::vector<T>
const& l)
575 return std::none_of(l.begin(), l.end(), [&v](T
const& i)
576 { return std::equal_to<T>{}(i, v); });
593 template <RangeCheckableType T,
class Precondition>
594 inline static void CheckPrecondition(T
const& value,
595 std::string_view
const variable_name,
596 std::string_view
const precondition_name,
597 Precondition precondition)
599 if (!precondition(value))
601 throw RangeError(
"{{}} = {{}} precondition not satisfied: value should satisfy: {}",
Defines the checkable types: floating point types and inetgral types except for bool and char.
Definition RangeCheck.hpp:47
Contains the logic of the C++ static library.
Definition AveragingInterpolation.hpp:37