summaryrefslogtreecommitdiff
path: root/boost/beast/core/detail/pcg.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/core/detail/pcg.hpp')
-rw-r--r--boost/beast/core/detail/pcg.hpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/boost/beast/core/detail/pcg.hpp b/boost/beast/core/detail/pcg.hpp
new file mode 100644
index 0000000000..2815882afa
--- /dev/null
+++ b/boost/beast/core/detail/pcg.hpp
@@ -0,0 +1,65 @@
+//
+// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
+//
+// 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_CORE_DETAIL_PCG_HPP
+#define BOOST_BEAST_CORE_DETAIL_PCG_HPP
+
+#include <boost/core/ignore_unused.hpp>
+#include <cstdint>
+#include <random>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class pcg
+{
+ std::uint64_t state_ = 0;
+ std::uint64_t increment_;
+
+public:
+ using result_type = std::uint32_t;
+
+ // Initialize the generator.
+ // There are no restrictions on the input values.
+ pcg(
+ std::uint64_t seed,
+ std::uint64_t stream)
+ {
+ // increment must be odd
+ increment_ = 2 * stream + 1;
+ boost::ignore_unused((*this)());
+ state_ += seed;
+ boost::ignore_unused((*this)());
+ }
+
+ std::uint32_t
+ operator()()
+ {
+ std::uint64_t const p = state_;
+ state_ = p *
+ 6364136223846793005ULL +
+ increment_;
+ std::uint32_t const x =
+ static_cast<std::uint32_t>(
+ ((p >> 18) ^ p) >> 27);
+ std::uint32_t const r = p >> 59;
+ #ifdef BOOST_MSVC
+ return _rotr(x, r);
+ #else
+ return (x >> r) | (x << ((1 + ~r) & 31));
+ #endif
+ }
+};
+
+} // detail
+} // beast
+} // boost
+
+#endif