43#ifndef LASS_GUARDIAN_OF_INCLUSION_NUM_NUM_CAST_H
44#define LASS_GUARDIAN_OF_INCLUSION_NUM_NUM_CAST_H
53class BadNumCast:
public util::ExceptionMixin<BadNumCast>
56 BadNumCast(std::string msg, std::string loc): util::ExceptionMixin<BadNumCast>(std::move(msg), std::move(loc)) {}
57 ~BadNumCast() noexcept {}
63template <
typename Out,
typename In,
bool signedOut,
bool signedIn>
struct NumCaster;
65template <
typename Out,
typename In>
66struct NumCaster<Out, In, true, true>
70 static Out cast(In in)
72 static_assert(num::NumTraits<In>::isSigned ==
true);
73 static_assert(num::NumTraits<Out>::isSigned ==
true);
75 using TCommon = std::common_type_t<In, Out, int>;
76 static_assert(num::NumTraits<TCommon>::isSigned ==
true);
78 constexpr TCommon min = num::NumTraits<Out>::min;
79 constexpr TCommon max = num::NumTraits<Out>::max;
80 if (
static_cast<TCommon
>(in) < min)
82 LASS_THROW_EX(BadNumCast,
"not a " << num::NumTraits<Out>::name()
83 <<
": underflow: " <<
static_cast<TCommon
>(in) <<
" < " << min);
85 if (
static_cast<TCommon
>(in) > max)
87 LASS_THROW_EX(BadNumCast,
"not a " << num::NumTraits<Out>::name()
88 <<
": overflow: " <<
static_cast<TCommon
>(in) <<
" > " << max);
90 return static_cast<Out
>(
in);
94template <
typename Out,
typename In>
95struct NumCaster<Out, In, false, true>
99 static Out cast(In in)
101 static_assert(num::NumTraits<In>::isSigned ==
true);
102 static_assert(num::NumTraits<Out>::isSigned ==
false);
103 using TUnsignedIn =
typename num::NumTraits<In>::unsignedType;
105 using TCommon = std::common_type_t<TUnsignedIn, Out, unsigned>;
106 static_assert(num::NumTraits<TCommon>::isSigned ==
false);
108 constexpr TCommon max = num::NumTraits<Out>::max;
111 using TSigned = std::common_type_t<In, int>;
112 LASS_THROW_EX(BadNumCast,
"not a " << num::NumTraits<Out>::name()
113 <<
": negative: " <<
static_cast<TSigned
>(in));
115 if (
static_cast<TCommon
>(in) > max)
117 LASS_THROW_EX(BadNumCast,
"not a " << num::NumTraits<Out>::name()
118 <<
": overflow: " <<
static_cast<TCommon
>(in) <<
" > " << max);
120 return static_cast<Out
>(
in);
124template <
typename Out,
typename In,
bool signedOut>
125struct NumCaster<Out, In, signedOut, false>
129 static Out cast(In in)
131 static_assert(num::NumTraits<In>::isSigned ==
false);
132 using TUnsignedOut =
typename num::NumTraits<Out>::unsignedType;
134 using TCommon = std::common_type_t<In, TUnsignedOut, unsigned>;
135 static_assert(num::NumTraits<TCommon>::isSigned ==
false);
137 constexpr TCommon max = num::NumTraits<Out>::max;
138 if (
static_cast<TCommon
>(in) > max)
140 LASS_THROW_EX(BadNumCast,
"not a " << num::NumTraits<Out>::name()
141 <<
": overflow: " <<
static_cast<TCommon
>(in) <<
" > " << max);
143 return static_cast<Out
>(
in);
147template <
typename Out>
148struct NumCaster<Out, Out, true, true>
150 static Out cast(Out in) {
return in; }
153template <
typename Out>
154struct NumCaster<Out, Out, false, false>
156 static Out cast(Out in) {
return in; }
161template <
typename Out,
typename In>
164 return impl::NumCaster<Out, In, NumTraits<Out>::isSigned, NumTraits<In>::isSigned>::cast(in);
numeric types and traits.
ColorRGBA in(const ColorRGBA &a, const ColorRGBA &b)
part of a inside b.
Library for Assembled Shared Sources.