vari
Loading...
Searching...
No Matches
val_union.h
1
23
24#pragma once
25
26#include "vari/bits/typelist.h"
27#include "vari/bits/util.h"
28
29#include <concepts>
30
31namespace vari
32{
33
34template < typename TL >
35union _val_union
36{
37 static_assert(
38 !std::same_as< TL, TL >,
39 "val_union<T> created with unacceptable type - only typelist is allowed" );
40};
41
42template < typename... Ts >
43union _val_union< typelist< Ts... > >
44{
45 static constexpr index_type size = sizeof...( Ts );
46
47 _val_union() noexcept {};
48 ~_val_union(){};
49
50 using s1 = split< typelist< Ts... > >;
51 using s2 = split< typename s1::lh >;
52 using s3 = split< typename s1::rh >;
53
54 using b0 = _val_union< typename s2::lh >;
55 using b1 = _val_union< typename s2::rh >;
56 using b2 = _val_union< typename s3::lh >;
57 using b3 = _val_union< typename s3::rh >;
58
59 b0 box0;
60 b1 box1;
61 b2 box2;
62 b3 box3;
63
64 template < index_type i >
65 constexpr static auto& get( auto& s )
66 {
67 if constexpr ( i < b0::size )
68 return b0::template get< i >( s.box0 );
69 else if constexpr ( i < b0::size + b1::size )
70 return b1::template get< i - b0::size >( s.box1 );
71 else if constexpr ( i < b0::size + b1::size + b2::size )
72 return b2::template get< i - b0::size - b1::size >( s.box2 );
73 else if constexpr ( i < b0::size + b1::size + b2::size + b3::size )
74 return b3::template get< i - b0::size - b1::size - b2::size >( s.box3 );
75 }
76};
77
78template <>
79union _val_union< typelist<> >
80{
81 static constexpr index_type size = 0;
82
83 _val_union() noexcept
84 {
85 }
86 ~_val_union() noexcept
87 {
88 }
89
90 template < index_type i >
91 constexpr static auto& get( auto& s )
92 {
93 }
94};
95
96// VARI VAL UNION GEN START
97
98
99template < typename T0 >
100union _val_union< typelist< T0 > >
101{
102 static constexpr index_type size = 1;
103
104 _val_union() noexcept
105 {
106 }
107 ~_val_union() noexcept
108 {
109 }
110
111 T0 item0;
112
113
114 template < index_type i >
115 constexpr static auto& get( auto& s )
116 {
117 if constexpr ( i == 0 )
118 return s.item0;
119 }
120};
121
122
123template < typename T0, typename T1 >
124union _val_union< typelist< T0, T1 > >
125{
126 static constexpr index_type size = 2;
127
128 _val_union() noexcept
129 {
130 }
131 ~_val_union() noexcept
132 {
133 }
134
135 T0 item0;
136 T1 item1;
137
138
139 template < index_type i >
140 constexpr static auto& get( auto& s )
141 {
142 if constexpr ( i == 0 )
143 return s.item0;
144 if constexpr ( i == 1 )
145 return s.item1;
146 }
147};
148
149
150template < typename T0, typename T1, typename T2 >
151union _val_union< typelist< T0, T1, T2 > >
152{
153 static constexpr index_type size = 3;
154
155 _val_union() noexcept
156 {
157 }
158 ~_val_union() noexcept
159 {
160 }
161
162 T0 item0;
163 T1 item1;
164 T2 item2;
165
166
167 template < index_type i >
168 constexpr static auto& get( auto& s )
169 {
170 if constexpr ( i == 0 )
171 return s.item0;
172 if constexpr ( i == 1 )
173 return s.item1;
174 if constexpr ( i == 2 )
175 return s.item2;
176 }
177};
178
179
180template < typename T0, typename T1, typename T2, typename T3 >
181union _val_union< typelist< T0, T1, T2, T3 > >
182{
183 static constexpr index_type size = 4;
184
185 _val_union() noexcept
186 {
187 }
188 ~_val_union() noexcept
189 {
190 }
191
192 T0 item0;
193 T1 item1;
194 T2 item2;
195 T3 item3;
196
197
198 template < index_type i >
199 constexpr static auto& get( auto& s )
200 {
201 if constexpr ( i == 0 )
202 return s.item0;
203 if constexpr ( i == 1 )
204 return s.item1;
205 if constexpr ( i == 2 )
206 return s.item2;
207 if constexpr ( i == 3 )
208 return s.item3;
209 }
210};
211
212
213template < typename T0, typename T1, typename T2, typename T3, typename T4 >
214union _val_union< typelist< T0, T1, T2, T3, T4 > >
215{
216 static constexpr index_type size = 5;
217
218 _val_union() noexcept
219 {
220 }
221 ~_val_union() noexcept
222 {
223 }
224
225 T0 item0;
226 T1 item1;
227 T2 item2;
228 T3 item3;
229 T4 item4;
230
231
232 template < index_type i >
233 constexpr static auto& get( auto& s )
234 {
235 if constexpr ( i == 0 )
236 return s.item0;
237 if constexpr ( i == 1 )
238 return s.item1;
239 if constexpr ( i == 2 )
240 return s.item2;
241 if constexpr ( i == 3 )
242 return s.item3;
243 if constexpr ( i == 4 )
244 return s.item4;
245 }
246};
247
248
249template < typename T0, typename T1, typename T2, typename T3, typename T4, typename T5 >
250union _val_union< typelist< T0, T1, T2, T3, T4, T5 > >
251{
252 static constexpr index_type size = 6;
253
254 _val_union() noexcept
255 {
256 }
257 ~_val_union() noexcept
258 {
259 }
260
261 T0 item0;
262 T1 item1;
263 T2 item2;
264 T3 item3;
265 T4 item4;
266 T5 item5;
267
268
269 template < index_type i >
270 constexpr static auto& get( auto& s )
271 {
272 if constexpr ( i == 0 )
273 return s.item0;
274 if constexpr ( i == 1 )
275 return s.item1;
276 if constexpr ( i == 2 )
277 return s.item2;
278 if constexpr ( i == 3 )
279 return s.item3;
280 if constexpr ( i == 4 )
281 return s.item4;
282 if constexpr ( i == 5 )
283 return s.item5;
284 }
285};
286
287
288template <
289 typename T0,
290 typename T1,
291 typename T2,
292 typename T3,
293 typename T4,
294 typename T5,
295 typename T6 >
296union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6 > >
297{
298 static constexpr index_type size = 7;
299
300 _val_union() noexcept
301 {
302 }
303 ~_val_union() noexcept
304 {
305 }
306
307 T0 item0;
308 T1 item1;
309 T2 item2;
310 T3 item3;
311 T4 item4;
312 T5 item5;
313 T6 item6;
314
315
316 template < index_type i >
317 constexpr static auto& get( auto& s )
318 {
319 if constexpr ( i == 0 )
320 return s.item0;
321 if constexpr ( i == 1 )
322 return s.item1;
323 if constexpr ( i == 2 )
324 return s.item2;
325 if constexpr ( i == 3 )
326 return s.item3;
327 if constexpr ( i == 4 )
328 return s.item4;
329 if constexpr ( i == 5 )
330 return s.item5;
331 if constexpr ( i == 6 )
332 return s.item6;
333 }
334};
335
336
337template <
338 typename T0,
339 typename T1,
340 typename T2,
341 typename T3,
342 typename T4,
343 typename T5,
344 typename T6,
345 typename T7 >
346union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7 > >
347{
348 static constexpr index_type size = 8;
349
350 _val_union() noexcept
351 {
352 }
353 ~_val_union() noexcept
354 {
355 }
356
357 T0 item0;
358 T1 item1;
359 T2 item2;
360 T3 item3;
361 T4 item4;
362 T5 item5;
363 T6 item6;
364 T7 item7;
365
366
367 template < index_type i >
368 constexpr static auto& get( auto& s )
369 {
370 if constexpr ( i == 0 )
371 return s.item0;
372 if constexpr ( i == 1 )
373 return s.item1;
374 if constexpr ( i == 2 )
375 return s.item2;
376 if constexpr ( i == 3 )
377 return s.item3;
378 if constexpr ( i == 4 )
379 return s.item4;
380 if constexpr ( i == 5 )
381 return s.item5;
382 if constexpr ( i == 6 )
383 return s.item6;
384 if constexpr ( i == 7 )
385 return s.item7;
386 }
387};
388
389
390template <
391 typename T0,
392 typename T1,
393 typename T2,
394 typename T3,
395 typename T4,
396 typename T5,
397 typename T6,
398 typename T7,
399 typename T8 >
400union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8 > >
401{
402 static constexpr index_type size = 9;
403
404 _val_union() noexcept
405 {
406 }
407 ~_val_union() noexcept
408 {
409 }
410
411 T0 item0;
412 T1 item1;
413 T2 item2;
414 T3 item3;
415 T4 item4;
416 T5 item5;
417 T6 item6;
418 T7 item7;
419 T8 item8;
420
421
422 template < index_type i >
423 constexpr static auto& get( auto& s )
424 {
425 if constexpr ( i == 0 )
426 return s.item0;
427 if constexpr ( i == 1 )
428 return s.item1;
429 if constexpr ( i == 2 )
430 return s.item2;
431 if constexpr ( i == 3 )
432 return s.item3;
433 if constexpr ( i == 4 )
434 return s.item4;
435 if constexpr ( i == 5 )
436 return s.item5;
437 if constexpr ( i == 6 )
438 return s.item6;
439 if constexpr ( i == 7 )
440 return s.item7;
441 if constexpr ( i == 8 )
442 return s.item8;
443 }
444};
445
446
447template <
448 typename T0,
449 typename T1,
450 typename T2,
451 typename T3,
452 typename T4,
453 typename T5,
454 typename T6,
455 typename T7,
456 typename T8,
457 typename T9 >
458union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 > >
459{
460 static constexpr index_type size = 10;
461
462 _val_union() noexcept
463 {
464 }
465 ~_val_union() noexcept
466 {
467 }
468
469 T0 item0;
470 T1 item1;
471 T2 item2;
472 T3 item3;
473 T4 item4;
474 T5 item5;
475 T6 item6;
476 T7 item7;
477 T8 item8;
478 T9 item9;
479
480
481 template < index_type i >
482 constexpr static auto& get( auto& s )
483 {
484 if constexpr ( i == 0 )
485 return s.item0;
486 if constexpr ( i == 1 )
487 return s.item1;
488 if constexpr ( i == 2 )
489 return s.item2;
490 if constexpr ( i == 3 )
491 return s.item3;
492 if constexpr ( i == 4 )
493 return s.item4;
494 if constexpr ( i == 5 )
495 return s.item5;
496 if constexpr ( i == 6 )
497 return s.item6;
498 if constexpr ( i == 7 )
499 return s.item7;
500 if constexpr ( i == 8 )
501 return s.item8;
502 if constexpr ( i == 9 )
503 return s.item9;
504 }
505};
506
507
508template <
509 typename T0,
510 typename T1,
511 typename T2,
512 typename T3,
513 typename T4,
514 typename T5,
515 typename T6,
516 typename T7,
517 typename T8,
518 typename T9,
519 typename T10 >
520union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 > >
521{
522 static constexpr index_type size = 11;
523
524 _val_union() noexcept
525 {
526 }
527 ~_val_union() noexcept
528 {
529 }
530
531 T0 item0;
532 T1 item1;
533 T2 item2;
534 T3 item3;
535 T4 item4;
536 T5 item5;
537 T6 item6;
538 T7 item7;
539 T8 item8;
540 T9 item9;
541 T10 item10;
542
543
544 template < index_type i >
545 constexpr static auto& get( auto& s )
546 {
547 if constexpr ( i == 0 )
548 return s.item0;
549 if constexpr ( i == 1 )
550 return s.item1;
551 if constexpr ( i == 2 )
552 return s.item2;
553 if constexpr ( i == 3 )
554 return s.item3;
555 if constexpr ( i == 4 )
556 return s.item4;
557 if constexpr ( i == 5 )
558 return s.item5;
559 if constexpr ( i == 6 )
560 return s.item6;
561 if constexpr ( i == 7 )
562 return s.item7;
563 if constexpr ( i == 8 )
564 return s.item8;
565 if constexpr ( i == 9 )
566 return s.item9;
567 if constexpr ( i == 10 )
568 return s.item10;
569 }
570};
571
572
573template <
574 typename T0,
575 typename T1,
576 typename T2,
577 typename T3,
578 typename T4,
579 typename T5,
580 typename T6,
581 typename T7,
582 typename T8,
583 typename T9,
584 typename T10,
585 typename T11 >
586union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 > >
587{
588 static constexpr index_type size = 12;
589
590 _val_union() noexcept
591 {
592 }
593 ~_val_union() noexcept
594 {
595 }
596
597 T0 item0;
598 T1 item1;
599 T2 item2;
600 T3 item3;
601 T4 item4;
602 T5 item5;
603 T6 item6;
604 T7 item7;
605 T8 item8;
606 T9 item9;
607 T10 item10;
608 T11 item11;
609
610
611 template < index_type i >
612 constexpr static auto& get( auto& s )
613 {
614 if constexpr ( i == 0 )
615 return s.item0;
616 if constexpr ( i == 1 )
617 return s.item1;
618 if constexpr ( i == 2 )
619 return s.item2;
620 if constexpr ( i == 3 )
621 return s.item3;
622 if constexpr ( i == 4 )
623 return s.item4;
624 if constexpr ( i == 5 )
625 return s.item5;
626 if constexpr ( i == 6 )
627 return s.item6;
628 if constexpr ( i == 7 )
629 return s.item7;
630 if constexpr ( i == 8 )
631 return s.item8;
632 if constexpr ( i == 9 )
633 return s.item9;
634 if constexpr ( i == 10 )
635 return s.item10;
636 if constexpr ( i == 11 )
637 return s.item11;
638 }
639};
640
641
642template <
643 typename T0,
644 typename T1,
645 typename T2,
646 typename T3,
647 typename T4,
648 typename T5,
649 typename T6,
650 typename T7,
651 typename T8,
652 typename T9,
653 typename T10,
654 typename T11,
655 typename T12 >
656union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 > >
657{
658 static constexpr index_type size = 13;
659
660 _val_union() noexcept
661 {
662 }
663 ~_val_union() noexcept
664 {
665 }
666
667 T0 item0;
668 T1 item1;
669 T2 item2;
670 T3 item3;
671 T4 item4;
672 T5 item5;
673 T6 item6;
674 T7 item7;
675 T8 item8;
676 T9 item9;
677 T10 item10;
678 T11 item11;
679 T12 item12;
680
681
682 template < index_type i >
683 constexpr static auto& get( auto& s )
684 {
685 if constexpr ( i == 0 )
686 return s.item0;
687 if constexpr ( i == 1 )
688 return s.item1;
689 if constexpr ( i == 2 )
690 return s.item2;
691 if constexpr ( i == 3 )
692 return s.item3;
693 if constexpr ( i == 4 )
694 return s.item4;
695 if constexpr ( i == 5 )
696 return s.item5;
697 if constexpr ( i == 6 )
698 return s.item6;
699 if constexpr ( i == 7 )
700 return s.item7;
701 if constexpr ( i == 8 )
702 return s.item8;
703 if constexpr ( i == 9 )
704 return s.item9;
705 if constexpr ( i == 10 )
706 return s.item10;
707 if constexpr ( i == 11 )
708 return s.item11;
709 if constexpr ( i == 12 )
710 return s.item12;
711 }
712};
713
714
715template <
716 typename T0,
717 typename T1,
718 typename T2,
719 typename T3,
720 typename T4,
721 typename T5,
722 typename T6,
723 typename T7,
724 typename T8,
725 typename T9,
726 typename T10,
727 typename T11,
728 typename T12,
729 typename T13 >
730union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 > >
731{
732 static constexpr index_type size = 14;
733
734 _val_union() noexcept
735 {
736 }
737 ~_val_union() noexcept
738 {
739 }
740
741 T0 item0;
742 T1 item1;
743 T2 item2;
744 T3 item3;
745 T4 item4;
746 T5 item5;
747 T6 item6;
748 T7 item7;
749 T8 item8;
750 T9 item9;
751 T10 item10;
752 T11 item11;
753 T12 item12;
754 T13 item13;
755
756
757 template < index_type i >
758 constexpr static auto& get( auto& s )
759 {
760 if constexpr ( i == 0 )
761 return s.item0;
762 if constexpr ( i == 1 )
763 return s.item1;
764 if constexpr ( i == 2 )
765 return s.item2;
766 if constexpr ( i == 3 )
767 return s.item3;
768 if constexpr ( i == 4 )
769 return s.item4;
770 if constexpr ( i == 5 )
771 return s.item5;
772 if constexpr ( i == 6 )
773 return s.item6;
774 if constexpr ( i == 7 )
775 return s.item7;
776 if constexpr ( i == 8 )
777 return s.item8;
778 if constexpr ( i == 9 )
779 return s.item9;
780 if constexpr ( i == 10 )
781 return s.item10;
782 if constexpr ( i == 11 )
783 return s.item11;
784 if constexpr ( i == 12 )
785 return s.item12;
786 if constexpr ( i == 13 )
787 return s.item13;
788 }
789};
790
791
792template <
793 typename T0,
794 typename T1,
795 typename T2,
796 typename T3,
797 typename T4,
798 typename T5,
799 typename T6,
800 typename T7,
801 typename T8,
802 typename T9,
803 typename T10,
804 typename T11,
805 typename T12,
806 typename T13,
807 typename T14 >
808union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 > >
809{
810 static constexpr index_type size = 15;
811
812 _val_union() noexcept
813 {
814 }
815 ~_val_union() noexcept
816 {
817 }
818
819 T0 item0;
820 T1 item1;
821 T2 item2;
822 T3 item3;
823 T4 item4;
824 T5 item5;
825 T6 item6;
826 T7 item7;
827 T8 item8;
828 T9 item9;
829 T10 item10;
830 T11 item11;
831 T12 item12;
832 T13 item13;
833 T14 item14;
834
835
836 template < index_type i >
837 constexpr static auto& get( auto& s )
838 {
839 if constexpr ( i == 0 )
840 return s.item0;
841 if constexpr ( i == 1 )
842 return s.item1;
843 if constexpr ( i == 2 )
844 return s.item2;
845 if constexpr ( i == 3 )
846 return s.item3;
847 if constexpr ( i == 4 )
848 return s.item4;
849 if constexpr ( i == 5 )
850 return s.item5;
851 if constexpr ( i == 6 )
852 return s.item6;
853 if constexpr ( i == 7 )
854 return s.item7;
855 if constexpr ( i == 8 )
856 return s.item8;
857 if constexpr ( i == 9 )
858 return s.item9;
859 if constexpr ( i == 10 )
860 return s.item10;
861 if constexpr ( i == 11 )
862 return s.item11;
863 if constexpr ( i == 12 )
864 return s.item12;
865 if constexpr ( i == 13 )
866 return s.item13;
867 if constexpr ( i == 14 )
868 return s.item14;
869 }
870};
871
872
873template <
874 typename T0,
875 typename T1,
876 typename T2,
877 typename T3,
878 typename T4,
879 typename T5,
880 typename T6,
881 typename T7,
882 typename T8,
883 typename T9,
884 typename T10,
885 typename T11,
886 typename T12,
887 typename T13,
888 typename T14,
889 typename T15 >
890union _val_union< typelist< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 > >
891{
892 static constexpr index_type size = 16;
893
894 _val_union() noexcept
895 {
896 }
897 ~_val_union() noexcept
898 {
899 }
900
901 T0 item0;
902 T1 item1;
903 T2 item2;
904 T3 item3;
905 T4 item4;
906 T5 item5;
907 T6 item6;
908 T7 item7;
909 T8 item8;
910 T9 item9;
911 T10 item10;
912 T11 item11;
913 T12 item12;
914 T13 item13;
915 T14 item14;
916 T15 item15;
917
918
919 template < index_type i >
920 constexpr static auto& get( auto& s )
921 {
922 if constexpr ( i == 0 )
923 return s.item0;
924 if constexpr ( i == 1 )
925 return s.item1;
926 if constexpr ( i == 2 )
927 return s.item2;
928 if constexpr ( i == 3 )
929 return s.item3;
930 if constexpr ( i == 4 )
931 return s.item4;
932 if constexpr ( i == 5 )
933 return s.item5;
934 if constexpr ( i == 6 )
935 return s.item6;
936 if constexpr ( i == 7 )
937 return s.item7;
938 if constexpr ( i == 8 )
939 return s.item8;
940 if constexpr ( i == 9 )
941 return s.item9;
942 if constexpr ( i == 10 )
943 return s.item10;
944 if constexpr ( i == 11 )
945 return s.item11;
946 if constexpr ( i == 12 )
947 return s.item12;
948 if constexpr ( i == 13 )
949 return s.item13;
950 if constexpr ( i == 14 )
951 return s.item14;
952 if constexpr ( i == 15 )
953 return s.item15;
954 }
955};
956
957// VARI VAL UNION GEN END
958
959
960} // namespace vari
MIT License.
Definition: dispatch.h:32