nCine 2026.03.r1-14c2a6f
A cross-platform 2D game engine
Loading...
Searching...
No Matches
type_traits.h
1#ifndef NCTL_TYPETRAITS
2#define NCTL_TYPETRAITS
3
4namespace nctl {
5
6namespace detail {
7
8 template <class T>
10 {
11 using type = T;
12 };
13
14 template <class T>
15 auto tryAddLValueReference(int) -> typeIdentity<T &>;
16 template <class T>
17 auto tryAddLValueReference(...) -> typeIdentity<T>;
18
19 template <class T>
20 auto tryAddRValueReference(int) -> typeIdentity<T &&>;
21 template <class T>
22 auto tryAddRValueReference(...) -> typeIdentity<T>;
23
24 template <class>
25 struct voidType
26 {
27 typedef void type;
28 };
29
30}
31
32using ptrDiffType = decltype(static_cast<int *>(nullptr) - static_cast<int *>(nullptr));
33
34template <class T, T v>
36{
37 static constexpr T value = v;
38 using valueType = T;
39 using type = integralConstant;
40
41 constexpr operator valueType() const noexcept { return value; }
42 constexpr valueType operator()() const noexcept { return value; }
43};
44
47
48template <class T>
50{
51 using type = T;
52};
53
54template <class T>
56{
57 using type = T;
58};
59
60template <class T>
62{
63 using type = T;
64};
65
66template <class T>
68{
69 using type = T;
70};
71
72template <class T>
74{
75 using type = typename removeConst<typename removeVolatile<T>::type>::type;
76};
77
78template <class T>
80{
81 using type = T;
82};
83
84template <class T>
85struct removeReference<T &>
86{
87 using type = T;
88};
89
90template <class T>
91struct removeReference<T &&>
92{
93 using type = T;
94};
95
96template <class T>
98{
99 typedef T type;
100};
101
102template <class T>
103struct removeExtent<T[]>
104{
105 typedef T type;
106};
107
108template <class T, unsigned int N>
109struct removeExtent<T[N]>
110{
111 typedef T type;
112};
113
114template <class T>
115using removeExtentT = typename removeExtent<T>::type;
116
117template <class T>
119{
120 using type = T;
121};
122
123template <class T>
124struct decayArray<T[]>
125{
126 using type = T*;
127};
128
129template <class T, unsigned int N>
130struct decayArray<T[N]>
131{
132 using type = T*;
133};
134
135template <class T, class... Args>
136struct decayArray<T(Args...)>
137{
138 using type = T(*)(Args...);
139};
140
141template <class T>
142struct Decay
143{
144 using NoRef = typename removeReference<T>::type;
145 using NoCV = typename removeCv<NoRef>::type;
146 using Type = typename decayArray<NoCV>::type;
147};
148
149template <class T>
151{
152 static constexpr bool value = false;
153};
154template <class T>
156{
157 static constexpr bool value = true;
158};
159
160template <class T>
161struct addLValueReference : decltype(detail::tryAddLValueReference<T>(0))
162{};
163template <class T>
164struct addRValueReference : decltype(detail::tryAddRValueReference<T>(0))
165{};
166template <class T>
167typename addRValueReference<T>::type declVal();
168
169template <class From, class To>
171{
172#if defined(_MSC_VER)
173 static constexpr bool value = __is_convertible_to(From, To);
174#else
175 static constexpr bool value = __is_convertible(From, To);
176#endif
177};
178
179template <class T>
181{
182 static constexpr bool value = __is_empty(T);
183};
184
185template <class T, typename = void>
186struct isClass : falseType {};
187
188template <class T>
189struct isClass<T, typename detail::voidType<int T::*>::type>
190 : integralConstant<bool, !__is_union(T)> {};
191
192template <class T>
194{
195 static constexpr bool value = __is_trivially_constructible(T);
196};
197
198template <typename T>
200{
201 static constexpr bool value = __is_constructible(T, T &&);
202};
203
204template <class T>
206{
207 static constexpr bool value = __is_constructible(T, const T &);
208};
209
210template <class T, class... Args>
213 bool,
214 __is_nothrow_constructible(T, Args...)
215 >
216{};
217
218template <class T>
220{
221 static constexpr bool value = __is_trivially_copyable(T);
222};
223
224template <class T, typename = void> struct isDestructible : falseType {};
225
226template <class T>
227struct isDestructible<T, decltype(declVal<T&>().~T())>
229
230// Use `__has_trivial_destructor()` only on GCC
231#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
232template <class T>
234{
235 static constexpr bool value = __has_trivial_destructor(T);
236};
237
238template <class T>
239struct isTriviallyDestructible
240{
241 static constexpr bool value = isDestructible<T>::value && hasTrivialDestructor<T>::value;
242};
243#else
244template <class T>
246{
247 static constexpr bool value = __is_trivially_destructible(T);
248};
249#endif
250
251template <bool B, typename T, typename F>
253{
254 using type = T;
255};
256template <typename T, typename F>
257struct conditional<false, T, F>
258{
259 using type = F;
260};
261
262template <bool Condition, typename T = void>
264{
265};
266template <typename T>
267struct enableIf<true, T>
268{
269 using type = T;
270};
271template <bool Condition, typename T = void>
272using enableIfT = typename enableIf<Condition, T>::type;
273
274template <typename T, typename U> struct isSame : falseType {};
275template <typename T> struct isSame<T, T> : trueType {};
276
277template <class T> struct isIntegral : falseType {};
278template <> struct isIntegral<bool> : trueType {};
279template <> struct isIntegral<char> : trueType {};
280template <> struct isIntegral<unsigned char> : trueType {};
281template <> struct isIntegral<short int> : trueType {};
282template <> struct isIntegral<unsigned short int> : trueType {};
283template <> struct isIntegral<int> : trueType {};
284template <> struct isIntegral<unsigned int> : trueType {};
285template <> struct isIntegral<long> : trueType {};
286template <> struct isIntegral<unsigned long> : trueType {};
287template <> struct isIntegral<long long> : trueType {};
288template <> struct isIntegral<unsigned long long> : trueType {};
289
290}
291
292#endif
A unique pointer implementation.
Definition UniquePtr.h:118
Definition type_traits.h:143
Definition type_traits.h:162
Definition type_traits.h:165
Definition type_traits.h:253
Definition type_traits.h:119
Definition type_traits.h:10
Definition type_traits.h:26
Definition type_traits.h:264
Definition type_traits.h:36
Definition type_traits.h:186
Definition type_traits.h:171
Definition type_traits.h:206
Definition type_traits.h:224
Definition type_traits.h:181
Definition type_traits.h:277
Definition type_traits.h:151
Definition type_traits.h:200
Definition type_traits.h:216
Definition type_traits.h:274
Definition type_traits.h:194
Definition type_traits.h:220
Definition type_traits.h:246
Definition type_traits.h:50
Definition type_traits.h:74
Definition type_traits.h:98
Definition type_traits.h:80
Definition type_traits.h:62