62#if defined(__has_include) && __has_include(<type_traits>)
65template <
typename A,
typename B>
66 using common_pair_t =
typename std::common_type<A,B>::type;
68template <
typename A,
typename B,
typename C>
69 using common_triple_t =
typename std::common_type<A,B,C>::type;
74template <
typename A,
typename B>
76 using type =
decltype(
true ? A{} : B{});
78template <
typename A,
typename B>
79 using common_pair_t =
typename common_pair_type<A,B>::type;
81template <
typename A,
typename B,
typename C>
83 using type =
decltype(
true ?
true ? A{} : B{} : C{});
85template <
typename A,
typename B,
typename C>
86 using common_triple_t =
typename common_triple_type<A,B,C>::type;
93template <
class A,
class B>
94constexpr common_pair_t<A,B> min(A a, B b) {
95 typedef common_pair_t<A,B> R;
96 return (
static_cast<R
>(a) <
static_cast<R
>(b)) ?
101template <
class A,
class B>
102constexpr common_pair_t<A,B> max(A a, B b) {
103 typedef common_pair_t<A,B> R;
104 return (
static_cast<R
>(a) >
static_cast<R
>(b)) ?
111constexpr T abs(T x) {
112 return (x < T{0}) ? -x : x;
117template <
class A,
class L,
class H>
118constexpr common_triple_t<A,L,H>
119constrain(A amt, L low, H high) {
120 typedef common_triple_t<A,L,H> R;
121 return (
static_cast<R
>(amt) <
static_cast<R
>(low) ?
static_cast<R
>(low) :
122 static_cast<R>(amt) > static_cast<R>(high) ? static_cast<R>(high) :
123 static_cast<R>(amt));
127template <
typename Float>
128constexpr long round(Float x) {
129 return (x >= Float{0})
130 ?
static_cast<long>(x + Float{0.5})
131 : static_cast<long>(x - Float{0.5});
136constexpr double radians(T deg) {
137 return deg * DEG_TO_RAD;
141constexpr double degrees(T rad) {
142 return rad * RAD_TO_DEG;
147constexpr T sq(T x) {
return x * x; }
152#define min(a,b) (::pq::min((a),(b)))
153#define max(a,b) (::pq::max((a),(b)))
154#define abs(x) (::pq::abs((x)))
155#define constrain(x,l,h) (::pq::constrain((x),(l),(h)))
156#define round(x) (::pq::round((x)))
157#define radians(d) (::pq::radians((d)))
158#define degrees(r) (::pq::degrees((r)))
159#define sq(x) (::pq::sq((x)))