3 #ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
4 #define DUNE_FUNCTIONS_COMMON_UTILITY_HH
10 #include <dune/typetree/utility.hh>
17 template<
class F,
class size_type, size_type firstValue,
class... Args>
18 auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue> values,
const size_type& i, F&& f, Args&&... args)
19 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
21 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
24 template<
class F,
class size_type, size_type firstValue, size_type secondValue, size_type... otherValues,
class... Args>
25 auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue, secondValue, otherValues...> values,
const size_type i, F&& f, Args&&... args)
26 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
29 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
30 return forwardAsStaticInteger(std::integer_sequence<size_type, secondValue, otherValues...>(), i, std::forward<F>(f), std::forward<Args>(args)...);
56 template<std::size_t end,
class F,
class size_type,
class... Args>
58 ->decltype(f(Dune::TypeTree::Indices::_0, std::forward<Args>(args)...))
60 return forwardAsStaticInteger(std::make_index_sequence<end>{}, i, std::forward<F>(f), std::forward<Args>(args)...);
67 template<
template<
class...>
class T,
class List>
68 struct ExpandTupleHelper
71 template<
template<
class...>
class T,
template<
class...>
class ListType,
class... Args>
72 struct ExpandTupleHelper<T, ListType<Args...>>
74 using Type = T<Args...>;
90 template<
template<
class...>
class T,
class ArgTuple>
91 using ExpandTuple =
typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
97 template<
template<
class...>
class T,
class... Tuple>
98 struct TransformTupleHelper
101 template<
template<
class...>
class T,
class... Args1>
102 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
104 using Type = std::tuple<T<Args1>...>;
107 template<
template<
class...>
class T,
class... Args1,
class... Args2>
108 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
110 using Type = std::tuple<T<Args1, Args2>...>;
127 template<
template<
class...>
class F,
class... Tuples>
134 template<
class F,
class... T, std::size_t... k>
135 auto transformTupleHelper(F&& f,
const std::tuple<T...>& tuple, std::index_sequence<k...>)
136 -> decltype(std::make_tuple(f(std::get<k>(tuple))...))
138 return std::make_tuple(f(std::get<k>(tuple))...);
141 template<
class F,
class... T1,
class...T2, std::size_t... k>
142 auto transformTupleHelper(F&& f,
const std::tuple<T1...>& tuple1,
const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
143 -> decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
145 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
161 template<
class F,
class... T>
163 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
165 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
181 template<
class F,
class... T1,
class... T2>
182 auto transformTuple(F&& f,
const std::tuple<T1...>& tuple1,
const std::tuple<T2...>& tuple2)
183 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
185 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
192 template<
class IntegerSequence>
193 struct IntegerSequenceTupleHelper
196 template<
class I, I... k>
197 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
199 using Type = std::tuple<std::integral_constant<I, k>...>;
207 template<
class IntegerSequence>
220 using type =
typename std::tuple_element<
sizeof...(T)-1, std::tuple<T...>>::
type;
227 template<
class T,
class I>
230 template<
class... T, std::size_t... I>
231 struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
233 using type =
typename std::tuple<
typename LastType<T...>::type,
typename std::tuple_element<I,std::tuple<T...>>::type...>;
249 using type =
typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<
sizeof...(T)-1>>::
type;
266 template<
class F,
class ArgTuple,
class I, I... i>
267 decltype(
auto)
applyPartial(F&& f, ArgTuple&& args, std::integer_sequence<I, i...> indices)
269 return f(std::get<i>(args)...);
278 #endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH