From c8d309872545bd30513c8b021a6523e4f74249c5 Mon Sep 17 00:00:00 2001 From: powerof3 Date: Sun, 6 Sep 2026 14:43:27 +0530 Subject: [PATCH] feat: make `TRandom` `std::uniform_random_bit_generator` compliant --- include/REX/TRandom.h | 16 +++++++++++----- src/REX/TRandom.cpp | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/include/REX/TRandom.h b/include/REX/TRandom.h index e46b63d..7edd3ff 100644 --- a/include/REX/TRandom.h +++ b/include/REX/TRandom.h @@ -11,14 +11,17 @@ namespace REX class TRandom { public: + using result_type = std::uint64_t; + TRandom(); TRandom(std::uint32_t a_seed); TRandom(std::uint64_t a_seed); - static constexpr T min() { return std::numeric_limits::min(); } - static constexpr T max() { return std::numeric_limits::max(); } + static constexpr result_type min() noexcept { return std::numeric_limits::min(); } + static constexpr result_type max() noexcept { return std::numeric_limits::max(); } + result_type operator()() noexcept; - T Generate(T a_min = min(), T a_max = max()); + T Generate(T a_min = std::numeric_limits::min(), T a_max = std::numeric_limits::max()); protected: std::byte m_rng[32]; @@ -29,13 +32,16 @@ namespace REX class TRandomDistribution { public: + using result_type = std::uint64_t; + TRandomDistribution() = delete; TRandomDistribution(std::vector& a_weights); TRandomDistribution(std::uint32_t a_seed, std::vector& a_weights); TRandomDistribution(std::uint64_t a_seed, std::vector& a_weights); - static constexpr T min() { return std::numeric_limits::min(); } - static constexpr T max() { return std::numeric_limits::max(); } + static constexpr result_type min() noexcept { return std::numeric_limits::min(); } + static constexpr result_type max() noexcept { return std::numeric_limits::max(); } + result_type operator()() noexcept; T Generate(); diff --git a/src/REX/TRandom.cpp b/src/REX/TRandom.cpp index af55a82..08f9bd7 100644 --- a/src/REX/TRandom.cpp +++ b/src/REX/TRandom.cpp @@ -24,6 +24,11 @@ std::memcpy(&m_rng, &rng, 32); \ } \ template <> \ + TRandom::result_type TRandom::operator()() noexcept \ + { \ + return (*reinterpret_cast(m_rng))(); \ + } \ + template <> \ T TRandom::Generate(T a_min, T a_max) \ { \ std::uniform_##KIND##_distribution dist(a_min, a_max); \ @@ -53,6 +58,11 @@ std::memcpy(&m_rng, &rng, sizeof(m_rng)); \ } \ template <> \ + TRandomDistribution::result_type TRandomDistribution::operator()() noexcept \ + { \ + return (*reinterpret_cast(m_rng))(); \ + } \ + template <> \ T TRandomDistribution::Generate() \ { \ return m_dist(*reinterpret_cast(m_rng)); \ @@ -70,6 +80,17 @@ namespace REX REX_DEFINE_RANDOM_DIST_FUNCTIONS(std::int64_t); REX_DEFINE_RANDOM_DIST_FUNCTIONS(std::uint32_t); REX_DEFINE_RANDOM_DIST_FUNCTIONS(std::uint64_t); + + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); + static_assert(std::uniform_random_bit_generator); } # undef XOSHIROCPP_NODISCARD_CXX20