| /* |
| * Created by Martin on 30/08/2017. |
| * |
| * Distributed under the Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| #ifndef TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED |
| #define TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED |
| |
| #include <cstdint> |
| |
| namespace Catch { |
| |
| // This is a simple implementation of C++11 Uniform Random Number |
| // Generator. It does not provide all operators, because Catch2 |
| // does not use it, but it should behave as expected inside stdlib's |
| // distributions. |
| // The implementation is based on the PCG family (http://pcg-random.org) |
| class SimplePcg32 { |
| using state_type = std::uint64_t; |
| public: |
| using result_type = std::uint32_t; |
| static constexpr result_type (min)() { |
| return 0; |
| } |
| static constexpr result_type (max)() { |
| return static_cast<result_type>(-1); |
| } |
| |
| // Provide some default initial state for the default constructor |
| SimplePcg32():SimplePcg32(0xed743cc4U) {} |
| |
| explicit SimplePcg32(result_type seed_); |
| |
| void seed(result_type seed_); |
| void discard(uint64_t skip); |
| |
| result_type operator()(); |
| |
| private: |
| friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs); |
| friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs); |
| |
| // In theory we also need operator<< and operator>> |
| // In practice we do not use them, so we will skip them for now |
| |
| |
| std::uint64_t m_state; |
| // This part of the state determines which "stream" of the numbers |
| // is chosen -- we take it as a constant for Catch2, so we only |
| // need to deal with seeding the main state. |
| // Picked by reading 8 bytes from `/dev/random` :-) |
| static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL; |
| }; |
| |
| } // end namespace Catch |
| |
| #endif // TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED |