18#include <dune/common/hybridutilities.hh>
27concept Pointer = std::is_pointer_v<T> || std::is_same_v<T, std::nullptr_t>;
31struct is_tuple : std::false_type
40template <
typename... T>
41struct is_tuple<
std::tuple<T...>> : std::true_type
52template <
class Tuple,
class Type>
53requires is_tuple<Tuple>::value
56 Dune::Hybrid::forEach(Dune::Hybrid::integralRange(Dune::index_constant<std::tuple_size_v<Tuple>>()), [&](
auto i) {
57 using currentType = std::remove_cvref_t<std::tuple_element_t<i, Tuple>>;
58 if constexpr (std::is_same_v<currentType, Type>)
72template <
typename Fun,
typename... Args>
83template <
typename T,
typename Tuple>
90struct hasType<T,
std::tuple<>> : std::false_type
95struct hasType<T, T> : std::true_type
106template <
typename T,
typename U,
typename... Ts>
107struct hasType<T,
std::tuple<U, Ts...>> : hasType<T, std::tuple<Ts...>>
111template <
typename T,
typename... Ts>
112struct hasType<T,
std::tuple<T, Ts...>> : std::true_type
118template <
template <
typename...>
class,
typename...>
119struct isSpecialization : std::false_type
146 template <
typename U = T>
147 static auto test(
int) -> std::remove_reference<decltype(*std::declval<U>())>;
148 static auto test(...) -> std::remove_cv<T>;
163template <
template <
typename...>
class U,
typename... T>
164struct isSpecialization<U, U<T...>> : std::true_type
169template <
template <
typename,
auto...>
class Type,
typename>
170struct isSpecializationTypeAndNonTypes : std::false_type
174template <
template <
typename,
auto...>
class Type,
typename T,
auto... N>
175struct isSpecializationTypeAndNonTypes<Type, Type<T, N...>> : std::true_type
179template <
template <
auto,
typename...>
class Type,
typename>
180struct isSpecializationNonTypeAndTypes : std::false_type
194template <
template <
auto,
typename...>
class Type,
auto T,
typename... N>
195struct isSpecializationNonTypeAndTypes<Type, Type<T, N...>> : std::true_type
200template <
template <
typename, auto,
typename>
class Type,
typename>
201struct isSpecializationTypeNonTypeAndType : std::false_type
215template <
template <
typename, auto,
typename>
class Type,
typename T,
auto M,
typename N>
216struct isSpecializationTypeNonTypeAndType<Type, Type<T, M, N>> : std::true_type
221template <
template <
auto...>
class Type,
typename>
222struct isSpecializationNonTypes : std::false_type
235template <
template <
auto...>
class Type,
auto... N>
236struct isSpecializationNonTypes<Type, Type<N...>> : std::true_type
257template <
class T,
class Tuple>
263 static const std::size_t value = 0;
266template <
class T,
class... Types>
267struct Index<T,
std::tuple<T, Types...>>
269 static constexpr std::size_t value = 0;
272template <
class T,
class U,
class... Types>
273struct Index<T,
std::tuple<U, Types...>>
275 static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value;
296template <
class Container,
class NewType>
303template <
class OldType,
class... Args,
template <
class...>
class Container,
class NewType>
304struct Rebind<Container<OldType, Args...>, NewType>
306 using other = Container<NewType, typename Rebind<Args, NewType>::other...>;
312template <
class OldType, std::
size_t N,
template <
class, std::
size_t>
class Container,
class NewType>
313struct Rebind<Container<OldType, N>, NewType>
315 using other = Container<NewType, N>;
329template <
typename T,
typename =
void>
336template <
typename R,
typename... Args>
339 using return_type = R;
341 using args_type =
typename std::tuple_element<i, std::tuple<Args...>>::type;
342 static constexpr int numberOfArguments =
sizeof...(Args);
348template <
typename R,
typename C,
typename... Args>
351 using return_type = R;
353 using args_type =
typename std::tuple_element<i, std::tuple<Args...>>::type;
354 static constexpr int numberOfArguments =
sizeof...(Args);
360template <
typename R,
typename C,
typename... Args>
361struct FunctionTraits<R (C::*)(Args...)>
363 using return_type = R;
365 using args_type =
typename std::tuple_element<i, std::tuple<Args...>>::type;
366 static constexpr int numberOfArguments =
sizeof...(Args);
374struct FunctionTraits<T,
Dune::void_t<decltype(&T::operator())>> :
public FunctionTraits<decltype(&T::operator())>
std::invoke_result_t< Fun, Args... > ReturnType
Type trait to obtain the return type of a callable type when given specific arguments.
Definition: traits.hh:73
::value consteval int countType()
Metafunction to count the occurrences of a specific type in a tuple.
Definition: traits.hh:54
Definition: utils/dirichletvalues.hh:28
typename remove_pointer< T >::type remove_pointer_t
Definition: traits.hh:155
Type trait to check if a specified type is present in a tuple.
Definition: traits.hh:85
Type trait to check if a type is a isSharedPtr.
Definition: traits.hh:133
Definition: traits.hh:145
typename decltype(test(0))::type type
Definition: traits.hh:151
Type trait to get the index of a type in a tuple.
Definition: traits.hh:258
Type trait to rebind the underlying type of containers.
Definition: traits.hh:297
Type trait for extracting information about functions.
Definition: traits.hh:330
Concept to check if a type is a pointer or nullptr_t.
Definition: traits.hh:27