9template<concepts::Integer T =
int>
20 constexpr auto a() const -> T {
return m_a; }
21 constexpr auto b() const -> T {
return m_b; }
25 return a.a() ==
b.a() &&
a.b() ==
b.b();
38 template<
typename Gen>
40 constexpr auto operator()(Gen&& generator)
const -> T {
41 return (*
this)(generator,
param());
44 template<
typename Gen>
46 constexpr auto operator()(Gen&& generator,
Param const&
param)
const -> T {
55 constexpr U generated_range = generated_max - generated_min;
62 auto generate = [&] -> U {
63 return generator() - generated_min;
68 U desired_range =
b -
a;
70 if (generated_range == desired_range) {
73 return a + generate();
76 if (generated_range > desired_range) {
83 U
const desired_size = desired_range + 1;
84 U
const scale_factor = generated_range / desired_size;
85 U
const out_of_bounds = desired_size * scale_factor;
87 auto result = generate();
88 if (result >= out_of_bounds) {
91 return a + result / scale_factor;
102 auto const generated_size = U(generated_range + 1);
104 U
const base_index = generated_size * (*this)(generator,
Param(0U, desired_range / generated_size));
105 U
const index = generate();
106 U
const result = base_index + index;
109 if (result > desired_range || result < base_index) {
117 constexpr auto a() const -> T {
return m_param.a(); }
118 constexpr auto b() const -> T {
return m_param.b(); }
123 constexpr auto min() const -> T {
return a(); }
124 constexpr auto max() const -> T {
return b(); }
128 return a.param() ==
b.param();
Definition uniform_int_distribution.h:8
Definition zstring_parser.h:9
Definition numeric_limits.h:7