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