1 // Copyright 2015-2019 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_FWD_HPP
8 #define BOOST_HISTOGRAM_FWD_HPP
9 
10 /**
11   \file boost/histogram/fwd.hpp
12   Forward declarations, tag types and type aliases.
13 */
14 
15 #include <boost/config.hpp> // BOOST_ATTRIBUTE_NODISCARD
16 #include <boost/core/use_default.hpp>
17 #include <vector>
18 
19 namespace boost {
20 namespace histogram {
21 
22 /// Tag type to indicate use of a default type
23 using boost::use_default;
24 
25 namespace axis {
26 
27 /// Integral type for axis indices
28 using index_type = int;
29 
30 /// Real type for axis indices
31 using real_index_type = double;
32 
33 /// Empty metadata type
34 struct null_type {
35   template <class Archive>
serializeboost::histogram::axis::null_type36   void serialize(Archive&, unsigned /* version */) {}
37 };
38 
39 /// Another alias for an empty metadata type
40 using empty_type = null_type;
41 
42 #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED
43 
44 namespace transform {
45 struct id;
46 struct log;
47 struct sqrt;
48 struct pow;
49 } // namespace transform
50 
51 template <class Value = double, class Transform = use_default,
52           class MetaData = use_default, class Options = use_default>
53 class regular;
54 
55 template <class Value = int, class MetaData = use_default, class Options = use_default>
56 class integer;
57 
58 template <class Value = double, class MetaData = use_default, class Options = use_default,
59           class Allocator = std::allocator<Value>>
60 class variable;
61 
62 template <class Value = int, class MetaData = use_default, class Options = use_default,
63           class Allocator = std::allocator<Value>>
64 class category;
65 
66 template <class... Ts>
67 class variant;
68 
69 #endif // BOOST_HISTOGRAM_DOXYGEN_INVOKED
70 
71 } // namespace axis
72 
73 #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED
74 
75 template <class T>
76 struct weight_type;
77 
78 template <class T>
79 struct sample_type;
80 
81 namespace accumulators {
82 template <class Value = double>
83 class sum;
84 template <class Value = double>
85 class weighted_sum;
86 template <class Value = double>
87 class mean;
88 template <class Value = double>
89 class weighted_mean;
90 
91 template <class T>
92 class thread_safe;
93 
94 template <class T>
95 struct is_thread_safe : std::false_type {};
96 template <class T>
97 struct is_thread_safe<thread_safe<T>> : std::true_type {};
98 } // namespace accumulators
99 
100 struct unsafe_access;
101 
102 template <class Allocator = std::allocator<char>>
103 class unlimited_storage;
104 
105 template <class T>
106 class storage_adaptor;
107 
108 #endif // BOOST_HISTOGRAM_DOXYGEN_INVOKED
109 
110 /// Vector-like storage for fast zero-overhead access to cells.
111 template <class T, class A = std::allocator<T>>
112 using dense_storage = storage_adaptor<std::vector<T, A>>;
113 
114 /// Default storage, optimized for unweighted histograms
115 using default_storage = unlimited_storage<>;
116 
117 /// Dense storage which tracks sums of weights and a variance estimate.
118 using weight_storage = dense_storage<accumulators::weighted_sum<>>;
119 
120 /// Dense storage which tracks means of samples in each cell.
121 using profile_storage = dense_storage<accumulators::mean<>>;
122 
123 /// Dense storage which tracks means of weighted samples in each cell.
124 using weighted_profile_storage = dense_storage<accumulators::weighted_mean<>>;
125 
126 #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED
127 
128 template <class Axes, class Storage = default_storage>
129 class BOOST_ATTRIBUTE_NODISCARD histogram;
130 
131 #endif
132 } // namespace histogram
133 } // namespace boost
134 
135 #endif
136