DUNE PDELab (unstable)

utility.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUNCTIONS_COMMON_UTILITY_HH
8#define DUNE_FUNCTIONS_COMMON_UTILITY_HH
9
10
11#include <utility>
12#include <type_traits>
13
14#include <dune/common/overloadset.hh>
15#include <dune/common/indices.hh>
16
17#include <dune/functions/common/functionconcepts.hh>
18
19namespace Dune {
20namespace Functions {
21
22
23namespace Imp {
24
25 template<template<class...> class T, class List>
26 struct ExpandTupleHelper
27 {};
28
29 template<template<class...> class T, template<class...> class ListType, class... Args>
30 struct ExpandTupleHelper<T, ListType<Args...>>
31 {
32 using Type = T<Args...>;
33 };
34
35} // end namespace Imp
36
48template<template<class...> class T, class ArgTuple>
49using ExpandTuple = typename Imp::ExpandTupleHelper<T, ArgTuple>::Type;
50
51
52
53namespace Imp {
54
55 template<template<class...> class T, class... Tuple>
56 struct TransformTupleHelper
57 {};
58
59 template<template<class...> class T, class... Args1>
60 struct TransformTupleHelper<T, typename std::tuple<Args1...>>
61 {
62 using Type = std::tuple<T<Args1>...>;
63 };
64
65 template<template<class...> class T, class... Args1, class... Args2>
66 struct TransformTupleHelper<T, typename std::tuple<Args1...>, typename std::tuple<Args2...>>
67 {
68 using Type = std::tuple<T<Args1, Args2>...>;
69 };
70
71} // end namespace Imp
72
85template<template<class...> class F, class... Tuples>
86using TransformTuple = typename Imp::TransformTupleHelper<F, Tuples...>::Type;
87
88
89
90namespace Imp {
91
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))...))
95 {
96 return std::make_tuple(f(std::get<k>(tuple))...);
97 }
98
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))...))
102 {
103 return std::make_tuple(f(std::get<k>(tuple1), std::get<k>(tuple2))...);
104 }
105
106} // end namespace Imp
107
119template<class F, class... T>
120auto transformTuple(F&& f, const std::tuple<T...>& tuple)
121 -> decltype(Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{}))
122{
123 return Imp::transformTupleHelper(std::forward<F>(f), tuple, std::index_sequence_for<T...>{});
124}
125
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...>{}))
142{
143 return Imp::transformTupleHelper(std::forward<F>(f), tuple1, tuple2, std::index_sequence_for<T1...>{});
144}
145
146
147
148namespace Imp {
149
150 template<class IntegerSequence>
151 struct IntegerSequenceTupleHelper
152 {};
153
154 template<class I, I... k>
155 struct IntegerSequenceTupleHelper<std::integer_sequence<I, k...>>
156 {
157 using Type = std::tuple<std::integral_constant<I, k>...>;
158 };
159
160} // end namespace Imp
161
165template<class IntegerSequence>
166using IntegerSequenceTuple= typename Imp::IntegerSequenceTupleHelper<IntegerSequence>::Type;
167
168
169
175template<class... T>
177{
178 using type = std::tuple_element_t<sizeof...(T)-1, std::tuple<T...>>;
179};
180
181
182
183namespace Imp {
184
185template<class T, class I>
186struct RotateHelper;
187
188template<class... T, std::size_t... I>
189struct RotateHelper<std::tuple<T...>, std::index_sequence<I...> >
190{
191 using type = typename std::tuple<typename LastType<T...>::type, std::tuple_element_t<I,std::tuple<T...>>...>;
192};
193
194} // end namespace Imp
195
196
204template<class... T>
206{
207 using type = typename Imp::RotateHelper<std::tuple<T...>, std::make_index_sequence<sizeof...(T)-1>>::type;
208};
209
210
211
233template<class Expression>
234auto callableCheck(Expression f)
235{
236 return [f](auto&&... args){
237 return Functions::Concept::isCallable(f, std::forward<decltype(args)>(args)...);
238 };
239}
240
241
242
258template<class Check>
259auto negatePredicate(Check check)
260{
261 return [check](auto&&... args){
262 auto negate = overload(
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)...));
267 };
268}
269
270
271namespace Impl {
272
273 // Wrapper to capture values in a lambda for perfect forwarding.
274 // This captures value types by value and reference types by reference.
275 template <typename T>
276 struct ForwardCaptureWrapper;
277
278 template <typename T>
279 struct ForwardCaptureWrapper
280 {
281 template <typename TT>
282 ForwardCaptureWrapper(TT&& t) : t_{std::forward<TT>(t)} {}
283
284 auto forward() const { return std::move(t_); }
285
286 T t_;
287 };
288
289 template <typename T>
290 struct ForwardCaptureWrapper<T&>
291 {
292 ForwardCaptureWrapper(T& t) : t_{t} {}
293
294 T& forward() const { return t_; };
295
296 T& t_;
297 };
298
299 template <typename T>
300 struct ForwardCaptureWrapper<const T&>
301 {
302 ForwardCaptureWrapper(const T& t) : t_{t} {}
303
304 const T& forward() const { return t_; };
305
306 const T& t_;
307 };
308
309} // end namespace Dune::Functions::Impl
310
311
312
326template <class T>
327auto forwardCapture(T&& t)
328{
329 return Impl::ForwardCaptureWrapper<T>(std::forward<T>(t));
330}
331
332
333
334} // namespace Dune::Functions
335} // namespace Dune
336
337
338#endif // DUNE_FUNCTIONS_COMMON_UTILITY_HH
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
STL namespace.
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
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Jun 10, 22:32, 2026)