• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/boostorg/beast
8 //
9 
10 #ifndef BOOST_BEAST_CORE_DETAIL_PCG_HPP
11 #define BOOST_BEAST_CORE_DETAIL_PCG_HPP
12 
13 #include <boost/core/ignore_unused.hpp>
14 #include <cstdint>
15 #include <random>
16 
17 namespace boost {
18 namespace beast {
19 namespace detail {
20 
21 class pcg
22 {
23     std::uint64_t state_ = 0;
24     std::uint64_t increment_;
25 
26 public:
27     using result_type = std::uint32_t;
28 
29     // Initialize the generator.
30     // There are no restrictions on the input values.
pcg(std::uint64_t seed,std::uint64_t stream)31     pcg(
32         std::uint64_t seed,
33         std::uint64_t stream)
34     {
35         // increment must be odd
36         increment_ = 2 * stream + 1;
37         boost::ignore_unused((*this)());
38         state_ += seed;
39         boost::ignore_unused((*this)());
40     }
41 
42     std::uint32_t
operator ()()43     operator()()
44     {
45         std::uint64_t const p = state_;
46         state_ = p *
47             6364136223846793005ULL +
48             increment_;
49         std::uint32_t const x =
50             static_cast<std::uint32_t>(
51             ((p >> 18) ^ p) >> 27);
52         std::uint32_t const r = p >> 59;
53     #ifdef BOOST_MSVC
54         return _rotr(x, r);
55     #else
56         return (x >> r) | (x << ((1 + ~r) & 31));
57     #endif
58     }
59 };
60 
61 } // detail
62 } // beast
63 } // boost
64 
65 #endif
66