Loading [MathJax]/extensions/TeX/AMSsymbols.js

DUNE-ACFEM (unstable)

typepackelement.hh
1#ifndef __DUNE_ACFEM_MPL_TYPEPACKELEMENT_HH__
2#define __DUNE_ACFEM_MPL_TYPEPACKELEMENT_HH__
3
4#include <cstddef>
5#include "../common/compiler.hh"
6
7namespace Dune {
8
9 namespace ACFem {
10
31#if DUNE_ACFEM_IS_CLANG(5,99)
32 static_assert(__has_builtin(__type_pack_element), "");
33
34 template<std::size_t N, class... T>
35 using TypePackElement = __type_pack_element<N, T...>;
36#else
37 namespace {
38 template<std::size_t N, class... T>
39 struct TypePackElementHelper
40 {};
41
42 template<std::size_t N, class T0, class... TRest>
43 struct TypePackElementHelper<N, T0, TRest...>
44 : TypePackElementHelper<N-1, TRest...>
45 {};
46
47 template<class T0, class... TRest>
48 struct TypePackElementHelper<0, T0, TRest...>
49 {
50 using Type = T0;
51 };
52#if 0
53 template<class T0, class T1, class... TRest>
54 struct TypePackElementHelper<1, T0, T1, TRest...>
55 {
56 using Type = T1;
57 };
58
59 template<class T0, class T1, class T2, class... TRest>
60 struct TypePackElementHelper<2, T0, T1, T2, TRest...>
61 {
62 using Type = T2;
63 };
64
65 template<class T0, class T1, class T2, class T3, class... TRest>
66 struct TypePackElementHelper<3, T0, T1, T2, T3, TRest...>
67 {
68 using Type = T3;
69 };
70
71 template<class T0, class T1, class T2, class T3, class T4, class... TRest>
72 struct TypePackElementHelper<4, T0, T1, T2, T3, T4, TRest...>
73 {
74 using Type = T4;
75 };
76
77 template<class T0, class T1, class T2, class T3, class T4, class T5, class... TRest>
78 struct TypePackElementHelper<5, T0, T1, T2, T3, T4, T5, TRest...>
79 {
80 using Type = T5;
81 };
82
83 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class... TRest>
84 struct TypePackElementHelper<6, T0, T1, T2, T3, T4, T5, T6, TRest...>
85 {
86 using Type = T6;
87 };
88
89 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class... TRest>
90 struct TypePackElementHelper<7, T0, T1, T2, T3, T4, T5, T6, T7, TRest...>
91 {
92 using Type = T7;
93 };
94
95 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class... TRest>
96 struct TypePackElementHelper<8, T0, T1, T2, T3, T4, T5, T6, T7, T8, TRest...>
97 {
98 using Type = T8;
99 };
100
101 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class... TRest>
102 struct TypePackElementHelper<9, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, TRest...>
103 {
104 using Type = T9;
105 };
106#endif
107 }
108
109 template<std::size_t N, class... T>
110 using TypePackElement = typename TypePackElementHelper<N, T...>::Type;
111#endif
112
114
116
117 } // ACFem::
118
119} // Dune::
120
121#endif // __DUNE_ACFEM_MPL_TYPEPACKELEMENT_HH__
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 12, 23:28, 2025)