21 #ifndef PLAYRHO_COMMON_BOUNDEDVALUE_HPP
22 #define PLAYRHO_COMMON_BOUNDEDVALUE_HPP
28 #include <type_traits>
55 template <
typename T,
class Enable =
void>
65 template<
class T,
class =
void>
70 struct HasOne<T, detail::
VoidT<decltype(T{1}) > >: std::true_type {};
85 PLAYRHO_CONSTEXPR inline std::enable_if_t<std::numeric_limits<T>::has_infinity,
void>
88 if (!(value > -std::numeric_limits<T>::infinity()))
96 PLAYRHO_CONSTEXPR inline std::enable_if_t<!std::numeric_limits<T>::has_infinity,
void>
103 template <
typename T>
104 PLAYRHO_CONSTEXPR inline std::enable_if_t<std::numeric_limits<T>::has_infinity,
void>
107 if (!(value < +std::numeric_limits<T>::infinity()))
114 template <
typename T>
115 PLAYRHO_CONSTEXPR inline std::enable_if_t<!std::numeric_limits<T>::has_infinity,
void>
124 template <
typename T, LoValueCheck lo, HiValueCheck hi>
166 CheckIfAboveNegInf<T>(value);
199 throw exception_type{
"BoundedValue: value's type does not have trivial 1"};
220 template <
typename U>
232 m_value{std::move(value.m_value)}
244 m_value = other.m_value;
258 template <
typename U>
262 const auto value = T(tmpVal);
274 m_value = std::move(value.m_value);
291 template <
typename U = T>
298 template <
typename U = T>
312 template <
typename T, LoValueCheck lo, HiValueCheck hi>
315 return T{lhs} == T{rhs};
319 template <
typename T, LoValueCheck lo, HiValueCheck hi>
322 return T{lhs} != T{rhs};
328 template <
typename T, LoValueCheck lo, HiValueCheck hi>
331 return T{lhs} <= T{rhs};
335 template <
typename T, LoValueCheck lo, HiValueCheck hi>
338 return T{lhs} >= T{rhs};
342 template <
typename T, LoValueCheck lo, HiValueCheck hi>
345 return T{lhs} < T{rhs};
349 template <
typename T, LoValueCheck lo, HiValueCheck hi>
352 return T{lhs} > T{rhs};
356 template <
typename T, LoValueCheck lo, HiValueCheck hi>
359 return T{lhs} * T{rhs};
363 template <
typename T, LoValueCheck lo, HiValueCheck hi>
366 return T{lhs} / T{rhs};
370 template <
typename T, LoValueCheck lo, HiValueCheck hi>
373 return T{lhs} + T{rhs};
377 template <
typename T, LoValueCheck lo, HiValueCheck hi>
380 return T{lhs} - T{rhs};
386 template <
typename T, LoValueCheck lo, HiValueCheck hi>
389 return T{lhs} == rhs;
393 template <
typename T, LoValueCheck lo, HiValueCheck hi>
396 return T{lhs} != rhs;
402 template <
typename T, LoValueCheck lo, HiValueCheck hi>
405 return T{lhs} <= rhs;
409 template <
typename T, LoValueCheck lo, HiValueCheck hi>
412 return T{lhs} >= rhs;
416 template <
typename T, LoValueCheck lo, HiValueCheck hi>
423 template <
typename T, LoValueCheck lo, HiValueCheck hi>
430 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
437 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
444 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
451 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
454 return T{lhs} - T{rhs};
460 template <
typename T, LoValueCheck lo, HiValueCheck hi>
463 return lhs == T{rhs};
467 template <
typename T, LoValueCheck lo, HiValueCheck hi>
470 return lhs != T{rhs};
476 template <
typename T, LoValueCheck lo, HiValueCheck hi>
479 return lhs <= T{rhs};
483 template <
typename T, LoValueCheck lo, HiValueCheck hi>
486 return lhs >= T{rhs};
490 template <
typename T, LoValueCheck lo, HiValueCheck hi>
497 template <
typename T, LoValueCheck lo, HiValueCheck hi>
504 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
511 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
518 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
525 template <
typename T,
typename U, LoValueCheck lo, HiValueCheck hi>
545 template <
typename T>
546 using NonNegative = std::enable_if_t<!std::is_pointer<T>::value,
550 template <
typename T>
554 template <
typename T>
558 template <
typename T>
562 template <
typename T>
566 template <
typename T>
567 using NonZero = std::enable_if_t<!std::is_pointer<T>::value,
572 template <
typename T>
573 using NonNull = std::enable_if_t<std::is_pointer<T>::value,
577 template <
typename T>
583 template <
typename T, LoValueCheck lo, HiValueCheck hi>
586 return os << T{value};
591 #endif // PLAYRHO_COMMON_BOUNDEDVALUE_HPP