fennec
Loading...
Searching...
No Matches
type_transforms.h
Go to the documentation of this file.
1// =====================================================================================================================
2// fennec, a free and open source game engine
3// Copyright © 2025 Medusa Slockbower
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General License for more details.
14//
15// You should have received a copy of the GNU General License
16// along with this program. If not, see <https://www.gnu.org/licenses/>.
17// =====================================================================================================================
18
30
31#ifndef FENNEC_LANG_TYPE_TRANSFORMS_H
32#define FENNEC_LANG_TYPE_TRANSFORMS_H
33
35#include <fennec/lang/type_identity.h>
36#include <fennec/lang/detail/_type_traits.h>
37#include <fennec/lang/detail/_type_transforms.h>
38
125
126
127namespace fennec
128{
129
130// Decay Conversions ===================================================================================================
131
132template<typename T> struct decay : detail::_decay<T> {};
133
134template<typename T> using decay_t = typename decay<T>::type;
135
136// Pointer Conversions =================================================================================================
137
143template<typename T> struct add_pointer : detail::_add_pointer<T>{};
144
147template<typename T> using add_pointer_t = typename add_pointer<T>::type;
148
149
155template<typename T> struct remove_pointer : detail::_remove_pointer<T> {};
156
159template<typename T> using remove_pointer_t = typename remove_pointer<T>::type;
160
161
167template<typename T> struct strip_pointers : conditional_t<
168 detail::_is_pointer<T>::value,
169 strip_pointers<remove_pointer_t<T>>,
170 type_identity<T>
171 > {};
172
173template<typename T> using strip_pointers_t = strip_pointers<T>::type;
174
175
176
177// Reference Conversions ===============================================================================================
178
184template<typename T> struct add_reference : type_identity<T&> {};
185
188template<typename T> using add_reference_t = typename add_reference<T>::type;
189
190
196template<typename T> struct remove_reference : type_identity<T> {};
197
198// specialization for `T&`
199template<typename T> struct remove_reference<T&> : type_identity<T> {};
200
201// specialization for `T&&`
202template<typename T> struct remove_reference<T&&> : type_identity<T> {};
203
206template<typename T> using remove_reference_t = typename remove_reference<T>::type;
207
208
214template<typename T> struct add_lvalue_reference : detail::_add_lvalue_reference<T> {};
215
218template<typename T> using add_lvalue_reference_t = typename add_lvalue_reference<T>::type;
219
220
226template<typename T> struct add_rvalue_reference : detail::_add_rvalue_reference<T> {};
227
230template<typename T> using add_rvalue_reference_t = typename add_rvalue_reference<T>::type;
231
232
233
234// Const & Volatile Conversions ========================================================================================
235
241template<typename T> struct add_const : detail::_add_const<T> {};
242
245template<typename T> using add_const_t = typename add_const<T>::type;
246
247
253template<typename T> struct remove_const : detail::_remove_const<T> {};
254
257template<typename T> using remove_const_t = typename remove_const<T>::type;
258
259
260
266template<typename T> struct add_volatile : detail::_add_volatile<T> {};
267
270template<typename T> using add_volatile_t = typename add_volatile<T>::type;
271
272
278template<typename T> struct remove_volatile : detail::_remove_volatile<T> {};
279
282template<typename T> using remove_volatile_t = typename remove_volatile<T>::type;
283
284
285
292template<typename T> struct add_cv : detail::_add_cv<T> {};
293
296template<typename T> using add_cv_t = typename add_cv<T>::type;
297
298
299
306template<typename T> struct remove_cv : detail::_remove_cv<T> {};
307
310template<typename T> using remove_cv_t = typename remove_cv<T>::type;
311
312
313
319template<typename T> struct add_cvref : type_identity<add_reference_t<add_cv_t<T>>> {};
320
323template<typename T> using add_cvref_t = typename add_cvref<T>::type;
324
325
326
332template<typename T> struct remove_cvref : type_identity<remove_cv_t<remove_reference_t<T>>> {};
333
334
337template<typename T> using remove_cvref_t = typename remove_cvref<T>::type;
338
339
340
346template<typename T> struct remove_cvrefptr : type_identity<remove_cv_t<remove_reference_t<strip_pointers_t<T>>>> {};
347
348
351template<typename T> using remove_cvrefptr_t = typename remove_cvrefptr<T>::type;
352
353}
354
355#endif // FENNEC_LANG_TYPE_TRANSFORMS_H
Conditional Types
typename conditional< B, TrueT, FalseT >::type conditional_t
Shorthand for typename conditional<ConditionV, TrueT, FalseT>::type
Definition conditional_types.h:90
add the const qualifier to the provided type T
Definition type_transforms.h:241
remove the volatile qualifier from the provided type T
Definition type_transforms.h:292
add a reference and the const volatile qualifiers from the provided type T
Definition type_transforms.h:319
add a lvalue reference to T
Definition type_transforms.h:214
adds a pointer level to T
Definition type_transforms.h:143
add a reference to T
Definition type_transforms.h:184
add a rvalue reference to T
Definition type_transforms.h:226
add the volatile qualifier to the provided type T
Definition type_transforms.h:266
remove the const qualifier from the provided type T
Definition type_transforms.h:253
remove the const and volatile qualifiers from the provided type T
Definition type_transforms.h:306
removes references as well as the const and volatile qualifiers from the provided type T
Definition type_transforms.h:332
removes references and pointers as well as the const and volatile qualifiers from the provided type T
Definition type_transforms.h:346
removes a pointer level from T
Definition type_transforms.h:155
remove a reference from T
Definition type_transforms.h:196
remove the volatile qualifier from the provided type T
Definition type_transforms.h:278
removes all pointer levels from T
Definition type_transforms.h:171
Base Class for Type Transformations.
Definition type_identity.h:49
T & type
the type to transform into
Definition type_identity.h:52
typename remove_volatile< T >::type remove_volatile_t
shorthand for typename remove_volatile<T>::type
Definition type_transforms.h:282
typename remove_const< T >::type remove_const_t
shorthand for typename remove_const<T>::type
Definition type_transforms.h:257
typename add_pointer< T >::type add_pointer_t
shorthand for typename add_pointer<T>::type
Definition type_transforms.h:147
typename add_cv< T >::type add_cv_t
shorthand for typename add_cv<T>::type
Definition type_transforms.h:296
typename add_const< T >::type add_const_t
shorthand for typename add_const<T>::type
Definition type_transforms.h:245
typename add_reference< T >::type add_reference_t
shorthand for typename add_reference<T>::type
Definition type_transforms.h:188
typename add_volatile< T >::type add_volatile_t
shorthand for typename add_volatile<T>::type
Definition type_transforms.h:270
typename add_rvalue_reference< T >::type add_rvalue_reference_t
shorthand for typename remove_reference<T>::type
Definition type_transforms.h:230
typename add_cvref< T >::type add_cvref_t
shorthand for typename add_cvr<T>::type
Definition type_transforms.h:323
typename remove_reference< T >::type remove_reference_t
shorthand for typename remove_reference<T>::type
Definition type_transforms.h:206
typename remove_cvrefptr< T >::type remove_cvrefptr_t
shorthand for typename remove_cvrp_t<T>::type
Definition type_transforms.h:351
typename remove_cvref< T >::type remove_cvref_t
shorthand for typename remove_cvr<T>::type
Definition type_transforms.h:337
typename remove_pointer< T >::type remove_pointer_t
shorthand for typename remove_pointer<T>::type
Definition type_transforms.h:159
typename remove_cv< T >::type remove_cv_t
shorthand for typename remove_cv<T>::type
Definition type_transforms.h:310
typename add_lvalue_reference< T >::type add_lvalue_reference_t
shorthand for typename remove_reference<T>::type
Definition type_transforms.h:218