Add wrapped histogram example to getting started section

This commit is contained in:
Hans Dembinski 2020-03-11 15:50:55 +01:00 committed by GitHub
parent 9382f57f9a
commit 4a368329a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 75 additions and 0 deletions

View File

@ -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]

View File

@ -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 ]

View File

@ -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 <algorithm> // std::max_element
#include <boost/format.hpp> // only needed for printing
#include <boost/histogram.hpp> // make_histogram, integer, indexed
#include <iostream> // std::cout, std::endl
#include <sstream> // std::ostringstream
#include <tuple>
#include <vector>
// 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<axes_t>;
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<axis_t>;
using hist_t = boost::histogram::histogram<axes_t>;
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));
}
//]