tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
uniform_int_distribution.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_RANDOM_UNIFORM_INT_DISTRIBUTION_HPP
4#define TETL_RANDOM_UNIFORM_INT_DISTRIBUTION_HPP
5
7
8namespace etl {
9
11template <typename IntType = int>
13 using result_type = IntType;
14
15 struct param_type {
17
18 constexpr param_type() noexcept = default;
19
20 explicit constexpr param_type(result_type min, result_type max = result_type(1)) noexcept
21 : _min{min}
22 , _max{max}
23 {
24 }
25
26 [[nodiscard]] constexpr auto a() const noexcept -> result_type { return _min; }
27
28 [[nodiscard]] constexpr auto b() const noexcept -> result_type { return _max; }
29
30 [[nodiscard]] friend constexpr auto operator==(param_type const& lhs, param_type const& rhs) noexcept -> bool
31 {
32 return (lhs._min == rhs._min) and (lhs._max == rhs._max);
33 }
34
35 private:
36 result_type _min{0};
38 };
39
44
45 explicit constexpr uniform_int_distribution(param_type const& parm)
46 : _param{parm}
47 {
48 }
49
50 explicit constexpr uniform_int_distribution(IntType a, IntType b = numeric_limits<IntType>::max())
52 {
53 }
54
55 constexpr auto param(param_type const& parm) -> void { _param = parm; }
56
57 [[nodiscard]] constexpr auto param() const -> param_type { return _param; }
58
59 [[nodiscard]] constexpr auto a() const -> result_type { return _param.a(); }
60
61 [[nodiscard]] constexpr auto b() const -> result_type { return _param.b(); }
62
63 [[nodiscard]] constexpr auto min() const -> result_type { return a(); }
64
65 [[nodiscard]] constexpr auto max() const -> result_type { return b(); }
66
67 constexpr auto reset() -> void { (void)this; }
68
69 template <typename URBG>
70 [[nodiscard]] constexpr auto operator()(URBG& g) noexcept(noexcept(g())) -> result_type
71 {
72 return (*this)(g, _param);
73 }
74
75 template <typename URBG>
76 [[nodiscard]] constexpr auto operator()(URBG& g, param_type const& parm) noexcept(noexcept(g())) -> result_type
77 {
78 auto const random = g();
79 auto const range = static_cast<decltype(g())>(parm.b() - parm.a());
80 return static_cast<result_type>(parm.a() + static_cast<result_type>((random % range)));
81 }
82
83 friend constexpr auto operator==(uniform_int_distribution const& x, uniform_int_distribution const& y) -> bool
84 {
85 return x.param() == y.param();
86 }
87
88private:
89 param_type _param;
90};
91
92} // namespace etl
93
94#endif // TETL_RANDOM_UNIFORM_INT_DISTRIBUTION_HPP
Definition adjacent_find.hpp:8
static constexpr auto max() noexcept
Definition numeric_limits.hpp:21
Definition uniform_int_distribution.hpp:15
uniform_int_distribution distribution_type
Definition uniform_int_distribution.hpp:16
constexpr auto a() const noexcept -> result_type
Definition uniform_int_distribution.hpp:26
constexpr param_type() noexcept=default
constexpr auto b() const noexcept -> result_type
Definition uniform_int_distribution.hpp:28
friend constexpr auto operator==(param_type const &lhs, param_type const &rhs) noexcept -> bool
Definition uniform_int_distribution.hpp:30
constexpr auto param(param_type const &parm) -> void
Definition uniform_int_distribution.hpp:55
constexpr auto operator()(URBG &g) noexcept(noexcept(g())) -> result_type
Definition uniform_int_distribution.hpp:70
constexpr auto min() const -> result_type
Definition uniform_int_distribution.hpp:63
constexpr auto reset() -> void
Definition uniform_int_distribution.hpp:67
constexpr auto param() const -> param_type
Definition uniform_int_distribution.hpp:57
constexpr uniform_int_distribution()
Definition uniform_int_distribution.hpp:40
constexpr auto a() const -> result_type
Definition uniform_int_distribution.hpp:59
constexpr auto max() const -> result_type
Definition uniform_int_distribution.hpp:65
constexpr uniform_int_distribution(IntType a, IntType b=numeric_limits< IntType >::max())
Definition uniform_int_distribution.hpp:50
friend constexpr auto operator==(uniform_int_distribution const &x, uniform_int_distribution const &y) -> bool
Definition uniform_int_distribution.hpp:83
IntType result_type
Definition uniform_int_distribution.hpp:13
constexpr auto b() const -> result_type
Definition uniform_int_distribution.hpp:61
constexpr uniform_int_distribution(param_type const &parm)
Definition uniform_int_distribution.hpp:45
constexpr auto operator()(URBG &g, param_type const &parm) noexcept(noexcept(g())) -> result_type
Definition uniform_int_distribution.hpp:76