version 0.4.1
traits.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2024 The Ikarus Developers mueller@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
9#pragma once
10#include <optional>
11#include <tuple>
12#include <type_traits>
13
14#include <dune/common/hybridutilities.hh>
15namespace Ikarus::traits {
16
22template <typename T>
23concept Pointer = std::is_pointer_v<T> || std::is_same_v<T, std::nullptr_t>;
24
25#ifndef DOXYGEN
26template <typename>
27struct is_tuple : std::false_type
28{
29};
30#endif
36template <typename... T>
37struct is_tuple<std::tuple<T...>> : std::true_type
38{
39};
40
48template <class Tuple, class Type>
49requires is_tuple<Tuple>::value
50consteval int countType() {
51 int count = 0;
52 Dune::Hybrid::forEach(Dune::Hybrid::integralRange(Dune::index_constant<std::tuple_size_v<Tuple>>()), [&](auto i) {
53 using currentType = std::remove_cvref_t<std::tuple_element_t<i, Tuple>>;
54 if constexpr (std::is_same_v<currentType, Type>)
55 ++count;
56 });
57 return count;
58}
59
68template <typename Fun, typename... Args>
69using ReturnType = std::invoke_result_t<Fun, Args...>;
70
79template <typename T, typename Tuple>
80struct hasType : std::false_type
81{
82};
83
84#ifndef DOXYGEN
85template <typename T>
86struct hasType<T, std::tuple<>> : std::false_type
87{
88};
89
90template <typename T>
91struct hasType<T, T> : std::true_type
92{
93};
94
102template <typename T, typename U, typename... Ts>
103struct hasType<T, std::tuple<U, Ts...>> : hasType<T, std::tuple<Ts...>>
104{
105};
106
107template <typename T, typename... Ts>
108struct hasType<T, std::tuple<T, Ts...>> : std::true_type
109{
110};
111#endif
112
113#ifndef DOXYGEN
114template <template <typename...> class, typename...>
115struct isSpecialization : std::false_type
116{
117};
118#endif
119
126template <template <typename...> class U, typename... T>
127struct isSpecialization<U, U<T...>> : std::true_type
128{
129};
130
131#ifndef DOXYGEN
132template <template <typename, auto...> class Type, typename>
133struct isSpecializationTypeAndNonTypes : std::false_type
134{
135};
136
137template <template <typename, auto...> class Type, typename T, auto... N>
138struct isSpecializationTypeAndNonTypes<Type, Type<T, N...>> : std::true_type
139{
140};
141
142template <template <auto, typename...> class Type, typename>
143struct isSpecializationNonTypeAndTypes : std::false_type
144{
145};
146#endif
147
157template <template <auto, typename...> class Type, auto T, typename... N>
158struct isSpecializationNonTypeAndTypes<Type, Type<T, N...>> : std::true_type
159{
160};
161
162#ifndef DOXYGEN
163template <template <typename, auto, typename> class Type, typename>
164struct isSpecializationTypeNonTypeAndType : std::false_type
165{
166};
167#endif
178template <template <typename, auto, typename> class Type, typename T, auto M, typename N>
179struct isSpecializationTypeNonTypeAndType<Type, Type<T, M, N>> : std::true_type
180{
181};
182
183#ifndef DOXYGEN
184template <template <auto...> class Type, typename>
185struct isSpecializationNonTypes : std::false_type
186{
187};
188#endif
189
198template <template <auto...> class Type, auto... N>
199struct isSpecializationNonTypes<Type, Type<N...>> : std::true_type
200{
201};
202
220template <class T, class Tuple>
221struct Index;
222#ifndef DOXYGEN
223template <class T>
224struct Index<T, std::tuple<>>
225{
226 static const std::size_t value = 0;
227};
228
229template <class T, class... Types>
230struct Index<T, std::tuple<T, Types...>>
231{
232 static constexpr std::size_t value = 0;
233};
234
235template <class T, class U, class... Types>
236struct Index<T, std::tuple<U, Types...>>
237{
238 static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value;
239};
240#endif
241
259template <class Container, class NewType>
260struct Rebind;
261
262#ifndef DOXYGEN
263/*
264 * Specialization for types like std::vector<...> and nested std::vector<std::vector>
265 */
266template <class OldType, class... Args, template <class...> class Container, class NewType>
267struct Rebind<Container<OldType, Args...>, NewType>
268{
269 using other = Container<NewType, typename Rebind<Args, NewType>::other...>;
270};
271
272/*
273 * Specialization for types like std::array<...,N>
274 */
275template <class OldType, std::size_t N, template <class, std::size_t> class Container, class NewType>
276struct Rebind<Container<OldType, N>, NewType>
277{
278 using other = Container<NewType, N>;
279};
280
281#endif
282
292template <typename T, typename = void>
294
295#ifndef DOXYGEN
299template <typename R, typename... Args>
300struct FunctionTraits<R (*)(Args...)>
301{
302 using return_type = R;
303 template <int i>
304 using args_type = typename std::tuple_element<i, std::tuple<Args...>>::type;
305 static constexpr int numberOfArguments = sizeof...(Args);
306};
307
311template <typename R, typename C, typename... Args>
312struct FunctionTraits<R (C::*)(Args...) const>
313{
314 using return_type = R;
315 template <int i>
316 using args_type = typename std::tuple_element<i, std::tuple<Args...>>::type;
317 static constexpr int numberOfArguments = sizeof...(Args);
318};
319
323template <typename R, typename C, typename... Args>
324struct FunctionTraits<R (C::*)(Args...)>
325{
326 using return_type = R;
327 template <int i>
328 using args_type = typename std::tuple_element<i, std::tuple<Args...>>::type;
329 static constexpr int numberOfArguments = sizeof...(Args);
330};
331
336template <typename T>
337struct FunctionTraits<T, Dune::void_t<decltype(&T::operator())>> : public FunctionTraits<decltype(&T::operator())>
338{
339};
340#endif
341
342} // namespace Ikarus::traits
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:69
::value consteval int countType()
Metafunction to count the occurrences of a specific type in a tuple.
Definition: traits.hh:50
Definition: utils/dirichletvalues.hh:28
Definition: traits.hh:15
Type trait to check if a specified type is present in a tuple.
Definition: traits.hh:81
Type trait to get the index of a type in a tuple.
Definition: traits.hh:221
Type trait to rebind the underlying type of containers.
Definition: traits.hh:260
Type trait for extracting information about functions.
Definition: traits.hh:293
Concept to check if a type is a pointer or nullptr_t.
Definition: traits.hh:23