accumulator_traits.hpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. #ifndef BOOST_HISTOGRAM_DETAIL_ACCUMULATOR_TRAITS_HPP
  7. #define BOOST_HISTOGRAM_DETAIL_ACCUMULATOR_TRAITS_HPP
  8. #include <boost/histogram/fwd.hpp>
  9. #include <tuple>
  10. #include <type_traits>
  11. namespace boost {
  12. namespace accumulators {
  13. template <class, class, class>
  14. struct accumulator_set;
  15. }
  16. namespace histogram {
  17. namespace detail {
  18. template <bool WeightSupport, class... Ts>
  19. struct accumulator_traits_holder {
  20. using wsupport = std::integral_constant<bool, WeightSupport>;
  21. using args = std::tuple<Ts...>;
  22. };
  23. template <class R, class T, class U, class... Ts>
  24. accumulator_traits_holder<true, Ts...> accumulator_traits_impl_2(
  25. R (T::*)(boost::histogram::weight_type<U>, Ts...));
  26. template <class R, class T, class U, class... Ts>
  27. accumulator_traits_holder<true, Ts...> accumulator_traits_impl_2(
  28. R (T::*)(boost::histogram::weight_type<U>&&, Ts...));
  29. template <class R, class T, class U, class... Ts>
  30. accumulator_traits_holder<true, Ts...> accumulator_traits_impl_2(
  31. R (T::*)(const boost::histogram::weight_type<U>&, Ts...));
  32. template <class R, class T, class... Ts>
  33. accumulator_traits_holder<false, Ts...> accumulator_traits_impl_2(R (T::*)(Ts...));
  34. template <class T>
  35. auto accumulator_traits_impl(T&)
  36. -> decltype(std::declval<T&>() += 0, accumulator_traits_holder<true>{});
  37. template <class T>
  38. auto accumulator_traits_impl(T&) -> decltype(accumulator_traits_impl_2(&T::operator()));
  39. // for boost.accumulators compatibility
  40. template <class S, class F, class W>
  41. accumulator_traits_holder<false, S> accumulator_traits_impl(
  42. boost::accumulators::accumulator_set<S, F, W>&);
  43. template <class T>
  44. using accumulator_traits = decltype(accumulator_traits_impl(std::declval<T&>()));
  45. } // namespace detail
  46. } // namespace histogram
  47. } // namespace boost
  48. #endif