50 void validate()
const {
51 if (!(
min <=
max) || !std::isfinite(
static_cast<long double>(
min)) ||
52 !std::isfinite(
static_cast<long double>(
max)))
53 throw std::invalid_argument(
"InRange requires finite ordered bounds");
56 template <
class U = T>
57 typename std::enable_if<std::is_integral<U>::value, T>::type sample(Rng& rng)
const {
59 using Int =
typename std::conditional<std::is_signed<U>::value, int64_t, uint64_t>::type;
60 std::uniform_int_distribution<Int> distribution(
min,
max);
61 return static_cast<T
>(distribution(rng));
64 template <
class U = T>
65 typename std::enable_if<std::is_floating_point<U>::value, T>::type sample(Rng& rng)
const {
67 const T fraction =
static_cast<T
>(rng.uniform01());
70 ?
min * (T(1) - fraction) +
max * fraction
72 return value < min ? min : value >
max ?
max : value;
DomainConvertable is a base class for domains that can be converted to and from a ValueType.
Definition domain.h:48