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// SPDX-FileCopyrightText: Copyright (C) 2023 Tobias Hienzsch
3
4#ifndef TETL_RANDOM_UNIFORM_INT_DISTRIBUTION_HPP
5#define TETL_RANDOM_UNIFORM_INT_DISTRIBUTION_HPP
6
7#include <etl/_limits/numeric_limits.hpp>
8
9namespace etl {
10
11/// \ingroup random
12template <typename IntType = int>
14 using result_type = IntType;
15
16 struct param_type {
17 using distribution_type = uniform_int_distribution;
18
19 constexpr param_type() noexcept = default;
20
21 explicit constexpr param_type(result_type min, result_type max = result_type(1)) noexcept
22 : _min{min}
23 , _max{max}
24 {
25 }
26
27 [[nodiscard]] constexpr auto a() const noexcept -> result_type
28 {
29 return _min;
30 }
31
32 [[nodiscard]] constexpr auto b() const noexcept -> result_type
33 {
34 return _max;
35 }
36
37 [[nodiscard]] friend constexpr auto operator==(param_type const& lhs, param_type const& rhs) noexcept -> bool
38 {
39 return (lhs._min == rhs._min) and (lhs._max == rhs._max);
40 }
41
42 private:
43 result_type _min{0};
44 result_type _max{numeric_limits<result_type>::max()};
45 };
46
49 {
50 }
51
52 explicit constexpr uniform_int_distribution(param_type const& parm)
53 : _param{parm}
54 {
55 }
56
57 explicit constexpr uniform_int_distribution(IntType a, IntType b = numeric_limits<IntType>::max())
59 {
60 }
61
62 constexpr auto param(param_type const& parm) -> void
63 {
64 _param = parm;
65 }
66
67 [[nodiscard]] constexpr auto param() const -> param_type
68 {
69 return _param;
70 }
71
72 [[nodiscard]] constexpr auto a() const -> result_type
73 {
74 return _param.a();
75 }
76
77 [[nodiscard]] constexpr auto b() const -> result_type
78 {
79 return _param.b();
80 }
81
82 [[nodiscard]] constexpr auto min() const -> result_type
83 {
84 return a();
85 }
86
87 [[nodiscard]] constexpr auto max() const -> result_type
88 {
89 return b();
90 }
91
92 constexpr auto reset() -> void
93 {
94 (void)this;
95 }
96
97 template <typename URBG>
98 [[nodiscard]] constexpr auto operator()(URBG& g) noexcept(noexcept(g())) -> result_type
99 {
100 return (*this)(g, _param);
101 }
102
103 template <typename URBG>
104 [[nodiscard]] constexpr auto operator()(URBG& g, param_type const& parm) noexcept(noexcept(g())) -> result_type
105 {
106 auto const random = g();
107 auto const range = static_cast<decltype(g())>(parm.b() - parm.a());
108 return static_cast<result_type>(parm.a() + static_cast<result_type>(random % range));
109 }
110
111 friend constexpr auto operator==(uniform_int_distribution const& x, uniform_int_distribution const& y) -> bool
112 {
113 return x.param() == y.param();
114 }
115
116private:
117 param_type _param;
118};
119
120} // namespace etl
121
122#endif // TETL_RANDOM_UNIFORM_INT_DISTRIBUTION_HPP
Definition adjacent_find.hpp:9
Definition numeric_limits.hpp:18
Definition uniform_int_distribution.hpp:16
constexpr auto a() const noexcept -> result_type
Definition uniform_int_distribution.hpp:27
constexpr param_type() noexcept=default
constexpr param_type(result_type min, result_type max=result_type(1)) noexcept
Definition uniform_int_distribution.hpp:21
constexpr auto b() const noexcept -> result_type
Definition uniform_int_distribution.hpp:32
friend constexpr auto operator==(param_type const &lhs, param_type const &rhs) noexcept -> bool
Definition uniform_int_distribution.hpp:37
Definition uniform_int_distribution.hpp:13
constexpr auto param(param_type const &parm) -> void
Definition uniform_int_distribution.hpp:62
constexpr auto operator()(URBG &g) noexcept(noexcept(g())) -> result_type
Definition uniform_int_distribution.hpp:98
constexpr auto min() const -> result_type
Definition uniform_int_distribution.hpp:82
constexpr auto reset() -> void
Definition uniform_int_distribution.hpp:92
constexpr auto param() const -> param_type
Definition uniform_int_distribution.hpp:67
constexpr uniform_int_distribution()
Definition uniform_int_distribution.hpp:47
constexpr auto a() const -> result_type
Definition uniform_int_distribution.hpp:72
constexpr auto max() const -> result_type
Definition uniform_int_distribution.hpp:87
constexpr uniform_int_distribution(IntType a, IntType b=numeric_limits< IntType >::max())
Definition uniform_int_distribution.hpp:57
friend constexpr auto operator==(uniform_int_distribution const &x, uniform_int_distribution const &y) -> bool
Definition uniform_int_distribution.hpp:111
constexpr auto b() const -> result_type
Definition uniform_int_distribution.hpp:77
constexpr uniform_int_distribution(param_type const &parm)
Definition uniform_int_distribution.hpp:52
constexpr auto operator()(URBG &g, param_type const &parm) noexcept(noexcept(g())) -> result_type
Definition uniform_int_distribution.hpp:104