Iros
 
Loading...
Searching...
No Matches
language.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/core.h"
4#include "di/types/integers.h"
7
8namespace di::concepts {
9namespace detail {
10 template<typename T>
11 constexpr inline bool const_helper = false;
12
13 template<typename T>
14 constexpr inline bool const_helper<T const> = true;
15}
16
17template<typename T>
19
20namespace detail {
21 template<typename T>
22 constexpr inline bool lvalue_reference_helper = false;
23
24 template<typename T>
25 constexpr inline bool lvalue_reference_helper<T&> = true;
26
27}
28
29template<typename T>
31
32template<typename T>
34
35namespace detail {
36 template<typename T>
37 constexpr inline bool rvalue_reference_helper = false;
38
39 template<typename T>
40 constexpr inline bool rvalue_reference_helper<T&&> = true;
41}
42
43template<typename T>
45
46template<typename T>
48
49template<typename T>
51
52namespace detail {
53 template<typename T>
54 constexpr inline bool pointer_helper = false;
55
56 template<typename T>
57 constexpr inline bool pointer_helper<T*> = true;
58}
59
60template<typename T>
62
63template<typename T>
65}
66
67namespace di::meta {
68namespace detail {
69 template<typename T>
71
72 template<typename R, typename... Args>
73 struct LanguageFunctionReturnHelper<R(Args...)> : TypeConstant<R> {};
74}
75
76template<concepts::LanguageFunction Fun>
78
79template<typename R>
84}
85
86namespace di::concepts {
87namespace detail {
88 template<typename T>
89 constexpr inline bool bounded_language_array_helper = false;
90
91 template<typename T, usize N>
92 constexpr inline bool bounded_language_array_helper<T[N]> = true;
93}
94
95template<typename T>
97
98namespace detail {
99 template<typename T>
100 constexpr inline bool unbounded_language_array_helper = false;
101
102 template<typename T>
103 constexpr inline bool unbounded_language_array_helper<T[]> = true;
104}
105
106template<typename T>
108
109template<typename T>
111}
112
113namespace di::meta {
114namespace detail {
115 template<typename T>
117
118 template<typename T>
119 struct RemoveExtentHelper<T[]> : TypeConstant<T> {};
120
121 template<typename T, types::size_t N>
122 struct RemoveExtentHelper<T[N]> : TypeConstant<T> {};
123}
124
125template<typename T>
127
128namespace detail {
129 template<typename T>
131
132 template<concepts::LanguageArray T>
133 struct RemoveAllExtentsHelper<T> : RemoveAllExtentsHelper<RemoveExtent<T>> {};
134}
135
136template<typename T>
138
139template<typename T>
140constexpr inline auto ArrayRank = 0ZU;
141
142template<typename T>
143constexpr inline auto ArrayRank<T[]> = 1 + ArrayRank<T>;
144
145template<typename T, usize N>
146constexpr inline auto ArrayRank<T[N]> = 1 + ArrayRank<T>;
147
148template<typename T, types::size_t level = 0>
149constexpr inline auto Extent = 0ZU;
150
151template<typename T, usize level>
152constexpr inline auto Extent<T[], level> = Extent<T, level - 1>;
153
154template<typename T, usize size>
155constexpr inline auto Extent<T[size], 0> = size;
156
157template<typename T, usize size, usize level>
158constexpr inline auto Extent<T[size], level> = Extent<T, level - 1>;
159}
160
161namespace di::concepts {
162namespace detail {
163 template<typename T>
164 constexpr inline bool member_pointer_helper = false;
165
166 template<typename T, typename U>
167 constexpr inline bool member_pointer_helper<T U::*> = true;
168}
169
170template<typename T>
172}
173
174namespace di::meta {
175namespace detail {
176 template<typename T>
178
179 template<typename Value, typename Class>
180 struct MemberPointerValueHelper<Value Class::*> : TypeConstant<Value> {};
181}
182
183template<concepts::MemberPointer T>
185
186namespace detail {
187 template<typename T>
189
190 template<typename Value, typename Class>
191 struct MemberPointerClassHelper<Value Class::*> : TypeConstant<Class> {};
192}
193
194template<concepts::MemberPointer T>
196}
197
198namespace di::concepts {
199template<typename T>
201
202template<typename T>
204
205template<typename T>
207
208template<typename T>
209concept InitializerList = InstanceOf<meta::RemoveCVRef<T>, std::initializer_list>;
210
211template<typename T>
212concept Aggregate = __is_aggregate(meta::RemoveCV<T>);
213
214template<typename T>
215concept Integer = OneOf<meta::RemoveCV<T>, signed char, char, short, int, long, long long, unsigned char,
216 unsigned short, unsigned int, unsigned long, unsigned long long
217#ifdef DI_HAVE_128_BIT_INTEGERS
218 ,
219 types::i128, types::u128
220#endif
221 >;
222
223template<typename T>
224concept Integral = OneOf<meta::RemoveCV<T>, bool, signed char, char, short, int, long, long long, unsigned char,
225 unsigned short, unsigned int, unsigned long, unsigned long long,
226#ifdef DI_HAVE_128_BIT_INTEGERS
227 types::i128, types::u128,
228#endif
229 char8_t, char16_t, char32_t>;
230
231template<typename T>
232concept FloatingPoint = OneOf<meta::RemoveCV<T>, float, double, long double>;
233
234template<typename T>
236
237template<typename T>
238concept Signed = Arithmetic<T> && (T(-1) < T(0));
239
240template<typename T>
242
243template<typename T>
245
246template<typename T>
248
249template<typename T>
251
252template<typename T>
253concept Class = __is_class(T);
254
255template<typename T>
256concept Union = __is_union(T);
257
258template<typename T>
259concept Enum = __is_enum(T);
260
261template<typename T>
263}
264
265namespace di::meta {
266template<concepts::Enum T>
267using UnderlyingType = __underlying_type(T);
268
269namespace detail {
270 template<typename T>
272
273 template<concepts::Enum T>
274 struct MakeSignedHelper<T> : MakeSignedHelper<UnderlyingType<T>> {};
275
276 template<concepts::SignedIntegral T>
278
279 template<>
280 struct MakeSignedHelper<unsigned char> : TypeConstant<char> {};
281
282 template<>
283 struct MakeSignedHelper<unsigned short> : TypeConstant<short> {};
284
285 template<>
286 struct MakeSignedHelper<unsigned int> : TypeConstant<int> {};
287
288 template<>
289 struct MakeSignedHelper<unsigned long> : TypeConstant<long> {};
290
291 template<>
292 struct MakeSignedHelper<unsigned long long> : TypeConstant<long long> {};
293
294#ifdef DI_HAVE_128_BIT_INTEGERS
295 template<>
296 struct MakeSignedHelper<types::u128> : TypeConstant<types::i128> {};
297#endif
298
299 template<>
300 struct MakeSignedHelper<char8_t> : TypeConstant<types::i8> {};
301
302 template<>
303 struct MakeSignedHelper<char16_t> : TypeConstant<types::i16> {};
304
305 template<>
306 struct MakeSignedHelper<char32_t> : TypeConstant<types::i32> {};
307
308 template<>
309 struct MakeSignedHelper<float> : TypeConstant<float> {};
310
311 template<>
312 struct MakeSignedHelper<double> : TypeConstant<double> {};
313}
314
315template<typename T>
317
318namespace detail {
319 template<typename T>
321
322 template<concepts::Enum T>
323 struct MakeUnsignedHelper<T> : MakeUnsignedHelper<UnderlyingType<T>> {};
324
325 template<concepts::UnsignedIntegral T>
327
328 template<>
329 struct MakeUnsignedHelper<char> : TypeConstant<unsigned char> {};
330
331 template<>
332 struct MakeUnsignedHelper<signed char> : TypeConstant<unsigned char> {};
333
334 template<>
335 struct MakeUnsignedHelper<short> : TypeConstant<unsigned short> {};
336
337 template<>
338 struct MakeUnsignedHelper<int> : TypeConstant<unsigned int> {};
339
340 template<>
341 struct MakeUnsignedHelper<long> : TypeConstant<unsigned long> {};
342
343 template<>
344 struct MakeUnsignedHelper<long long> : TypeConstant<unsigned long long> {};
345
346#ifdef DI_HAVE_128_BIT_INTEGERS
347 template<>
348 struct MakeUnsignedHelper<types::i128> : TypeConstant<types::u128> {};
349#endif
350
351 template<>
352 struct MakeUnsignedHelper<char8_t> : TypeConstant<types::u8> {};
353
354 template<>
355 struct MakeUnsignedHelper<char16_t> : TypeConstant<types::u16> {};
356
357 template<>
358 struct MakeUnsignedHelper<char32_t> : TypeConstant<types::u32> {};
359}
360
361template<typename T>
363}
364
365namespace di::concepts {
366template<typename T>
368
369template<typename T>
371
372template<typename T, typename U>
373concept BaseOf = __is_base_of(T, U);
374
375template<typename T>
376concept UniqueObjectRepresentation = __has_unique_object_representations(meta::RemoveCV<meta::RemoveAllExtents<T>>);
377}
378
379namespace di::meta {
380template<typename T>
381using AddConst = T const;
382
383template<typename T>
384using AddVolatile = T volatile;
385
386template<typename T>
387using AddCV = T const volatile;
388
389namespace detail {
390 template<typename T>
392
393 template<typename T>
394 requires(requires { typename TypeConstant<T&>; })
396}
397
398template<typename T>
400
401namespace detail {
402 template<typename T>
404
405 template<typename T>
406 requires(requires { typename TypeConstant<T&&>; })
408}
409
410template<typename T>
412
413namespace detail {
414 template<typename T>
416
417 template<typename T>
418 requires(requires { typename TypeConstant<RemoveReference<T>*>; })
420}
421
426template<typename T>
428
429namespace detail {
430 template<typename T, typename U>
431 struct LikeHelper : TypeConstant<U> {};
432
433 template<typename T, typename U>
434 struct LikeHelper<T const, U> : TypeConstant<U const> {};
435
436 template<typename T, typename U>
437 struct LikeHelper<T volatile, U> : TypeConstant<U volatile> {};
438
439 template<typename T, typename U>
440 struct LikeHelper<T const volatile, U> : TypeConstant<U const volatile> {};
441
442 template<typename T, typename U>
443 struct LikeHelper<T&, U> : TypeConstant<U&> {};
444
445 template<typename T, typename U>
446 struct LikeHelper<T const&, U> : TypeConstant<U const&> {};
447
448 template<typename T, typename U>
449 struct LikeHelper<T volatile&, U> : TypeConstant<U volatile&> {};
450
451 template<typename T, typename U>
452 struct LikeHelper<T const volatile&, U> : TypeConstant<U const volatile&> {};
453
454 template<typename T, typename U>
455 struct LikeHelper<T&&, U> : TypeConstant<U&&> {};
456
457 template<typename T, typename U>
458 struct LikeHelper<T const&&, U> : TypeConstant<U const&&> {};
459
460 template<typename T, typename U>
461 struct LikeHelper<T volatile&&, U> : TypeConstant<U volatile&&> {};
462
463 template<typename T, typename U>
464 struct LikeHelper<T const volatile&&, U> : TypeConstant<U const volatile&&> {};
465}
466
467template<typename T, typename U>
469
470template<typename T>
472
473namespace detail {
474 template<typename T>
476
477 template<typename T>
479
480 template<typename T>
482
483 template<typename T>
484 struct RemovePointerHelper<T* volatile> : TypeConstant<T> {};
485
486 template<typename T>
487 struct RemovePointerHelper<T* const volatile> : TypeConstant<T> {};
488}
489
490template<typename T>
492
493namespace detail {
494 template<typename T>
496
497 template<typename R, typename... Args>
498 struct RemoveFunctionQualifiersHelper<R(Args...)> : TypeConstant<R(Args...)> {};
499
500 template<typename R, typename... Args>
501 struct RemoveFunctionQualifiersHelper<R(Args...) const> : TypeConstant<R(Args...)> {};
502
503 template<typename R, typename... Args>
504 struct RemoveFunctionQualifiersHelper<R(Args...) volatile> : TypeConstant<R(Args...)> {};
505
506 template<typename R, typename... Args>
507 struct RemoveFunctionQualifiersHelper<R(Args...) const volatile> : TypeConstant<R(Args...)> {};
508
509 template<typename R, typename... Args>
510 struct RemoveFunctionQualifiersHelper<R(Args...)&> : TypeConstant<R(Args...)> {};
511
512 template<typename R, typename... Args>
513 struct RemoveFunctionQualifiersHelper<R(Args...) const&> : TypeConstant<R(Args...)> {};
514
515 template<typename R, typename... Args>
516 struct RemoveFunctionQualifiersHelper<R(Args...) volatile&> : TypeConstant<R(Args...)> {};
517
518 template<typename R, typename... Args>
519 struct RemoveFunctionQualifiersHelper<R(Args...) const volatile&> : TypeConstant<R(Args...)> {};
520
521 template<typename R, typename... Args>
522 struct RemoveFunctionQualifiersHelper<R(Args...) &&> : TypeConstant<R(Args...)> {};
523
524 template<typename R, typename... Args>
525 struct RemoveFunctionQualifiersHelper<R(Args...) const&&> : TypeConstant<R(Args...)> {};
526
527 template<typename R, typename... Args>
528 struct RemoveFunctionQualifiersHelper<R(Args...) volatile&&> : TypeConstant<R(Args...)> {};
529
530 template<typename R, typename... Args>
531 struct RemoveFunctionQualifiersHelper<R(Args...) const volatile&&> : TypeConstant<R(Args...)> {};
532
533 template<typename R, typename... Args>
534 struct RemoveFunctionQualifiersHelper<R(Args...) noexcept> : TypeConstant<R(Args...)> {};
535
536 template<typename R, typename... Args>
537 struct RemoveFunctionQualifiersHelper<R(Args...) const noexcept> : TypeConstant<R(Args...)> {};
538
539 template<typename R, typename... Args>
540 struct RemoveFunctionQualifiersHelper<R(Args...) volatile noexcept> : TypeConstant<R(Args...)> {};
541
542 template<typename R, typename... Args>
543 struct RemoveFunctionQualifiersHelper<R(Args...) const volatile noexcept> : TypeConstant<R(Args...)> {};
544
545 template<typename R, typename... Args>
546 struct RemoveFunctionQualifiersHelper<R(Args...) & noexcept> : TypeConstant<R(Args...)> {};
547
548 template<typename R, typename... Args>
549 struct RemoveFunctionQualifiersHelper<R(Args...) const & noexcept> : TypeConstant<R(Args...)> {};
550
551 template<typename R, typename... Args>
552 struct RemoveFunctionQualifiersHelper<R(Args...) volatile & noexcept> : TypeConstant<R(Args...)> {};
553
554 template<typename R, typename... Args>
555 struct RemoveFunctionQualifiersHelper<R(Args...) const volatile & noexcept> : TypeConstant<R(Args...)> {};
556
557 template<typename R, typename... Args>
558 struct RemoveFunctionQualifiersHelper<R(Args...) && noexcept> : TypeConstant<R(Args...)> {};
559
560 template<typename R, typename... Args>
561 struct RemoveFunctionQualifiersHelper<R(Args...) const && noexcept> : TypeConstant<R(Args...)> {};
562
563 template<typename R, typename... Args>
564 struct RemoveFunctionQualifiersHelper<R(Args...) volatile && noexcept> : TypeConstant<R(Args...)> {};
565
566 template<typename R, typename... Args>
567 struct RemoveFunctionQualifiersHelper<R(Args...) const volatile && noexcept> : TypeConstant<R(Args...)> {};
568}
569
570template<typename T>
572
573template<typename T>
577}
Definition language.h:212
Definition language.h:235
Definition language.h:373
Definition language.h:96
Definition language.h:253
Definition language.h:33
Definition language.h:18
Definition language.h:259
Definition language.h:232
Definition language.h:209
Definition core.h:139
Definition language.h:215
Definition language.h:262
Definition language.h:224
Definition language.h:30
Definition language.h:110
Definition language.h:64
Definition language.h:200
Definition language.h:203
Definition language.h:171
Definition language.h:47
Definition language.h:206
Definition language.h:370
Definition core.h:117
Definition language.h:61
Definition language.h:44
Definition language.h:50
Definition core.h:114
Definition language.h:367
Definition language.h:241
Definition language.h:247
Definition language.h:238
Definition language.h:107
Definition language.h:256
Definition language.h:244
Definition language.h:250
Definition impl.h:7
constexpr bool rvalue_reference_helper
Definition language.h:37
constexpr bool member_pointer_helper
Definition language.h:164
constexpr bool bounded_language_array_helper
Definition language.h:89
constexpr bool lvalue_reference_helper
Definition language.h:22
constexpr bool const_helper
Definition language.h:11
constexpr bool unbounded_language_array_helper
Definition language.h:100
constexpr bool pointer_helper
Definition language.h:54
Definition any_storable.h:9
Definition json_deserializer.h:532
Definition const_sentinel.h:8
Definition merge_interfaces.h:6
T volatile AddVolatile
Definition language.h:384
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
Type< detail::RemoveFunctionQualifiersHelper< T > > RemoveFunctionQualifiers
Definition language.h:571
Type< detail::MemberPointerValueHelper< RemoveCV< T > > > MemberPointerValue
Definition language.h:184
T::Type Type
Definition core.h:26
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
Type< detail::RemovePointerHelper< T > > RemovePointer
Definition language.h:491
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
Type< detail::LikeHelper< T, U > > Like
Definition language.h:468
Type< detail::LanguageFunctionReturnHelper< Fun > > LanguageFunctionReturn
Definition language.h:77
Type< detail::RemoveExtentHelper< T > > RemoveExtent
Definition language.h:126
T const volatile AddCV
Definition language.h:387
detail::MakeSignedHelper< RemoveCV< T > >::Type MakeSigned
Definition language.h:316
constexpr auto Extent
Definition language.h:149
constexpr auto ArrayRank
Definition language.h:140
detail::MakeUnsignedHelper< RemoveCV< T > >::Type MakeUnsigned
Definition language.h:362
Type< detail::RemoveReferenceHelper< T > > RemoveReference
Definition core.h:71
Type< detail::AddRValueReferenceHelper< T > > AddRValueReference
Definition language.h:411
Conditional< concepts::RValueReference< T >, RemoveReference< T >, T > RemoveRValueReference
Definition language.h:471
Type< detail::AddLValueReferenceHelper< T > > AddLValueReference
Definition language.h:399
T const AddConst
Definition language.h:381
__underlying_type(T) UnderlyingType
Definition language.h:267
Type< detail::MemberPointerClassHelper< RemoveCV< T > > > MemberPointerClass
Definition language.h:195
Type< detail::RemoveAllExtentsHelper< T > > RemoveAllExtents
Definition language.h:137
RemoveConst< RemoveVolatile< T > > RemoveCV
Definition core.h:57
Type< detail::AddPointerHelper< T > > AddPointer
This is a helper template which will convert reference types into their corresponding pointer type,...
Definition language.h:427
Definition method.h:5
std::nullptr_t nullptr_t
Definition nullptr_t.h:12
constexpr auto size
Definition size.h:54
A wrapper for a constexpr value.
Definition core.h:77
Definition language.h:80
Constexpr< concepts::LanguageFunction< T > &&concepts::SameAs< R, LanguageFunctionReturn< T > > > Invoke
Definition language.h:82
Definition core.h:18
Definition language.h:415
Definition language.h:431
Definition language.h:271
Definition language.h:320
Definition language.h:116
Definition language.h:475