// Copyright 2015-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) #ifndef BOOST_HISTOGRAM_FWD_HPP #define BOOST_HISTOGRAM_FWD_HPP /** \file boost/histogram/fwd.hpp Forward declarations, tag types and type aliases. */ #include // BOOST_ATTRIBUTE_NODISCARD #include #include #include #include namespace boost { namespace histogram { /// Tag type to indicate use of a default type using boost::use_default; namespace axis { /// Integral type for axis indices using index_type = int; /// Real type for axis indices using real_index_type = double; /// Empty metadata type struct null_type { template void serialize(Archive&, unsigned /* version */) {} }; /// Another alias for an empty metadata type using empty_type = null_type; // some forward declarations must be hidden from doxygen to fix the reference docu :( #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED namespace transform { struct id; struct log; struct sqrt; struct pow; } // namespace transform template class regular; template class integer; template > class variable; template > class category; template class boolean; template class variant; #endif // BOOST_HISTOGRAM_DOXYGEN_INVOKED } // namespace axis #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED template struct weight_type; template struct sample_type; namespace accumulators { template class count; template class sum; template class weighted_sum; template class mean; template class weighted_mean; template class thread_safe; template struct is_thread_safe : std::false_type {}; template struct is_thread_safe> : std::true_type {}; } // namespace accumulators struct unsafe_access; template > class unlimited_storage; template class storage_adaptor; #endif // BOOST_HISTOGRAM_DOXYGEN_INVOKED /// Vector-like storage for fast zero-overhead access to cells. template > using dense_storage = storage_adaptor>; /// Default storage, optimized for unweighted histograms using default_storage = unlimited_storage<>; /// Dense storage which tracks sums of weights and a variance estimate. using weight_storage = dense_storage>; /// Dense storage which tracks means of samples in each cell. using profile_storage = dense_storage>; /// Dense storage which tracks means of weighted samples in each cell. using weighted_profile_storage = dense_storage>; // some forward declarations must be hidden from doxygen to fix the reference docu :( #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED template class BOOST_ATTRIBUTE_NODISCARD histogram; #endif // BOOST_HISTOGRAM_DOXYGEN_INVOKED namespace detail { /* Most of the histogram code is generic and works for any number of axes. Buffers with a * fixed maximum capacity are used in some places, which have a size equal to the rank of * a histogram. The buffers are statically allocated to improve performance, which means * that they need a preset maximum capacity. 32 seems like a safe upper limit for the rank * (you can nevertheless increase it here if necessary): the simplest non-trivial axis has * 2 bins; even if counters are used which need only a byte of storage per bin, 32 axes * would generate of 4 GB. */ #ifndef BOOST_HISTOGRAM_DETAIL_AXES_LIMIT #define BOOST_HISTOGRAM_DETAIL_AXES_LIMIT 32 #endif template struct buffer_size_impl : std::integral_constant {}; template struct buffer_size_impl> : std::integral_constant {}; template using buffer_size = typename buffer_size_impl::type; } // namespace detail } // namespace histogram } // namespace boost #endif