7#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
8#define DUNE_FUNCTIONS_COMMON_UTILITY_HH
14#include <dune/common/overloadset.hh>
15#include <dune/common/indices.hh>
17#include <dune/functions/common/functionconcepts.hh>
25 template<
template<
class...>
class T,
class List>
26 struct ExpandTupleHelper
29 template<
template<
class...>
class T,
template<
class...>
class ListType,
class... Args>
30 struct ExpandTupleHelper<T, ListType<Args...>>
32 using Type = T<Args...>;
48template<
template<
class...>
class T,
class ArgTuple>
49using ExpandTuple =
typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
55 template<
template<
class...>
class T,
class... Tuple>
56 struct TransformTupleHelper
59 template<
template<
class...>
class T,
class... Args1>
60 struct TransformTupleHelper<T, typename
std::tuple<Args1...>>
62 using Type = std::tuple<T<Args1>...>;
65 template<
template<
class...>
class T,
class... Args1,
class... Args2>
66 struct TransformTupleHelper<T, typename
std::tuple<Args1...>, typename std::tuple<Args2...>>
68 using Type = std::tuple<T<Args1, Args2>...>;
85template<
template<
class...>
class F,
class... Tuples>
86using TransformTuple =
typename Imp::TransformTupleHelper<F, Tuples...>::Type;
92 template<
class F,
class... T, std::size_t... k>
93 auto transformTupleHelper(F&& f,
const std::tuple<T...>& tuple, std::index_sequence<k...>)
94 ->
decltype(std::make_tuple(f(std::get<k>(tuple))...))
96 return std::make_tuple(f(std::get<k>(tuple))...);
99 template<
class F,
class... T1,
class...T2, std::size_t... k>
100 auto transformTupleHelper(F&& f,
const std::tuple<T1...>& tuple1,
const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
101 ->
decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
103 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
119template<
class F,
class... T>
121 ->
decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
123 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
139template<
class F,
class... T1,
class... T2>
140auto transformTuple(F&& f,
const std::tuple<T1...>& tuple1,
const std::tuple<T2...>& tuple2)
141 ->
decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
143 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
150 template<
class IntegerSequence>
151 struct IntegerSequenceTupleHelper
154 template<
class I, I... k>
155 struct IntegerSequenceTupleHelper<
std::integer_sequence<I, k...>>
157 using Type = std::tuple<std::integral_constant<I, k>...>;
165template<
class IntegerSequence>
166using IntegerSequenceTuple=
typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
178 using type = std::tuple_element_t<
sizeof...(T)-1, std::tuple<T...>>;
185template<
class T,
class I>
188template<
class... T, std::size_t... I>
189struct RotateHelper<
std::tuple<T...>, std::index_sequence<I...> >
191 using type =
typename std::tuple<
typename LastType<T...>::type, std::tuple_element_t<I,std::tuple<T...>>...>;
207 using type =
typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<
sizeof...(T)-1>>::type;
233template<
class Expression>
236 return [f](
auto&&... args){
261 return [check](
auto&&... args){
263 [](std::true_type) {
return std::false_type{};},
264 [](std::false_type) {
return std::true_type{};},
265 [](
bool v) {
return not v;});
266 return negate(check(std::forward<
decltype(args)>(args)...));
275 template <
typename T>
276 struct ForwardCaptureWrapper;
278 template <
typename T>
279 struct ForwardCaptureWrapper
281 template <
typename TT>
282 ForwardCaptureWrapper(TT&& t) : t_{
std::forward<TT>(t)} {}
284 auto forward()
const {
return std::move(t_); }
289 template <
typename T>
290 struct ForwardCaptureWrapper<T&>
292 ForwardCaptureWrapper(T& t) : t_{t} {}
294 T& forward()
const {
return t_; };
299 template <
typename T>
300 struct ForwardCaptureWrapper<const T&>
302 ForwardCaptureWrapper(
const T& t) : t_{t} {}
304 const T& forward()
const {
return t_; };
327auto forwardCapture(T&& t)
329 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
auto overload(F &&... f)
Create an overload set.
Definition: overloadset.hh:61
auto transformTuple(Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
Definition: tupleutility.hh:292
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition: utility.hh:49
typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple
Transform tuple types argument using type-functor.
Definition: utility.hh:86
static constexpr auto isCallable()
Check if f is callable with given argument list.
Definition: functionconcepts.hh:51
auto callableCheck(Expression f)
Create a predicate for checking validity of expressions.
Definition: utility.hh:234
auto negatePredicate(Check check)
Negate given predicate.
Definition: utility.hh:259
Dune namespace
Definition: alignedallocator.hh:13
Get last entry of type list.
Definition: utility.hh:177
Rotate type list by one, such that last entry is moved to first position.
Definition: utility.hh:206