nCine 2026.01.r1-afae8f2
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
32template <class T, T v>
34{
35 static constexpr T value = v;
36 using valueType = T;
37 using type = integralConstant;
38
39 constexpr operator valueType() const noexcept { return value; }
40 constexpr valueType operator()() const noexcept { return value; }
41};
42
45
46template <class T>
48{
49 using type = T;
50};
51
52template <class T>
54{
55 using type = T;
56};
57
58template <class T>
60{
61 using type = T;
62};
63
64template <class T>
66{
67 using type = T;
68};
69
70template <class T>
72{
73 using type = typename removeConst<typename removeVolatile<T>::type>::type;
74};
75
76template <class T>
78{
79 using type = T;
80};
81template <class T>
82struct removeReference<T &>
83{
84 using type = T;
85};
86template <class T>
87struct removeReference<T &&>
88{
89 using type = T;
90};
91
92template <class T>
94{
95 static constexpr bool value = false;
96};
97template <class T>
99{
100 static constexpr bool value = true;
101};
102
103template <class T>
105{
106 typedef T type;
107};
108template <class T>
109struct removeExtent<T[]>
110{
111 typedef T type;
112};
113template <class T, unsigned int N>
114struct removeExtent<T[N]>
115{
116 typedef T type;
117};
118template <class T>
119using removeExtentT = typename removeExtent<T>::type;
120
121template <class T>
122struct addLValueReference : decltype(detail::tryAddLValueReference<T>(0))
123{};
124template <class T>
125struct addRValueReference : decltype(detail::tryAddRValueReference<T>(0))
126{};
127template <class T>
128typename addRValueReference<T>::type declVal();
129
130template <class T>
132{
133 static constexpr bool value = __is_empty(T);
134};
135
136template <class T, typename = void>
137struct isClass : falseType {};
138
139template <class T>
140struct isClass<T, typename detail::voidType<int T::*>::type>
141 : integralConstant<bool, !__is_union(T)> {};
142
143template <class T>
145{
146 static constexpr bool value = __is_trivially_constructible(T);
147};
148
149template <typename T>
151{
152 static constexpr bool value = __is_constructible(T, T &&);
153};
154
155template <class T>
157{
158 static constexpr bool value = __is_constructible(T, const T &);
159};
160
161template <class T, class... Args>
164 bool,
165 __is_nothrow_constructible(T, Args...)
166 >
167{};
168
169template <class T>
171{
172 static constexpr bool value = __is_trivially_copyable(T);
173};
174
175template <class T, typename = void> struct isDestructible : falseType {};
176
177template <class T>
178struct isDestructible<T, decltype(declVal<T&>().~T())>
180
181// Use `__has_trivial_destructor()` only on GCC
182#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
183template <class T>
185{
186 static constexpr bool value = __has_trivial_destructor(T);
187};
188
189template <class T>
190struct isTriviallyDestructible
191{
192 static constexpr bool value = isDestructible<T>::value && hasTrivialDestructor<T>::value;
193};
194#else
195template <class T>
197{
198 static constexpr bool value = __is_trivially_destructible(T);
199};
200#endif
201
202template <bool B, typename T, typename F>
204{
205 using type = T;
206};
207template <typename T, typename F>
208struct conditional<false, T, F>
209{
210 using type = F;
211};
212
213template <bool Condition, typename T = void>
215{
216};
217template <typename T>
218struct enableIf<true, T>
219{
220 using type = T;
221};
222
223template <typename T, typename U> struct isSame : falseType {};
224template <typename T> struct isSame<T, T> : trueType {};
225
226template <class T> struct isIntegral : falseType {};
227template <> struct isIntegral<bool> : trueType {};
228template <> struct isIntegral<char> : trueType {};
229template <> struct isIntegral<unsigned char> : trueType {};
230template <> struct isIntegral<short int> : trueType {};
231template <> struct isIntegral<unsigned short int> : trueType {};
232template <> struct isIntegral<int> : trueType {};
233template <> struct isIntegral<unsigned int> : trueType {};
234template <> struct isIntegral<long> : trueType {};
235template <> struct isIntegral<unsigned long> : trueType {};
236template <> struct isIntegral<long long> : trueType {};
237template <> struct isIntegral<unsigned long long> : trueType {};
238
239}
240
241#endif
A unique pointer implementation.
Definition UniquePtr.h:118
Definition type_traits.h:123
Definition type_traits.h:126
Definition type_traits.h:204
Definition type_traits.h:10
Definition type_traits.h:26
Definition type_traits.h:215
Definition type_traits.h:34
Definition type_traits.h:137
Definition type_traits.h:157
Definition type_traits.h:175
Definition type_traits.h:132
Definition type_traits.h:226
Definition type_traits.h:94
Definition type_traits.h:151
Definition type_traits.h:167
Definition type_traits.h:223
Definition type_traits.h:145
Definition type_traits.h:171
Definition type_traits.h:197
Definition type_traits.h:48
Definition type_traits.h:72
Definition type_traits.h:105
Definition type_traits.h:78
Definition type_traits.h:60