summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/histogram/benchmark/generator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/histogram/benchmark/generator.hpp')
-rw-r--r--src/boost/libs/histogram/benchmark/generator.hpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/boost/libs/histogram/benchmark/generator.hpp b/src/boost/libs/histogram/benchmark/generator.hpp
new file mode 100644
index 00000000..f613ced3
--- /dev/null
+++ b/src/boost/libs/histogram/benchmark/generator.hpp
@@ -0,0 +1,50 @@
+// Copyright 2019 Hans Dembinski
+//
+// 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)
+
+#include <array>
+#include <random>
+
+using uniform = std::uniform_real_distribution<>;
+using uniform_int = std::uniform_int_distribution<>;
+using normal = std::normal_distribution<>;
+
+template <class Distribution, class... Ts>
+Distribution init(Ts...);
+
+template <>
+uniform init<uniform>() {
+ return uniform{0.0, 1.0};
+}
+
+template <>
+normal init<normal>() {
+ return normal{0.5, 0.3};
+}
+
+template <>
+uniform_int init<uniform_int, int>(int n) {
+ return uniform_int{0, n};
+}
+
+template <class Distribution, std::size_t N = 1 << 15>
+struct generator : std::array<double, N> {
+ using base_t = std::array<double, N>;
+
+ template <class... Ts>
+ generator(Ts... ts) {
+ std::default_random_engine rng(1);
+ auto dis = init<Distribution>(ts...);
+ std::generate(base_t::begin(), base_t::end(), [&] { return dis(rng); });
+ }
+
+ const double& operator()() {
+ ++ptr_;
+ if (ptr_ == base_t::data() + N) ptr_ = base_t::data();
+ return *ptr_;
+ }
+
+ const double* ptr_ = base_t::data() - 1;
+};