version 0.4.2
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 <tuple>
11#include <type_traits>
12
13namespace std {
14template <class T>
15class shared_ptr;
16}
17
18#include <dune/common/hybridutilities.hh>
19namespace Ikarus::traits {
20
26template <typename T>
27concept Pointer = std::is_pointer_v<T> || std::is_same_v<T, std::nullptr_t>;
28
29#ifndef DOXYGEN
30template <typename>
31struct is_tuple : std::false_type
32{
33};
34#endif
40template <typename... T>
41struct is_tuple<std::tuple<T...>> : std::true_type
42{
43};
44
52template <class Tuple, class Type>
53requires is_tuple<Tuple>::value
54consteval int countType() {
55 int count = 0;
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>)
59 ++count;
60 });
61 return count;
62}
63
72template <typename Fun, typename... Args>
73using ReturnType = std::invoke_result_t<Fun, Args...>;
74
83template <typename T, typename Tuple>
84struct hasType : std::false_type
85{
86};
87
88#ifndef DOXYGEN
89template <typename T>
90struct hasType<T, std::tuple<>> : std::false_type
91{
92};
93
94template <typename T>
95struct hasType<T, T> : std::true_type
96{
97};
98
106template <typename T, typename U, typename... Ts>
107struct hasType<T, std::tuple<U, Ts...>> : hasType<T, std::tuple<Ts...>>
108{
109};
110
111template <typename T, typename... Ts>
112struct hasType<T, std::tuple<T, Ts...>> : std::true_type
113{
114};
115#endif
116
117#ifndef DOXYGEN
118template <template <typename...> class, typename...>
119struct isSpecialization : std::false_type
120{
121};
122#endif
123
131template <typename T>
132struct isSharedPtr : std::false_type
133{
134};
135
136#ifndef DOXYGEN
137template <typename T>
138struct isSharedPtr<std::shared_ptr<T>> : std::true_type
139{
140};
141#endif
142
143template <typename T>
145{
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>;
149
150public:
151 using type = typename decltype(test(0))::type;
152};
153
154template <typename T>
156
163template <template <typename...> class U, typename... T>
164struct isSpecialization<U, U<T...>> : std::true_type
165{
166};
167
168#ifndef DOXYGEN
169template <template <typename, auto...> class Type, typename>
170struct isSpecializationTypeAndNonTypes : std::false_type
171{
172};
173
174template <template <typename, auto...> class Type, typename T, auto... N>
175struct isSpecializationTypeAndNonTypes<Type, Type<T, N...>> : std::true_type
176{
177};
178
179template <template <auto, typename...> class Type, typename>
180struct isSpecializationNonTypeAndTypes : std::false_type
181{
182};
183#endif
184
194template <template <auto, typename...> class Type, auto T, typename... N>
195struct isSpecializationNonTypeAndTypes<Type, Type<T, N...>> : std::true_type
196{
197};
198
199#ifndef DOXYGEN
200template <template <typename, auto, typename> class Type, typename>
201struct isSpecializationTypeNonTypeAndType : std::false_type
202{
203};
204#endif
215template <template <typename, auto, typename> class Type, typename T, auto M, typename N>
216struct isSpecializationTypeNonTypeAndType<Type, Type<T, M, N>> : std::true_type
217{
218};
219
220#ifndef DOXYGEN
221template <template <auto...> class Type, typename>
222struct isSpecializationNonTypes : std::false_type
223{
224};
225#endif
226
235template <template <auto...> class Type, auto... N>
236struct isSpecializationNonTypes<Type, Type<N...>> : std::true_type
237{
238};
239
257template <class T, class Tuple>
258struct Index;
259#ifndef DOXYGEN
260template <class T>
261struct Index<T, std::tuple<>>
262{
263 static const std::size_t value = 0;
264};
265
266template <class T, class... Types>
267struct Index<T, std::tuple<T, Types...>>
268{
269 static constexpr std::size_t value = 0;
270};
271
272template <class T, class U, class... Types>
273struct Index<T, std::tuple<U, Types...>>
274{
275 static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value;
276};
277#endif
278
296template <class Container, class NewType>
297struct Rebind;
298
299#ifndef DOXYGEN
300/*
301 * Specialization for types like std::vector<...> and nested std::vector<std::vector>
302 */
303template <class OldType, class... Args, template <class...> class Container, class NewType>
304struct Rebind<Container<OldType, Args...>, NewType>
305{
306 using other = Container<NewType, typename Rebind<Args, NewType>::other...>;
307};
308
309/*
310 * Specialization for types like std::array<...,N>
311 */
312template <class OldType, std::size_t N, template <class, std::size_t> class Container, class NewType>
313struct Rebind<Container<OldType, N>, NewType>
314{
315 using other = Container<NewType, N>;
316};
317
318#endif
319
329template <typename T, typename = void>
331
332#ifndef DOXYGEN
336template <typename R, typename... Args>
337struct FunctionTraits<R (*)(Args...)>
338{
339 using return_type = R;
340 template <int i>
341 using args_type = typename std::tuple_element<i, std::tuple<Args...>>::type;
342 static constexpr int numberOfArguments = sizeof...(Args);
343};
344
348template <typename R, typename C, typename... Args>
349struct FunctionTraits<R (C::*)(Args...) const>
350{
351 using return_type = R;
352 template <int i>
353 using args_type = typename std::tuple_element<i, std::tuple<Args...>>::type;
354 static constexpr int numberOfArguments = sizeof...(Args);
355};
356
360template <typename R, typename C, typename... Args>
361struct FunctionTraits<R (C::*)(Args...)>
362{
363 using return_type = R;
364 template <int i>
365 using args_type = typename std::tuple_element<i, std::tuple<Args...>>::type;
366 static constexpr int numberOfArguments = sizeof...(Args);
367};
368
373template <typename T>
374struct FunctionTraits<T, Dune::void_t<decltype(&T::operator())>> : public FunctionTraits<decltype(&T::operator())>
375{
376};
377#endif
378
379} // 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:73
::value consteval int countType()
Metafunction to count the occurrences of a specific type in a tuple.
Definition: traits.hh:54
STL namespace.
Definition: utils/dirichletvalues.hh:28
Definition: traits.hh:19
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