2
3
4
5
6
7
8
11#ifndef _GLSL_STRUCT_LAYOUT_TRAITS_CONCEPT_HPP_
12 #define _GLSL_STRUCT_LAYOUT_TRAITS_CONCEPT_HPP_
14 #include <glslstruct/config.hpp>
17_GLSL_STRUCT_ERROR(
"This is only available for c++17 and greater!");
20 #include <glslstruct/utils/ValueType.hpp>
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
64 #pragma region CXX20_CONCEPTS
67 #pragma region HAS_CONTEXT
69
70
71
72
73
74
78 #pragma region GET_ALIGNMENT
80
81
82
83
84
85
86
87
88
89 template<
class T,
class...
Args>
100 #pragma region BEFORE_ADD
101 #pragma region OPTIONAL
104 template<
class T,
class...
Args>
111 template<
class T,
class...
Args>
118 template<
class T,
class...
Args>
125 template<
class T,
class...
Args>
132 template<
class T,
class...
Args>
139 template<
class T,
class...
Args>
146
147
148
149
150
151
152 template<
class T,
class...
Args>
159 #pragma region AFTER_ADD
160 #pragma region OPTIONAL
163 template<
class T,
class...
Args>
173 template<
class T,
class...
Args>
183 template<
class T,
class...
Args>
193 template<
class T,
class...
Args>
203 template<
class T,
class...
Args>
213 template<
class T,
class...
Args>
223
224
225
226
227
228
229 template<
class T,
class...
Args>
247
248
249
250
251
252
253
257
258
259
264
265
266
272
273
274
275
276
280 #pragma region HAS_BEFORE_ADD
306 #pragma region HAS_AFTER_ADD
336 #pragma region CXX17_CONCEPTS
339 #pragma region HAS_CONTEXT
342
343
344
345
346
347
348 template<
class T,
class =
void>
349 struct has_layout_traits_context : std::false_type {};
356 #pragma region GET_ALIGNMENT
359
360
361
362
363
364
365
366
367
368 template<
class T,
class Enable,
class... Args>
369 struct layout_traits_get_alignment : std::false_type {};
371 template<
class T,
class...
Args>
384 #pragma region BEFORE_ADD
385 #pragma region OPTIONAL
387 template<
class T,
class =
void>
388 struct has_layout_traits_opt_before_add : std::false_type {};
393 template<
class T,
class Enable,
class... Args>
394 struct is_layout_traits_opt_before_add_valid : std::false_type {};
396 template<
class T,
class...
Args>
402 template<
class T,
class... Args>
403 struct layout_traits_opt_before_add : std::bool_constant<!has_layout_traits_opt_before_add<T>::value ||
404 is_layout_traits_opt_before_add_valid<T,
void, Args...>::value> {
407 template<
class T,
class =
void>
408 struct has_layout_traits_opt_before_add_scalar : std::false_type {};
413 template<
class T,
class Enable,
class... Args>
414 struct is_layout_traits_opt_before_add_scalar_valid : std::false_type {};
416 template<
class T,
class...
Args>
422 template<
class T,
class... Args>
423 struct layout_traits_opt_before_add_scalar
424 : std::bool_constant<!has_layout_traits_opt_before_add_scalar<T>::value ||
425 is_layout_traits_opt_before_add_scalar_valid<T,
void, Args...>::value> {};
427 template<
class T,
class =
void>
428 struct has_layout_traits_opt_before_add_vec : std::false_type {};
433 template<
class T,
class Enable,
class... Args>
434 struct is_layout_traits_opt_before_add_vec_valid : std::false_type {};
436 template<
class T,
class...
Args>
442 template<
class T,
class... Args>
443 struct layout_traits_opt_before_add_vec
444 : std::bool_constant<!has_layout_traits_opt_before_add_vec<T>::value ||
445 is_layout_traits_opt_before_add_vec_valid<T,
void, Args...>::value> {};
447 template<
class T,
class =
void>
448 struct has_layout_traits_opt_before_add_mat : std::false_type {};
453 template<
class T,
class Enable,
class... Args>
454 struct is_layout_traits_opt_before_add_mat_valid : std::false_type {};
456 template<
class T,
class...
Args>
462 template<
class T,
class... Args>
463 struct layout_traits_opt_before_add_mat
464 : std::bool_constant<!has_layout_traits_opt_before_add_mat<T>::value ||
465 is_layout_traits_opt_before_add_mat_valid<T,
void, Args...>::value> {};
467 template<
class T,
class =
void>
468 struct has_layout_traits_opt_before_add_array : std::false_type {};
473 template<
class T,
class Enable,
class... Args>
474 struct is_layout_traits_opt_before_add_array_valid : std::false_type {};
476 template<
class T,
class...
Args>
482 template<
class T,
class... Args>
483 struct layout_traits_opt_before_add_array
484 : std::bool_constant<!has_layout_traits_opt_before_add_array<T>::value ||
485 is_layout_traits_opt_before_add_array_valid<T,
void, Args...>::value> {};
487 template<
class T,
class =
void>
488 struct has_layout_traits_opt_before_add_struct : std::false_type {};
493 template<
class T,
class Enable,
class... Args>
494 struct is_layout_traits_opt_before_add_struct_valid : std::false_type {};
496 template<
class T,
class...
Args>
502 template<
class T,
class... Args>
503 struct layout_traits_opt_before_add_struct
504 : std::bool_constant<!has_layout_traits_opt_before_add_struct<T>::value ||
505 is_layout_traits_opt_before_add_struct_valid<T,
void, Args...>::value> {};
510
511
512
513
514
515
516 template<
class T,
class... Args>
517 struct layout_traits_before_add
518 : std::bool_constant<
519 layout_traits_opt_before_add<T, Args...>::value && layout_traits_opt_before_add_scalar<T, Args...>::value &&
520 layout_traits_opt_before_add_vec<T, Args...>::value && layout_traits_opt_before_add_mat<T, Args...>::value &&
521 layout_traits_opt_before_add_array<T, Args...>::value && layout_traits_opt_before_add_struct<T, Args...>::value
526 #pragma region AFTER_ADD
527 #pragma region OPTIONAL
529 template<
class T,
class =
void>
530 struct has_layout_traits_opt_after_add : std::false_type {};
535 template<
class T,
class Enable,
class... Args>
536 struct is_layout_traits_opt_after_add_valid : std::false_type {};
538 template<
class T,
class...
Args>
545 template<
class T,
class... Args>
546 struct layout_traits_opt_after_add : std::bool_constant<!has_layout_traits_opt_after_add<T>::value ||
547 is_layout_traits_opt_after_add_valid<T,
void, Args...>::value> {};
549 template<
class T,
class =
void>
550 struct has_layout_traits_opt_after_add_scalar : std::false_type {};
555 template<
class T,
class Enable,
class... Args>
556 struct is_layout_traits_opt_after_add_scalar_valid : std::false_type {};
558 template<
class T,
class...
Args>
565 template<
class T,
class... Args>
566 struct layout_traits_opt_after_add_scalar
567 : std::bool_constant<!has_layout_traits_opt_after_add_scalar<T>::value ||
568 is_layout_traits_opt_after_add_scalar_valid<T,
void, Args...>::value> {};
570 template<
class T,
class =
void>
571 struct has_layout_traits_opt_after_add_vec : std::false_type {};
576 template<
class T,
class Enable,
class... Args>
577 struct is_layout_traits_opt_after_add_vec_valid : std::false_type {};
579 template<
class T,
class...
Args>
586 template<
class T,
class... Args>
587 struct layout_traits_opt_after_add_vec
588 : std::bool_constant<!has_layout_traits_opt_after_add_vec<T>::value ||
589 is_layout_traits_opt_after_add_vec_valid<T,
void, Args...>::value> {};
591 template<
class T,
class =
void>
592 struct has_layout_traits_opt_after_add_mat : std::false_type {};
597 template<
class T,
class Enable,
class... Args>
598 struct is_layout_traits_opt_after_add_mat_valid : std::false_type {};
600 template<
class T,
class...
Args>
607 template<
class T,
class... Args>
608 struct layout_traits_opt_after_add_mat
609 : std::bool_constant<!has_layout_traits_opt_after_add_mat<T>::value ||
610 is_layout_traits_opt_after_add_mat_valid<T,
void, Args...>::value> {};
612 template<
class T,
class =
void>
613 struct has_layout_traits_opt_after_add_array : std::false_type {};
618 template<
class T,
class Enable,
class... Args>
619 struct is_layout_traits_opt_after_add_array_valid : std::false_type {};
621 template<
class T,
class...
Args>
628 template<
class T,
class... Args>
629 struct layout_traits_opt_after_add_array
630 : std::bool_constant<!has_layout_traits_opt_after_add_array<T>::value ||
631 is_layout_traits_opt_after_add_array_valid<T,
void, Args...>::value> {};
633 template<
class T,
class =
void>
634 struct has_layout_traits_opt_after_add_struct : std::false_type {};
639 template<
class T,
class Enable,
class... Args>
640 struct is_layout_traits_opt_after_add_struct_valid : std::false_type {};
642 template<
class T,
class...
Args>
649 template<
class T,
class... Args>
650 struct layout_traits_opt_after_add_struct
651 : std::bool_constant<!has_layout_traits_opt_after_add_struct<T>::value ||
652 is_layout_traits_opt_after_add_struct_valid<T,
void, Args...>::value> {};
657
658
659
660
661
662
663 template<
class T,
class... Args>
664 struct layout_traits_after_add
665 : std::bool_constant<
666 layout_traits_opt_after_add<T, Args...>::value && layout_traits_opt_after_add_scalar<T, Args...>::value &&
667 layout_traits_opt_after_add_vec<T, Args...>::value && layout_traits_opt_after_add_mat<T, Args...>::value &&
668 layout_traits_opt_after_add_array<T, Args...>::value && layout_traits_opt_after_add_struct<T, Args...>::value
674 struct layout_traits_with_context
675 : std::bool_constant<has_layout_traits_context<T>::value &&
676 layout_traits_get_alignment<T,
void,
typename T::context_type>::value &&
677 layout_traits_before_add<T,
typename T::context_type>::value &&
678 layout_traits_after_add<T,
typename T::context_type>::value> {};
681 struct layout_traits_without_context
682 : std::bool_constant<!has_layout_traits_context<T>::value && layout_traits_get_alignment<T,
void>::value &&
683 layout_traits_before_add<T>::value && layout_traits_after_add<T>::value> {};
687
688
689
690
691
692
693
695 struct is_layout_traits
696 : std::bool_constant<utils::layout_traits_with_context<T>::value || utils::layout_traits_without_context<T>::value> {};
699
700
701
707
708
709
710
711
716 #pragma region HAS_BEFORE_ADD
742 #pragma region HAS_AFTER_ADD
#define _GLSL_STRUCT_HAS_CXX20
check if compiler has c++ version greater or equal to c++20 and if user enabled c++20 features using ...
Definition config.hpp:142
#define _GLSL_STRUCT_HAS_CXX17
check if compiler has c++ version greater or equal to c++17
Definition config.hpp:130
#define _GLSL_STRUCT_CONSTEXPR17
constexpr for c++17 and higher
Definition config.hpp:196
Main namespace of glslstruct library.
Definition scalar_layout_traits.hpp:23