relaxed_tuple_size.hpp 956 B

12345678910111213141516171819202122232425262728293031323334353637
  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_RELAXED_TUPLE_SIZE_HPP
  7. #define BOOST_HISTOGRAM_DETAIL_RELAXED_TUPLE_SIZE_HPP
  8. #include <type_traits>
  9. namespace boost {
  10. namespace histogram {
  11. namespace detail {
  12. using dynamic_size = std::integral_constant<std::size_t, static_cast<std::size_t>(-1)>;
  13. // Returns static size of tuple or dynamic_size
  14. template <class T>
  15. constexpr dynamic_size relaxed_tuple_size(const T&) noexcept {
  16. return {};
  17. }
  18. template <class... Ts>
  19. constexpr std::integral_constant<std::size_t, sizeof...(Ts)> relaxed_tuple_size(
  20. const std::tuple<Ts...>&) noexcept {
  21. return {};
  22. }
  23. template <class T>
  24. using relaxed_tuple_size_t = decltype(relaxed_tuple_size(std::declval<T>()));
  25. } // namespace detail
  26. } // namespace histogram
  27. } // namespace boost
  28. #endif