guide_axis_circular.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Copyright 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. //[ guide_axis_circular
  7. #include <boost/histogram/axis.hpp>
  8. #include <limits>
  9. int main() {
  10. using namespace boost::histogram;
  11. // make a circular regular axis ... [0, 180), [180, 360), [0, 180) ....
  12. using opts = decltype(axis::option::overflow | axis::option::circular);
  13. auto r = axis::regular<double, use_default, use_default, opts>{2, 0., 360.};
  14. assert(r.index(-180) == 1);
  15. assert(r.index(0) == 0);
  16. assert(r.index(180) == 1);
  17. assert(r.index(360) == 0);
  18. assert(r.index(540) == 1);
  19. assert(r.index(720) == 0);
  20. // special values are mapped to the overflow bin index
  21. assert(r.index(std::numeric_limits<double>::infinity()) == 2);
  22. assert(r.index(-std::numeric_limits<double>::infinity()) == 2);
  23. assert(r.index(std::numeric_limits<double>::quiet_NaN()) == 2);
  24. // since the regular axis is the most common circular axis, there exists an alias
  25. auto c = axis::circular<>{2, 0., 360.};
  26. assert(r == c);
  27. // make a circular integer axis
  28. auto i = axis::integer<int, use_default, axis::option::circular_t>{1, 4};
  29. assert(i.index(0) == 2);
  30. assert(i.index(1) == 0);
  31. assert(i.index(2) == 1);
  32. assert(i.index(3) == 2);
  33. assert(i.index(4) == 0);
  34. assert(i.index(5) == 1);
  35. }
  36. //]