diff --git a/doc/getting_started.qbk b/doc/getting_started.qbk index c628c45b..53925346 100644 --- a/doc/getting_started.qbk +++ b/doc/getting_started.qbk @@ -64,4 +64,13 @@ The library was designed to work well with the C++ standard library. Here is an [endsect] +[section Making classes that hold histograms] + +The histograms get their great flexibility and performance from being templated, but this can make the types a bit cumbersome to write. Often it is possible to use `auto` to let the compiler deduce the type, but when you want to store histograms in a class, you need to write the type explicitly. The next example shows how this works. + +[import ../examples/getting_started_listing_05.cpp] +[getting_started_listing_05] + +[endsect] + [endsect] diff --git a/examples/Jamfile b/examples/Jamfile index eefb9535..c9d620aa 100644 --- a/examples/Jamfile +++ b/examples/Jamfile @@ -21,6 +21,7 @@ alias cxx14 : [ run getting_started_listing_02.cpp ] [ run getting_started_listing_03.cpp ] [ run getting_started_listing_04.cpp ] + [ run getting_started_listing_05.cpp ] [ run guide_axis_basic_demo.cpp ] [ run guide_axis_circular.cpp ] [ run guide_axis_growing.cpp ] diff --git a/examples/getting_started_listing_05.cpp b/examples/getting_started_listing_05.cpp new file mode 100644 index 00000000..52706284 --- /dev/null +++ b/examples/getting_started_listing_05.cpp @@ -0,0 +1,65 @@ +// 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) + +// clang-format off + +//[ getting_started_listing_05 + +//////////////// Begin: put this in header file //////////////////// + +#include // std::max_element +#include // only needed for printing +#include // make_histogram, integer, indexed +#include // std::cout, std::endl +#include // std::ostringstream +#include +#include + +// use this when axis configuration is fix to get highest performance +struct HolderOfStaticHistogram { + // put axis types here + using axes_t = std::tuple< + boost::histogram::axis::regular<>, + boost::histogram::axis::integer<> + >; + using hist_t = boost::histogram::histogram; + hist_t hist_; +}; + +// use this when axis configuration should be flexible +struct HolderOfDynamicHistogram { + // put all axis types here that you are going to use + using axis_t = boost::histogram::axis::variant< + boost::histogram::axis::regular<>, + boost::histogram::axis::variable<>, + boost::histogram::axis::integer<> + >; + using axes_t = std::vector; + using hist_t = boost::histogram::histogram; + hist_t hist_; +}; + +//////////////// End: put this in header file //////////////////// + +int main() { + using namespace boost::histogram; + + HolderOfStaticHistogram hs; + hs.hist_ = make_histogram(axis::regular<>(5, 0, 1), axis::integer<>(0, 3)); + // now assign a different histogram + hs.hist_ = make_histogram(axis::regular<>(3, 1, 2), axis::integer<>(4, 6)); + // hs.hist_ = make_histogram(axis::regular<>(5, 0, 1)); does not work; + // the static histogram cannot change the number or order of axis types + + HolderOfDynamicHistogram hd; + hd.hist_ = make_histogram(axis::regular<>(5, 0, 1), axis::integer<>(0, 3)); + // now assign a different histogram + hd.hist_ = make_histogram(axis::regular<>(3, -1, 2)); + // and assign another + hd.hist_ = make_histogram(axis::integer<>(0, 5), axis::integer<>(3, 5)); +} + +//]