SPH
Traits.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "common/Globals.h"
9 #include <memory>
10 #include <type_traits>
11 
13 
15 template <int n, typename... TArgs>
16 struct TypeSelector;
17 
18 template <int n, typename T0, typename... TArgs>
19 struct TypeSelector<n, T0, TArgs...> : TypeSelector<n - 1, TArgs...> {};
20 
21 template <typename T0, typename... TArgs>
22 struct TypeSelector<0, T0, TArgs...> {
23  using Type = T0;
24 };
25 
26 template <int n, typename... TArgs>
27 using SelectType = typename TypeSelector<n, TArgs...>::Type;
28 
30 template <typename T0, int n, typename T1, typename... TArgs>
31 struct TypeIndex {
32  static constexpr int value = std::is_same<T0, T1>::value ? n : TypeIndex<T0, n + 1, TArgs...>::value;
33 };
34 
35 template <typename T0, int n, typename T1>
36 struct TypeIndex<T0, n, T1> {
37  static constexpr int value = std::is_same<T0, T1>::value ? n : -1;
38 };
39 
40 template <typename T0, typename... TArgs>
41 constexpr int getTypeIndex = TypeIndex<T0, 0, TArgs...>::value;
42 
43 
44 template <typename... Ts>
45 struct MakeVoid {
46  using Type = void;
47 };
48 template <typename... Ts>
49 using VoidType = typename MakeVoid<Ts...>::Type;
50 
52 
53 template <typename TSignature>
55  using T = TSignature;
56 };
57 
58 template <typename TFunction>
59 struct FunctionTraits : public FunctionTraits<decltype(&TFunction::operator())> {
60  using TSignature = typename FunctionTraits<decltype(&TFunction::operator())>::TSignature;
61 };
62 
63 template <typename TClass, typename TReturn, typename... TArgs>
64 struct FunctionTraits<TReturn (TClass::*)(TArgs...) const> {
65  using TSignature = typename FunctionSignature<TReturn(TArgs...)>::T;
66  using TReturnType = TReturn;
67 };
68 
69 template <typename TClass, typename TReturn, typename... TArgs>
70 struct FunctionTraits<TReturn (TClass::*)(TArgs...)> {
71  using TSignature = typename FunctionSignature<TReturn(TArgs...)>::T;
72  using TReturnType = TReturn;
73 };
74 
75 template <typename TReturn, typename... TArgs>
76 struct FunctionTraits<TReturn (*)(TArgs...)> {
77  using TSignature = typename FunctionSignature<TReturn(TArgs...)>::T;
78  using TReturnType = TReturn;
79 };
80 
81 template <typename TFunction>
83 
84 
85 template <typename TCallable, typename TEnabler, typename... TArgs>
87  static constexpr bool value = false;
88 };
89 
90 template <typename TCallable, typename... TArgs>
91 struct IsCallableImpl<TCallable,
92  VoidType<decltype(std::declval<TCallable>()(std::declval<TArgs>()...))>,
93  TArgs...> {
94  static constexpr bool value = true;
95 };
96 template <typename TCallable, typename... TArgs>
97 struct IsCallable {
98  static constexpr bool value = IsCallableImpl<TCallable, void, TArgs...>::value;
99 };
100 
101 
102 template <typename T, typename TStream, typename = void>
104  static constexpr bool value = false;
105 };
106 
107 template <typename T, typename TStream>
108 struct HasStreamOperator<T, TStream, VoidType<decltype(std::declval<TStream&>() << std::declval<T>())>> {
109  static constexpr bool value = true;
110 };
111 
112 
114 template <typename T>
116 private:
117  T* data = nullptr;
118 
119 public:
120  ReferenceWrapper() = default;
121 
123  : data(other.data) {}
124 
126  : data(std::addressof(ref)) {}
127 
129  data = other.data;
130  return *this;
131  }
132 
133  INLINE operator T&() noexcept {
134  return *data;
135  }
136 
137  INLINE operator const T&() const noexcept {
138  return *data;
139  }
140 };
141 
142 
144 template <typename T>
146  using Type = T;
147 };
148 template <typename T>
149 struct WrapReferenceType<T&> {
151 };
152 template <typename T>
154 
155 
157 template <typename T>
159  using Type = T;
160 };
161 template <typename T>
163  using Type = T&;
164 };
165 
167 template <typename T, typename TOther>
168 struct UndecayType {
169  using Type = T;
170 };
171 
172 template <typename T, typename TOther>
173 struct UndecayType<T, const TOther> {
174  using Type = const T;
175 };
176 template <typename T, typename TOther>
177 struct UndecayType<T, TOther&> {
178  using Type = T&;
179 };
180 template <typename T, typename TOther>
181 struct UndecayType<T, const TOther&> {
182  using Type = const T&;
183 };
184 template <typename T, typename TOther>
186 
188 template <typename T, typename TEnabler = void>
190  using Type = T;
191 };
192 template <typename T>
193 struct ConvertToSizeType<T, std::enable_if_t<std::is_enum<std::decay_t<T>>::value>> {
195 };
196 template <typename T>
198 
199 
200 template <typename T>
201 struct IsEnumClass {
202  static constexpr bool value = std::is_enum<T>::value && !std::is_convertible<T, int>::value;
203 };
204 
205 
208 template <bool... Values>
209 struct AllTrue;
210 template <bool First, bool Second, bool... Others>
211 struct AllTrue<First, Second, Others...> {
212  static constexpr bool value = First && AllTrue<Second, Others...>::value;
213 };
214 template <bool Value>
215 struct AllTrue<Value> {
216  static constexpr bool value = Value;
217 };
218 
220 template <bool... Values>
221 struct AnyTrue;
222 template <bool First, bool Second, bool... Others>
223 struct AnyTrue<First, Second, Others...> {
224  static constexpr bool value = First || AnyTrue<Second, Others...>::value;
225 };
226 template <bool Value>
227 struct AnyTrue<Value> {
228  static constexpr bool value = Value;
229 };
230 
231 
236 template <typename T>
237 INLINE const T& asConst(T& ref) {
238  return ref;
239 }
240 
241 template <typename T>
242 INLINE const T& asConst(const T&& ref) = delete;
243 
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Global parameters of the code.
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define NAMESPACE_SPH_END
Definition: Object.h:12
INLINE const T & asConst(T &ref)
Converts a non-const reference to const one.
Definition: Traits.h:237
typename TypeSelector< n, TArgs... >::Type SelectType
Definition: Traits.h:27
constexpr int getTypeIndex
Definition: Traits.h:41
typename UndecayType< T, TOther >::Type Undecay
Definition: Traits.h:185
typename ConvertToSizeType< T >::Type ConvertToSize
Definition: Traits.h:197
typename FunctionTraits< TFunction >::TReturnType ReturnType
Definition: Traits.h:82
typename WrapReferenceType< T >::Type WrapReference
Definition: Traits.h:153
typename MakeVoid< Ts... >::Type VoidType
Definition: Traits.h:49
Helper class for storing l-value references. Has a default constructor for convenient usage in contai...
Definition: Traits.h:115
ReferenceWrapper()=default
ReferenceWrapper(const ReferenceWrapper &other)
Definition: Traits.h:122
ReferenceWrapper(T &ref)
Definition: Traits.h:125
ReferenceWrapper & operator=(const ReferenceWrapper &other)
Definition: Traits.h:128
Overload of std::swap for Sph::Array.
Definition: Array.h:578
Static logical or.
Definition: Traits.h:221
Undecay< std::underlying_type_t< std::decay_t< T > >, T > Type
Definition: Traits.h:194
Converts all signed integral types and enums into Size, does not change other types.
Definition: Traits.h:189
Function traits.
Definition: Traits.h:54
TSignature T
Definition: Traits.h:55
typename FunctionSignature< TReturn(TArgs...)>::T TSignature
Definition: Traits.h:65
typename FunctionSignature< TReturn(TArgs...)>::T TSignature
Definition: Traits.h:71
typename FunctionSignature< TReturn(TArgs...)>::T TSignature
Definition: Traits.h:77
typename FunctionTraits< decltype(&TFunction::operator())>::TSignature TSignature
Definition: Traits.h:60
static constexpr bool value
Definition: Traits.h:104
static constexpr bool value
Definition: Traits.h:87
static constexpr bool value
Definition: Traits.h:98
static constexpr bool value
Definition: Traits.h:202
void Type
Definition: Traits.h:46
Returns the index of type T0 in type list. If the type is not in the list, returns -1.
Definition: Traits.h:31
static constexpr int value
Definition: Traits.h:32
Gets n-th type.
Definition: Traits.h:16
Adds const or reference to the type, based on const-ness and reference-ness of given type.
Definition: Traits.h:168
Type trait for "extracting" stored references from reference_wrappers. Other types keeps unchanged.
Definition: Traits.h:158
Type trait wrapping references. Other types keeps unchanged.
Definition: Traits.h:145