parselink-old/tests/msgpack/rng.h

40 lines
913 B
C++

#ifndef tests_rng_483f8f25f09ae06
#define tests_rng_483f8f25f09ae06
#include <array>
#include <random>
struct rng {
rng(auto s) : seed(s), generator(seed) {}
rng() : rng([]{ return std::random_device{}(); }()) {}
template <typename T>
requires std::is_integral_v<T>
T get() noexcept {
union {
std::array<std::mt19937::result_type, 1 + sizeof(T) / sizeof(std::mt19937::result_type)> data;
T v;
} u;
for (auto& d : u.data) {
d = generator();
}
return u.v;
}
template <typename T, std::size_t N>
requires std::is_integral_v<T>
auto get() noexcept {
std::array<T, N> values;
for (auto& value : values) {
value = get<T>();
}
return values;
}
std::random_device::result_type seed;
std::mt19937 generator;
};
#endif // tests_rng_483f8f25f09ae06