• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 Hans Dembinski
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt
5 // or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 #ifndef BOOST_HISTOGRAM_TEST_UTILITY_HISTOGRAM_HPP
8 #define BOOST_HISTOGRAM_TEST_UTILITY_HISTOGRAM_HPP
9 
10 #include <boost/histogram/axis/category.hpp>
11 #include <boost/histogram/axis/integer.hpp>
12 #include <boost/histogram/axis/regular.hpp>
13 #include <boost/histogram/axis/variable.hpp>
14 #include <boost/histogram/axis/variant.hpp>
15 #include <boost/histogram/make_histogram.hpp>
16 #include <boost/mp11/algorithm.hpp>
17 #include <type_traits>
18 #include <vector>
19 
20 namespace boost {
21 namespace histogram {
22 
23 template <class... Ts>
make_axis_vector(const Ts &...ts)24 auto make_axis_vector(const Ts&... ts) {
25   // make sure the variant is never trivial (contains only one type)
26   using R = axis::regular<double, boost::use_default, axis::null_type>;
27   using I = axis::integer<int, axis::null_type, axis::option::none_t>;
28   using V = axis::variable<double, axis::null_type>;
29   using C = axis::category<int, axis::null_type>;
30   using Var = boost::mp11::mp_unique<axis::variant<Ts..., R, I, V, C>>;
31   return std::vector<Var>({Var(ts)...});
32 }
33 
34 struct static_tag : std::false_type {};
35 struct dynamic_tag : std::true_type {};
36 
37 template <class... Axes>
make(static_tag,const Axes &...axes)38 auto make(static_tag, const Axes&... axes) {
39   return make_histogram(axes...);
40 }
41 
42 template <class S, class... Axes>
make_s(static_tag,S && s,const Axes &...axes)43 auto make_s(static_tag, S&& s, const Axes&... axes) {
44   return make_histogram_with(s, axes...);
45 }
46 
47 template <class... Axes>
make(dynamic_tag,const Axes &...axes)48 auto make(dynamic_tag, const Axes&... axes) {
49   return make_histogram(make_axis_vector(axes...));
50 }
51 
52 template <class S, class... Axes>
make_s(dynamic_tag,S && s,const Axes &...axes)53 auto make_s(dynamic_tag, S&& s, const Axes&... axes) {
54   return make_histogram_with(s, make_axis_vector(axes...));
55 }
56 
57 } // namespace histogram
58 } // namespace boost
59 
60 #endif
61