Actual source code: tuple.hpp
  1: #pragma once
  3: #include <petsc/private/cpp/type_traits.hpp>
  4: #include <petsc/private/cpp/utility.hpp>
  6: #include <tuple>
  8: namespace Petsc
  9: {
 11: namespace util
 12: {
 14: #if PETSC_CPP_VERSION >= 14
 15: using std::tuple_element_t;
 16: #else
 17: template <std::size_t I, class T>
 18: using tuple_element_t = typename std::tuple_element<I, T>::type;
 19: #endif
 21: // tuple_for_each
 22: namespace detail
 23: {
 25: template <std::size_t... Idx, typename T, typename F>
 26: constexpr inline F &&tuple_for_each(index_sequence<Idx...>, T &&tuple, F &&f)
 27: {
 28:   using expander = int[sizeof...(Idx)];
 29:   return (void)expander{((void)f(std::get<Idx>(std::forward<T>(tuple))), 0)...}, std::forward<F>(f);
 30: }
 32: template <typename T, typename F>
 33: constexpr inline F &&tuple_for_each(index_sequence<>, T &&, F &&f) noexcept
 34: {
 35:   return std::forward<F>(f);
 36: }
 38: } // namespace detail
 40: template <typename T, typename F>
 41: constexpr inline F &&tuple_for_each(T &&tuple, F &&f)
 42: {
 43:   using seq = make_index_sequence<std::tuple_size<remove_reference_t<T>>::value>;
 44:   return detail::tuple_for_each(seq{}, std::forward<T>(tuple), std::forward<F>(f));
 45: }
 47: } // namespace util
 49: } // namespace Petsc