66#if defined(__has_include) && __has_include(<type_traits>)
69template <
typename A,
typename B>
70 using common_pair_t =
typename std::common_type<A,B>::type;
72template <
typename A,
typename B,
typename C>
73 using common_triple_t =
typename std::common_type<A,B,C>::type;
78template <
typename A,
typename B>
80 using type =
decltype(
true ? A{} : B{});
82template <
typename A,
typename B>
83 using common_pair_t =
typename common_pair_type<A,B>::type;
85template <
typename A,
typename B,
typename C>
87 using type =
decltype(
true ?
true ? A{} : B{} : C{});
89template <
typename A,
typename B,
typename C>
90 using common_triple_t =
typename common_triple_type<A,B,C>::type;
100#if !defined(TEENSYDUINO)
101template <
class A,
class B>
102constexpr common_pair_t<A,B> min(A a, B b) {
103 typedef common_pair_t<A,B> R;
104 return (
static_cast<R
>(a) <
static_cast<R
>(b)) ?
109template <
class A,
class B>
110constexpr common_pair_t<A,B> max(A a, B b) {
111 typedef common_pair_t<A,B> R;
112 return (
static_cast<R
>(a) >
static_cast<R
>(b)) ?
120constexpr T abs(T x) {
121 return (x < T{0}) ? -x : x;
126template <
class A,
class L,
class H>
127constexpr common_triple_t<A,L,H>
128constrain(A amt, L low, H high) {
129 typedef common_triple_t<A,L,H> R;
130 return (
static_cast<R
>(amt) <
static_cast<R
>(low) ?
static_cast<R
>(low) :
131 static_cast<R>(amt) > static_cast<R>(high) ? static_cast<R>(high) :
132 static_cast<R>(amt));
136template <
typename Float>
137constexpr long round(Float x) {
138 return (x >= Float{0})
139 ?
static_cast<long>(x + Float{0.5})
140 : static_cast<long>(x - Float{0.5});
145constexpr double radians(T deg) {
146 return deg * DEG_TO_RAD;
150constexpr double degrees(T rad) {
151 return rad * RAD_TO_DEG;
156constexpr T sq(T x) {
return x * x; }