nlib
ParamTypeTypes.h
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_TESTING_PARAMTYPETYPES_H_
4 #define INCLUDE_NN_NLIB_TESTING_PARAMTYPETYPES_H_
5 
6 NLIB_NAMESPACE_BEGIN
7 namespace testing {
8 
9 #ifdef NLIB_CXX11_VARIADIC_TEMPLATES
10 struct Tp0 {};
11 template <class HEAD, class... TAIL>
12 struct Types {
13  typedef HEAD Head;
14  typedef Types<TAIL...> Tail;
15  typedef Types<HEAD, TAIL...> type;
16 };
17 template <class HEAD>
18 struct Types<HEAD> {
19  typedef HEAD Head;
20  typedef Tp0 Tail;
21  typedef Types<HEAD> type;
22 };
23 template <>
24 struct Types<Tp0> {
25  typedef Types<Tp0> type;
26 };
27 #else
28 struct None {};
29 struct Tp0 {};
30 template <class T1>
31 struct Tp1 {
32  typedef T1 Head;
33  typedef Tp0 Tail;
34 };
35 template <class T1, class T2>
36 struct Tp2 {
37  typedef T1 Head;
38  typedef Tp1<T2> Tail;
39 };
40 template <class T1, class T2, class T3>
41 struct Tp3 {
42  typedef T1 Head;
43  typedef Tp2<T2, T3> Tail;
44 };
45 template <class T1, class T2, class T3, class T4>
46 struct Tp4 {
47  typedef T1 Head;
48  typedef Tp3<T2, T3, T4> Tail;
49 };
50 template <class T1, class T2, class T3, class T4, class T5>
51 struct Tp5 {
52  typedef T1 Head;
53  typedef Tp4<T2, T3, T4, T5> Tail;
54 };
55 template <class T1, class T2, class T3, class T4, class T5, class T6>
56 struct Tp6 {
57  typedef T1 Head;
58  typedef Tp5<T2, T3, T4, T5, T6> Tail;
59 };
60 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>
61 struct Tp7 {
62  typedef T1 Head;
63  typedef Tp6<T2, T3, T4, T5, T6, T7> Tail;
64 };
65 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
66 struct Tp8 {
67  typedef T1 Head;
68  typedef Tp7<T2, T3, T4, T5, T6, T7, T8> Tail;
69 };
70 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
71 struct Tp9 {
72  typedef T1 Head;
73  typedef Tp8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
74 };
75 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
76  class T10> // NOLINT
77 struct Tp10 {
78  typedef T1 Head;
79  typedef Tp9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
80 };
81 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
82  class T10,
83  class T11> // NOLINT
84 struct Tp11 {
85  typedef T1 Head;
86  typedef Tp10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
87 };
88 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
89  class T10, class T11, class T12> // NOLINT
90 struct Tp12 {
91  typedef T1 Head;
92  typedef Tp11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
93 };
94 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
95  class T10, class T11, class T12, class T13> // NOLINT
96 struct Tp13 {
97  typedef T1 Head;
98  typedef Tp12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
99 };
100 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
101  class T10, class T11, class T12, class T13, class T14> // NOLINT
102 struct Tp14 {
103  typedef T1 Head;
104  typedef Tp13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
105 };
106 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
107  class T10, class T11, class T12, class T13, class T14, class T15> // NOLINT
108 struct Tp15 {
109  typedef T1 Head;
110  typedef Tp14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Tail;
111 };
112 
113 template <class T1 = None, class T2 = None, class T3 = None, class T4 = None, class T5 = None,
114  class T6 = None, class T7 = None, class T8 = None, class T9 = None, class T10 = None,
115  class T11 = None, class T12 = None, class T13 = None, class T14 = None, class T15 = None>
116 struct Types {
117  typedef Tp15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> type;
118 };
119 
120 template <>
121 struct Types<None, None, None, None, None, None, None, None, None, None, None, None, None, None,
122  None> { // NOLINT
123  typedef Tp0 type;
124 };
125 template <class T1>
126 struct Types<T1, None, None, None, None, None, None, None, None, None, None, None, None, None,
127  None> { // NOLINT
128  typedef Tp1<T1> type;
129 };
130 template <class T1, class T2>
131 struct Types<T1, T2, None, None, None, None, None, None, None, None, None, None, None, None,
132  None> { // NOLINT
133  typedef Tp2<T1, T2> type;
134 };
135 template <class T1, class T2, class T3>
136 struct Types<T1, T2, T3, None, None, None, None, None, None, None, None, None, None, None, None> {
137  typedef Tp3<T1, T2, T3> type;
138 };
139 template <class T1, class T2, class T3, class T4>
140 struct Types<T1, T2, T3, T4, None, None, None, None, None, None, None, None, None, None, None> {
141  typedef Tp4<T1, T2, T3, T4> type;
142 };
143 template <class T1, class T2, class T3, class T4, class T5>
144 struct Types<T1, T2, T3, T4, T5, None, None, None, None, None, None, None, None, None, None> {
145  typedef Tp5<T1, T2, T3, T4, T5> type;
146 };
147 template <class T1, class T2, class T3, class T4, class T5, class T6>
148 struct Types<T1, T2, T3, T4, T5, T6, None, None, None, None, None, None, None, None, None> {
149  typedef Tp6<T1, T2, T3, T4, T5, T6> type;
150 };
151 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>
152 struct Types<T1, T2, T3, T4, T5, T6, T7, None, None, None, None, None, None, None, None> {
153  typedef Tp7<T1, T2, T3, T4, T5, T6, T7> type;
154 };
155 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
156 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, None, None, None, None, None, None, None> {
157  typedef Tp8<T1, T2, T3, T4, T5, T6, T7, T8> type;
158 };
159 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9>
160 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, None, None, None, None, None, None> {
161  typedef Tp9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
162 };
163 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
164  class T10>
165 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, None, None, None, None, None> {
166  typedef Tp10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
167 };
168 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
169  class T10, class T11>
170 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, None, None, None, None> {
171  typedef Tp11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
172 };
173 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
174  class T10, class T11, class T12>
175 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, None, None, None> {
176  typedef Tp12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
177 };
178 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
179  class T10, class T11, class T12, class T13>
180 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, None, None> {
181  typedef Tp13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> type;
182 };
183 template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9,
184  class T10, class T11, class T12, class T13, class T14>
185 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, None> {
186  typedef Tp14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> type;
187 };
188 #endif
189 
190 } // namespace testing
191 NLIB_NAMESPACE_END
192 
193 #endif // INCLUDE_NN_NLIB_TESTING_PARAMTYPETYPES_H_