6#include "Stroika/Foundation/Execution/Throw.h"
7#include "Stroika/Foundation/Math/Common.h"
18 inline T CheckedConverter_Range_Helper_Pinner_ (T t, T lower, T upper)
20 if constexpr (is_floating_point_v<T>) {
21 return Math::PinToSpecialPoint (Math::PinToSpecialPoint (t, lower), upper);
35 template <
typename RANGE_TYPE>
36 RANGE_TYPE
CheckedConverter_Range (
const typename RANGE_TYPE::value_type& s,
const typename RANGE_TYPE::value_type& e)
38 typename RANGE_TYPE::value_type useS =
39 Private_::CheckedConverter_Range_Helper_Pinner_ (s, RANGE_TYPE::TraitsType::kLowerBound, RANGE_TYPE::TraitsType::kUpperBound);
40 typename RANGE_TYPE::value_type useE =
41 Private_::CheckedConverter_Range_Helper_Pinner_ (e, RANGE_TYPE::TraitsType::kLowerBound, RANGE_TYPE::TraitsType::kUpperBound);
43 if (not(RANGE_TYPE::TraitsType::kLowerBound <= useS)) {
46 if (not(useS <= useE)) {
49 if (not(useE <= RANGE_TYPE::TraitsType::kUpperBound)) {
52 return RANGE_TYPE{useS, useE};
60 template <
typename RANGE_TYPE>
63 typename RANGE_TYPE::value_type useVal =
64 Private_::CheckedConverter_Range_Helper_Pinner_ (val, RANGE_TYPE::TraitsType::kLowerBound, RANGE_TYPE::TraitsType::kUpperBound);
65 if (not range.Contains (useVal)) {
66 if (useVal <= range.GetLowerBound ()) {
70 Assert (useVal >= range.GetUpperBound ());
RANGE_TYPE CheckedConverter_Range(const typename RANGE_TYPE::value_type &s, const typename RANGE_TYPE::value_type &e)
RANGE_TYPE::ElementType CheckedConverter_ValueInRange(typename RANGE_TYPE::ElementType val, const RANGE_TYPE &range=RANGE_TYPE::FullRange())
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...