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