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>
23template<
class F,
class size_type, size_type firstValue,
class... Args>
24[[deprecated(
"This function will be removed after Dune 2.11")]]
25auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue> values,
const size_type& i, F&& f, Args&&... args)
26 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
28 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
31template<
class F,
class size_type, size_type firstValue, size_type secondValue, size_type... otherValues,
class... Args>
32[[deprecated(
"This function will be removed after Dune 2.11")]]
33auto forwardAsStaticInteger(std::integer_sequence<size_type, firstValue, secondValue, otherValues...> values,
const size_type i, F&& f, Args&&... args)
34 ->decltype(f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...))
37 return f(std::integral_constant<size_type, firstValue>(), std::forward<Args>(args)...);
38 return forwardAsStaticInteger(std::integer_sequence<size_type, secondValue, otherValues...>(), i, std::forward<F>(f), std::forward<Args>(args)...);
66template<std::size_t end,
class F,
class size_type,
class... Args>
67[[deprecated(
"This function will be removed after Dune 2.11, use Dune::Hybrid::switchCases.")]]
69 ->decltype(f(Dune::Indices::_0, std::forward<Args>(args)...))
71 return forwardAsStaticInteger(std::make_index_sequence<end>{}, i, std::forward<F>(f), std::forward<Args>(args)...);
78 template<
template<
class...>
class T,
class List>
79 struct ExpandTupleHelper
82 template<
template<
class...>
class T,
template<
class...>
class ListType,
class... Args>
83 struct ExpandTupleHelper<T, ListType<Args...>>
85 using Type = T<Args...>;
101template<
template<
class...>
class T,
class ArgTuple>
102using ExpandTuple =
typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
108 template<
template<
class...>
class T,
class... Tuple>
109 struct TransformTupleHelper
112 template<
template<
class...>
class T,
class... Args1>
113 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
115 using Type = std::tuple<T<Args1>...>;
118 template<
template<
class...>
class T,
class... Args1,
class... Args2>
119 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
121 using Type = std::tuple<T<Args1, Args2>...>;
138template<
template<
class...>
class F,
class... Tuples>
145 template<
class F,
class... T, std::size_t... k>
146 auto transformTupleHelper(F&& f,
const std::tuple<T...>& tuple, std::index_sequence<k...>)
147 ->
decltype(std::make_tuple(f(std::get<k>(tuple))...))
149 return std::make_tuple(f(std::get<k>(tuple))...);
152 template<
class F,
class... T1,
class...T2, std::size_t... k>
153 auto transformTupleHelper(F&& f,
const std::tuple<T1...>& tuple1,
const std::tuple<T2...>& tuple2, std::index_sequence<k...>)
154 ->
decltype(std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...))
156 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
172template<
class F,
class... T>
174 ->
decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
176 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
192template<
class F,
class... T1,
class... T2>
193auto transformTuple(F&& f,
const std::tuple<T1...>& tuple1,
const std::tuple<T2...>& tuple2)
194 ->
decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{}))
196 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
203 template<
class IntegerSequence>
204 struct IntegerSequenceTupleHelper
207 template<
class I, I... k>
208 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
210 using Type = std::tuple<std::integral_constant<I, k>...>;
218template<
class IntegerSequence>
219using IntegerSequenceTuple=
typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
231 using type = std::tuple_element_t<
sizeof...(T)-1, std::tuple<T...>>;
238template<
class T,
class I>
241template<
class... T, std::size_t... I>
242struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
244 using type =
typename std::tuple<
typename LastType<T...>::type, std::tuple_element_t<I,std::tuple<T...>>...>;
260 using type =
typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<
sizeof...(T)-1>>::type;
286template<
class Expression>
289 return [f](
auto&&... args){
314 return [check](
auto&&... args){
315 auto negate = overload(
316 [](std::true_type) {
return std::false_type{};},
317 [](std::false_type) {
return std::true_type{};},
318 [](
bool v) {
return not v;});
319 return negate(check(std::forward<
decltype(args)>(args)...));
328 template <
typename T>
329 struct ForwardCaptureWrapper;
331 template <
typename T>
332 struct ForwardCaptureWrapper
334 template <
typename TT>
335 ForwardCaptureWrapper(TT&& t) : t_{std::forward<TT>(t)} {}
337 auto forward()
const {
return std::move(t_); }
342 template <
typename T>
343 struct ForwardCaptureWrapper<T&>
345 ForwardCaptureWrapper(T& t) : t_{t} {}
347 T& forward()
const {
return t_; };
352 template <
typename T>
353 struct ForwardCaptureWrapper<const T&>
355 ForwardCaptureWrapper(
const T& t) : t_{t} {}
357 const T& forward()
const {
return t_; };
380auto forwardCapture(T&& t)
382 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
typename Imp::ExpandTupleHelper< T, ArgTuple >::Type ExpandTuple
Expand tuple arguments as template arguments.
Definition: utility.hh:102
typename Imp::TransformTupleHelper< F, Tuples... >::Type TransformTuple
Transform tuple types argument using type-functor.
Definition: utility.hh:139
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:287
auto forwardAsStaticIndex(const size_type &i, F &&f, Args &&... args) -> decltype(f(Dune::Indices::_0, std::forward< Args >(args)...))
Transform dynamic index to static index_constant.
Definition: utility.hh:68
auto transformTuple(F &&f, const std::tuple< T1... > &tuple1, const std::tuple< T2... > &tuple2) -> decltype(Imp::transformTupleHelper(std::forward< F >(f), tuple1, tuple2, std::index_sequence_for< T1... >{}))
Transform tuple value using a binary functor.
Definition: utility.hh:193
auto negatePredicate(Check check)
Negate given predicate.
Definition: utility.hh:312
Definition: monomialset.hh:19
Get last entry of type list.
Definition: utility.hh:230
Rotate type list by one, such that last entry is moved to first position.
Definition: utility.hh:259