Import of Google Test 1.2.1, with the non-essential bits removed.
[oota-llvm.git] / utils / unittest / googletest / include / gtest / internal / gtest-type-util.h
1 // This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
2
3 // Copyright 2008 Google Inc.
4 // All Rights Reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are
8 // met:
9 //
10 //     * Redistributions of source code must retain the above copyright
11 // notice, this list of conditions and the following disclaimer.
12 //     * Redistributions in binary form must reproduce the above
13 // copyright notice, this list of conditions and the following disclaimer
14 // in the documentation and/or other materials provided with the
15 // distribution.
16 //     * Neither the name of Google Inc. nor the names of its
17 // contributors may be used to endorse or promote products derived from
18 // this software without specific prior written permission.
19 //
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 //
32 // Author: wan@google.com (Zhanyong Wan)
33
34 // Type utilities needed for implementing typed and type-parameterized
35 // tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
36 //
37 // Currently we support at most 50 types in a list, and at most 50
38 // type-parameterized tests in one type-parameterized test case.
39 // Please contact googletestframework@googlegroups.com if you need
40 // more.
41
42 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
43 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
44
45 #include <gtest/internal/gtest-port.h>
46 #include <gtest/internal/gtest-string.h>
47
48 #if defined(GTEST_HAS_TYPED_TEST) || defined(GTEST_HAS_TYPED_TEST_P)
49
50 #ifdef __GNUC__
51 #include <cxxabi.h>
52 #endif  // __GNUC__
53
54 #include <typeinfo>
55
56 namespace testing {
57 namespace internal {
58
59 // AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
60 // type.  This can be used as a compile-time assertion to ensure that
61 // two types are equal.
62
63 template <typename T1, typename T2>
64 struct AssertTypeEq;
65
66 template <typename T>
67 struct AssertTypeEq<T, T> {
68   typedef bool type;
69 };
70
71 // GetTypeName<T>() returns a human-readable name of type T.
72 template <typename T>
73 String GetTypeName() {
74 #if GTEST_HAS_RTTI
75
76   const char* const name = typeid(T).name();
77 #ifdef __GNUC__
78   int status = 0;
79   // gcc's implementation of typeid(T).name() mangles the type name,
80   // so we have to demangle it.
81   char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status);
82   const String name_str(status == 0 ? readable_name : name);
83   free(readable_name);
84   return name_str;
85 #else
86   return name;
87 #endif  // __GNUC__
88
89 #else
90   return "<type>";
91 #endif  // GTEST_HAS_RTTI
92 }
93
94 // A unique type used as the default value for the arguments of class
95 // template Types.  This allows us to simulate variadic templates
96 // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
97 // support directly.
98 struct None {};
99
100 // The following family of struct and struct templates are used to
101 // represent type lists.  In particular, TypesN<T1, T2, ..., TN>
102 // represents a type list with N types (T1, T2, ..., and TN) in it.
103 // Except for Types0, every struct in the family has two member types:
104 // Head for the first type in the list, and Tail for the rest of the
105 // list.
106
107 // The empty type list.
108 struct Types0 {};
109
110 // Type lists of length 1, 2, 3, and so on.
111
112 template <typename T1>
113 struct Types1 {
114   typedef T1 Head;
115   typedef Types0 Tail;
116 };
117 template <typename T1, typename T2>
118 struct Types2 {
119   typedef T1 Head;
120   typedef Types1<T2> Tail;
121 };
122
123 template <typename T1, typename T2, typename T3>
124 struct Types3 {
125   typedef T1 Head;
126   typedef Types2<T2, T3> Tail;
127 };
128
129 template <typename T1, typename T2, typename T3, typename T4>
130 struct Types4 {
131   typedef T1 Head;
132   typedef Types3<T2, T3, T4> Tail;
133 };
134
135 template <typename T1, typename T2, typename T3, typename T4, typename T5>
136 struct Types5 {
137   typedef T1 Head;
138   typedef Types4<T2, T3, T4, T5> Tail;
139 };
140
141 template <typename T1, typename T2, typename T3, typename T4, typename T5,
142     typename T6>
143 struct Types6 {
144   typedef T1 Head;
145   typedef Types5<T2, T3, T4, T5, T6> Tail;
146 };
147
148 template <typename T1, typename T2, typename T3, typename T4, typename T5,
149     typename T6, typename T7>
150 struct Types7 {
151   typedef T1 Head;
152   typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
153 };
154
155 template <typename T1, typename T2, typename T3, typename T4, typename T5,
156     typename T6, typename T7, typename T8>
157 struct Types8 {
158   typedef T1 Head;
159   typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
160 };
161
162 template <typename T1, typename T2, typename T3, typename T4, typename T5,
163     typename T6, typename T7, typename T8, typename T9>
164 struct Types9 {
165   typedef T1 Head;
166   typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
167 };
168
169 template <typename T1, typename T2, typename T3, typename T4, typename T5,
170     typename T6, typename T7, typename T8, typename T9, typename T10>
171 struct Types10 {
172   typedef T1 Head;
173   typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
174 };
175
176 template <typename T1, typename T2, typename T3, typename T4, typename T5,
177     typename T6, typename T7, typename T8, typename T9, typename T10,
178     typename T11>
179 struct Types11 {
180   typedef T1 Head;
181   typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
182 };
183
184 template <typename T1, typename T2, typename T3, typename T4, typename T5,
185     typename T6, typename T7, typename T8, typename T9, typename T10,
186     typename T11, typename T12>
187 struct Types12 {
188   typedef T1 Head;
189   typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
190 };
191
192 template <typename T1, typename T2, typename T3, typename T4, typename T5,
193     typename T6, typename T7, typename T8, typename T9, typename T10,
194     typename T11, typename T12, typename T13>
195 struct Types13 {
196   typedef T1 Head;
197   typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
198 };
199
200 template <typename T1, typename T2, typename T3, typename T4, typename T5,
201     typename T6, typename T7, typename T8, typename T9, typename T10,
202     typename T11, typename T12, typename T13, typename T14>
203 struct Types14 {
204   typedef T1 Head;
205   typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
206 };
207
208 template <typename T1, typename T2, typename T3, typename T4, typename T5,
209     typename T6, typename T7, typename T8, typename T9, typename T10,
210     typename T11, typename T12, typename T13, typename T14, typename T15>
211 struct Types15 {
212   typedef T1 Head;
213   typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
214       T15> Tail;
215 };
216
217 template <typename T1, typename T2, typename T3, typename T4, typename T5,
218     typename T6, typename T7, typename T8, typename T9, typename T10,
219     typename T11, typename T12, typename T13, typename T14, typename T15,
220     typename T16>
221 struct Types16 {
222   typedef T1 Head;
223   typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
224       T16> Tail;
225 };
226
227 template <typename T1, typename T2, typename T3, typename T4, typename T5,
228     typename T6, typename T7, typename T8, typename T9, typename T10,
229     typename T11, typename T12, typename T13, typename T14, typename T15,
230     typename T16, typename T17>
231 struct Types17 {
232   typedef T1 Head;
233   typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
234       T16, T17> Tail;
235 };
236
237 template <typename T1, typename T2, typename T3, typename T4, typename T5,
238     typename T6, typename T7, typename T8, typename T9, typename T10,
239     typename T11, typename T12, typename T13, typename T14, typename T15,
240     typename T16, typename T17, typename T18>
241 struct Types18 {
242   typedef T1 Head;
243   typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
244       T16, T17, T18> Tail;
245 };
246
247 template <typename T1, typename T2, typename T3, typename T4, typename T5,
248     typename T6, typename T7, typename T8, typename T9, typename T10,
249     typename T11, typename T12, typename T13, typename T14, typename T15,
250     typename T16, typename T17, typename T18, typename T19>
251 struct Types19 {
252   typedef T1 Head;
253   typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
254       T16, T17, T18, T19> Tail;
255 };
256
257 template <typename T1, typename T2, typename T3, typename T4, typename T5,
258     typename T6, typename T7, typename T8, typename T9, typename T10,
259     typename T11, typename T12, typename T13, typename T14, typename T15,
260     typename T16, typename T17, typename T18, typename T19, typename T20>
261 struct Types20 {
262   typedef T1 Head;
263   typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
264       T16, T17, T18, T19, T20> Tail;
265 };
266
267 template <typename T1, typename T2, typename T3, typename T4, typename T5,
268     typename T6, typename T7, typename T8, typename T9, typename T10,
269     typename T11, typename T12, typename T13, typename T14, typename T15,
270     typename T16, typename T17, typename T18, typename T19, typename T20,
271     typename T21>
272 struct Types21 {
273   typedef T1 Head;
274   typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
275       T16, T17, T18, T19, T20, T21> Tail;
276 };
277
278 template <typename T1, typename T2, typename T3, typename T4, typename T5,
279     typename T6, typename T7, typename T8, typename T9, typename T10,
280     typename T11, typename T12, typename T13, typename T14, typename T15,
281     typename T16, typename T17, typename T18, typename T19, typename T20,
282     typename T21, typename T22>
283 struct Types22 {
284   typedef T1 Head;
285   typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
286       T16, T17, T18, T19, T20, T21, T22> Tail;
287 };
288
289 template <typename T1, typename T2, typename T3, typename T4, typename T5,
290     typename T6, typename T7, typename T8, typename T9, typename T10,
291     typename T11, typename T12, typename T13, typename T14, typename T15,
292     typename T16, typename T17, typename T18, typename T19, typename T20,
293     typename T21, typename T22, typename T23>
294 struct Types23 {
295   typedef T1 Head;
296   typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
297       T16, T17, T18, T19, T20, T21, T22, T23> Tail;
298 };
299
300 template <typename T1, typename T2, typename T3, typename T4, typename T5,
301     typename T6, typename T7, typename T8, typename T9, typename T10,
302     typename T11, typename T12, typename T13, typename T14, typename T15,
303     typename T16, typename T17, typename T18, typename T19, typename T20,
304     typename T21, typename T22, typename T23, typename T24>
305 struct Types24 {
306   typedef T1 Head;
307   typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
308       T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
309 };
310
311 template <typename T1, typename T2, typename T3, typename T4, typename T5,
312     typename T6, typename T7, typename T8, typename T9, typename T10,
313     typename T11, typename T12, typename T13, typename T14, typename T15,
314     typename T16, typename T17, typename T18, typename T19, typename T20,
315     typename T21, typename T22, typename T23, typename T24, typename T25>
316 struct Types25 {
317   typedef T1 Head;
318   typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
319       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
320 };
321
322 template <typename T1, typename T2, typename T3, typename T4, typename T5,
323     typename T6, typename T7, typename T8, typename T9, typename T10,
324     typename T11, typename T12, typename T13, typename T14, typename T15,
325     typename T16, typename T17, typename T18, typename T19, typename T20,
326     typename T21, typename T22, typename T23, typename T24, typename T25,
327     typename T26>
328 struct Types26 {
329   typedef T1 Head;
330   typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
331       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
332 };
333
334 template <typename T1, typename T2, typename T3, typename T4, typename T5,
335     typename T6, typename T7, typename T8, typename T9, typename T10,
336     typename T11, typename T12, typename T13, typename T14, typename T15,
337     typename T16, typename T17, typename T18, typename T19, typename T20,
338     typename T21, typename T22, typename T23, typename T24, typename T25,
339     typename T26, typename T27>
340 struct Types27 {
341   typedef T1 Head;
342   typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
343       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
344 };
345
346 template <typename T1, typename T2, typename T3, typename T4, typename T5,
347     typename T6, typename T7, typename T8, typename T9, typename T10,
348     typename T11, typename T12, typename T13, typename T14, typename T15,
349     typename T16, typename T17, typename T18, typename T19, typename T20,
350     typename T21, typename T22, typename T23, typename T24, typename T25,
351     typename T26, typename T27, typename T28>
352 struct Types28 {
353   typedef T1 Head;
354   typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
355       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
356 };
357
358 template <typename T1, typename T2, typename T3, typename T4, typename T5,
359     typename T6, typename T7, typename T8, typename T9, typename T10,
360     typename T11, typename T12, typename T13, typename T14, typename T15,
361     typename T16, typename T17, typename T18, typename T19, typename T20,
362     typename T21, typename T22, typename T23, typename T24, typename T25,
363     typename T26, typename T27, typename T28, typename T29>
364 struct Types29 {
365   typedef T1 Head;
366   typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
367       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
368       T29> Tail;
369 };
370
371 template <typename T1, typename T2, typename T3, typename T4, typename T5,
372     typename T6, typename T7, typename T8, typename T9, typename T10,
373     typename T11, typename T12, typename T13, typename T14, typename T15,
374     typename T16, typename T17, typename T18, typename T19, typename T20,
375     typename T21, typename T22, typename T23, typename T24, typename T25,
376     typename T26, typename T27, typename T28, typename T29, typename T30>
377 struct Types30 {
378   typedef T1 Head;
379   typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
380       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
381       T30> Tail;
382 };
383
384 template <typename T1, typename T2, typename T3, typename T4, typename T5,
385     typename T6, typename T7, typename T8, typename T9, typename T10,
386     typename T11, typename T12, typename T13, typename T14, typename T15,
387     typename T16, typename T17, typename T18, typename T19, typename T20,
388     typename T21, typename T22, typename T23, typename T24, typename T25,
389     typename T26, typename T27, typename T28, typename T29, typename T30,
390     typename T31>
391 struct Types31 {
392   typedef T1 Head;
393   typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
394       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
395       T30, T31> Tail;
396 };
397
398 template <typename T1, typename T2, typename T3, typename T4, typename T5,
399     typename T6, typename T7, typename T8, typename T9, typename T10,
400     typename T11, typename T12, typename T13, typename T14, typename T15,
401     typename T16, typename T17, typename T18, typename T19, typename T20,
402     typename T21, typename T22, typename T23, typename T24, typename T25,
403     typename T26, typename T27, typename T28, typename T29, typename T30,
404     typename T31, typename T32>
405 struct Types32 {
406   typedef T1 Head;
407   typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
408       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
409       T30, T31, T32> Tail;
410 };
411
412 template <typename T1, typename T2, typename T3, typename T4, typename T5,
413     typename T6, typename T7, typename T8, typename T9, typename T10,
414     typename T11, typename T12, typename T13, typename T14, typename T15,
415     typename T16, typename T17, typename T18, typename T19, typename T20,
416     typename T21, typename T22, typename T23, typename T24, typename T25,
417     typename T26, typename T27, typename T28, typename T29, typename T30,
418     typename T31, typename T32, typename T33>
419 struct Types33 {
420   typedef T1 Head;
421   typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
422       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
423       T30, T31, T32, T33> Tail;
424 };
425
426 template <typename T1, typename T2, typename T3, typename T4, typename T5,
427     typename T6, typename T7, typename T8, typename T9, typename T10,
428     typename T11, typename T12, typename T13, typename T14, typename T15,
429     typename T16, typename T17, typename T18, typename T19, typename T20,
430     typename T21, typename T22, typename T23, typename T24, typename T25,
431     typename T26, typename T27, typename T28, typename T29, typename T30,
432     typename T31, typename T32, typename T33, typename T34>
433 struct Types34 {
434   typedef T1 Head;
435   typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
436       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
437       T30, T31, T32, T33, T34> Tail;
438 };
439
440 template <typename T1, typename T2, typename T3, typename T4, typename T5,
441     typename T6, typename T7, typename T8, typename T9, typename T10,
442     typename T11, typename T12, typename T13, typename T14, typename T15,
443     typename T16, typename T17, typename T18, typename T19, typename T20,
444     typename T21, typename T22, typename T23, typename T24, typename T25,
445     typename T26, typename T27, typename T28, typename T29, typename T30,
446     typename T31, typename T32, typename T33, typename T34, typename T35>
447 struct Types35 {
448   typedef T1 Head;
449   typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
450       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
451       T30, T31, T32, T33, T34, T35> Tail;
452 };
453
454 template <typename T1, typename T2, typename T3, typename T4, typename T5,
455     typename T6, typename T7, typename T8, typename T9, typename T10,
456     typename T11, typename T12, typename T13, typename T14, typename T15,
457     typename T16, typename T17, typename T18, typename T19, typename T20,
458     typename T21, typename T22, typename T23, typename T24, typename T25,
459     typename T26, typename T27, typename T28, typename T29, typename T30,
460     typename T31, typename T32, typename T33, typename T34, typename T35,
461     typename T36>
462 struct Types36 {
463   typedef T1 Head;
464   typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
465       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
466       T30, T31, T32, T33, T34, T35, T36> Tail;
467 };
468
469 template <typename T1, typename T2, typename T3, typename T4, typename T5,
470     typename T6, typename T7, typename T8, typename T9, typename T10,
471     typename T11, typename T12, typename T13, typename T14, typename T15,
472     typename T16, typename T17, typename T18, typename T19, typename T20,
473     typename T21, typename T22, typename T23, typename T24, typename T25,
474     typename T26, typename T27, typename T28, typename T29, typename T30,
475     typename T31, typename T32, typename T33, typename T34, typename T35,
476     typename T36, typename T37>
477 struct Types37 {
478   typedef T1 Head;
479   typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
480       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
481       T30, T31, T32, T33, T34, T35, T36, T37> Tail;
482 };
483
484 template <typename T1, typename T2, typename T3, typename T4, typename T5,
485     typename T6, typename T7, typename T8, typename T9, typename T10,
486     typename T11, typename T12, typename T13, typename T14, typename T15,
487     typename T16, typename T17, typename T18, typename T19, typename T20,
488     typename T21, typename T22, typename T23, typename T24, typename T25,
489     typename T26, typename T27, typename T28, typename T29, typename T30,
490     typename T31, typename T32, typename T33, typename T34, typename T35,
491     typename T36, typename T37, typename T38>
492 struct Types38 {
493   typedef T1 Head;
494   typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
495       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
496       T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
497 };
498
499 template <typename T1, typename T2, typename T3, typename T4, typename T5,
500     typename T6, typename T7, typename T8, typename T9, typename T10,
501     typename T11, typename T12, typename T13, typename T14, typename T15,
502     typename T16, typename T17, typename T18, typename T19, typename T20,
503     typename T21, typename T22, typename T23, typename T24, typename T25,
504     typename T26, typename T27, typename T28, typename T29, typename T30,
505     typename T31, typename T32, typename T33, typename T34, typename T35,
506     typename T36, typename T37, typename T38, typename T39>
507 struct Types39 {
508   typedef T1 Head;
509   typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
510       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
511       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
512 };
513
514 template <typename T1, typename T2, typename T3, typename T4, typename T5,
515     typename T6, typename T7, typename T8, typename T9, typename T10,
516     typename T11, typename T12, typename T13, typename T14, typename T15,
517     typename T16, typename T17, typename T18, typename T19, typename T20,
518     typename T21, typename T22, typename T23, typename T24, typename T25,
519     typename T26, typename T27, typename T28, typename T29, typename T30,
520     typename T31, typename T32, typename T33, typename T34, typename T35,
521     typename T36, typename T37, typename T38, typename T39, typename T40>
522 struct Types40 {
523   typedef T1 Head;
524   typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
525       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
526       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
527 };
528
529 template <typename T1, typename T2, typename T3, typename T4, typename T5,
530     typename T6, typename T7, typename T8, typename T9, typename T10,
531     typename T11, typename T12, typename T13, typename T14, typename T15,
532     typename T16, typename T17, typename T18, typename T19, typename T20,
533     typename T21, typename T22, typename T23, typename T24, typename T25,
534     typename T26, typename T27, typename T28, typename T29, typename T30,
535     typename T31, typename T32, typename T33, typename T34, typename T35,
536     typename T36, typename T37, typename T38, typename T39, typename T40,
537     typename T41>
538 struct Types41 {
539   typedef T1 Head;
540   typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
541       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
542       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
543 };
544
545 template <typename T1, typename T2, typename T3, typename T4, typename T5,
546     typename T6, typename T7, typename T8, typename T9, typename T10,
547     typename T11, typename T12, typename T13, typename T14, typename T15,
548     typename T16, typename T17, typename T18, typename T19, typename T20,
549     typename T21, typename T22, typename T23, typename T24, typename T25,
550     typename T26, typename T27, typename T28, typename T29, typename T30,
551     typename T31, typename T32, typename T33, typename T34, typename T35,
552     typename T36, typename T37, typename T38, typename T39, typename T40,
553     typename T41, typename T42>
554 struct Types42 {
555   typedef T1 Head;
556   typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
557       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
558       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
559 };
560
561 template <typename T1, typename T2, typename T3, typename T4, typename T5,
562     typename T6, typename T7, typename T8, typename T9, typename T10,
563     typename T11, typename T12, typename T13, typename T14, typename T15,
564     typename T16, typename T17, typename T18, typename T19, typename T20,
565     typename T21, typename T22, typename T23, typename T24, typename T25,
566     typename T26, typename T27, typename T28, typename T29, typename T30,
567     typename T31, typename T32, typename T33, typename T34, typename T35,
568     typename T36, typename T37, typename T38, typename T39, typename T40,
569     typename T41, typename T42, typename T43>
570 struct Types43 {
571   typedef T1 Head;
572   typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
573       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
574       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
575       T43> Tail;
576 };
577
578 template <typename T1, typename T2, typename T3, typename T4, typename T5,
579     typename T6, typename T7, typename T8, typename T9, typename T10,
580     typename T11, typename T12, typename T13, typename T14, typename T15,
581     typename T16, typename T17, typename T18, typename T19, typename T20,
582     typename T21, typename T22, typename T23, typename T24, typename T25,
583     typename T26, typename T27, typename T28, typename T29, typename T30,
584     typename T31, typename T32, typename T33, typename T34, typename T35,
585     typename T36, typename T37, typename T38, typename T39, typename T40,
586     typename T41, typename T42, typename T43, typename T44>
587 struct Types44 {
588   typedef T1 Head;
589   typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
590       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
591       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
592       T44> Tail;
593 };
594
595 template <typename T1, typename T2, typename T3, typename T4, typename T5,
596     typename T6, typename T7, typename T8, typename T9, typename T10,
597     typename T11, typename T12, typename T13, typename T14, typename T15,
598     typename T16, typename T17, typename T18, typename T19, typename T20,
599     typename T21, typename T22, typename T23, typename T24, typename T25,
600     typename T26, typename T27, typename T28, typename T29, typename T30,
601     typename T31, typename T32, typename T33, typename T34, typename T35,
602     typename T36, typename T37, typename T38, typename T39, typename T40,
603     typename T41, typename T42, typename T43, typename T44, typename T45>
604 struct Types45 {
605   typedef T1 Head;
606   typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
607       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
608       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
609       T44, T45> Tail;
610 };
611
612 template <typename T1, typename T2, typename T3, typename T4, typename T5,
613     typename T6, typename T7, typename T8, typename T9, typename T10,
614     typename T11, typename T12, typename T13, typename T14, typename T15,
615     typename T16, typename T17, typename T18, typename T19, typename T20,
616     typename T21, typename T22, typename T23, typename T24, typename T25,
617     typename T26, typename T27, typename T28, typename T29, typename T30,
618     typename T31, typename T32, typename T33, typename T34, typename T35,
619     typename T36, typename T37, typename T38, typename T39, typename T40,
620     typename T41, typename T42, typename T43, typename T44, typename T45,
621     typename T46>
622 struct Types46 {
623   typedef T1 Head;
624   typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
625       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
626       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
627       T44, T45, T46> Tail;
628 };
629
630 template <typename T1, typename T2, typename T3, typename T4, typename T5,
631     typename T6, typename T7, typename T8, typename T9, typename T10,
632     typename T11, typename T12, typename T13, typename T14, typename T15,
633     typename T16, typename T17, typename T18, typename T19, typename T20,
634     typename T21, typename T22, typename T23, typename T24, typename T25,
635     typename T26, typename T27, typename T28, typename T29, typename T30,
636     typename T31, typename T32, typename T33, typename T34, typename T35,
637     typename T36, typename T37, typename T38, typename T39, typename T40,
638     typename T41, typename T42, typename T43, typename T44, typename T45,
639     typename T46, typename T47>
640 struct Types47 {
641   typedef T1 Head;
642   typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
643       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
644       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
645       T44, T45, T46, T47> Tail;
646 };
647
648 template <typename T1, typename T2, typename T3, typename T4, typename T5,
649     typename T6, typename T7, typename T8, typename T9, typename T10,
650     typename T11, typename T12, typename T13, typename T14, typename T15,
651     typename T16, typename T17, typename T18, typename T19, typename T20,
652     typename T21, typename T22, typename T23, typename T24, typename T25,
653     typename T26, typename T27, typename T28, typename T29, typename T30,
654     typename T31, typename T32, typename T33, typename T34, typename T35,
655     typename T36, typename T37, typename T38, typename T39, typename T40,
656     typename T41, typename T42, typename T43, typename T44, typename T45,
657     typename T46, typename T47, typename T48>
658 struct Types48 {
659   typedef T1 Head;
660   typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
661       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
662       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
663       T44, T45, T46, T47, T48> Tail;
664 };
665
666 template <typename T1, typename T2, typename T3, typename T4, typename T5,
667     typename T6, typename T7, typename T8, typename T9, typename T10,
668     typename T11, typename T12, typename T13, typename T14, typename T15,
669     typename T16, typename T17, typename T18, typename T19, typename T20,
670     typename T21, typename T22, typename T23, typename T24, typename T25,
671     typename T26, typename T27, typename T28, typename T29, typename T30,
672     typename T31, typename T32, typename T33, typename T34, typename T35,
673     typename T36, typename T37, typename T38, typename T39, typename T40,
674     typename T41, typename T42, typename T43, typename T44, typename T45,
675     typename T46, typename T47, typename T48, typename T49>
676 struct Types49 {
677   typedef T1 Head;
678   typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
679       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
680       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
681       T44, T45, T46, T47, T48, T49> Tail;
682 };
683
684 template <typename T1, typename T2, typename T3, typename T4, typename T5,
685     typename T6, typename T7, typename T8, typename T9, typename T10,
686     typename T11, typename T12, typename T13, typename T14, typename T15,
687     typename T16, typename T17, typename T18, typename T19, typename T20,
688     typename T21, typename T22, typename T23, typename T24, typename T25,
689     typename T26, typename T27, typename T28, typename T29, typename T30,
690     typename T31, typename T32, typename T33, typename T34, typename T35,
691     typename T36, typename T37, typename T38, typename T39, typename T40,
692     typename T41, typename T42, typename T43, typename T44, typename T45,
693     typename T46, typename T47, typename T48, typename T49, typename T50>
694 struct Types50 {
695   typedef T1 Head;
696   typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
697       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
698       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
699       T44, T45, T46, T47, T48, T49, T50> Tail;
700 };
701
702
703 }  // namespace internal
704
705 // We don't want to require the users to write TypesN<...> directly,
706 // as that would require them to count the length.  Types<...> is much
707 // easier to write, but generates horrible messages when there is a
708 // compiler error, as gcc insists on printing out each template
709 // argument, even if it has the default value (this means Types<int>
710 // will appear as Types<int, None, None, ..., None> in the compiler
711 // errors).
712 //
713 // Our solution is to combine the best part of the two approaches: a
714 // user would write Types<T1, ..., TN>, and Google Test will translate
715 // that to TypesN<T1, ..., TN> internally to make error messages
716 // readable.  The translation is done by the 'type' member of the
717 // Types template.
718 template <typename T1 = internal::None, typename T2 = internal::None,
719     typename T3 = internal::None, typename T4 = internal::None,
720     typename T5 = internal::None, typename T6 = internal::None,
721     typename T7 = internal::None, typename T8 = internal::None,
722     typename T9 = internal::None, typename T10 = internal::None,
723     typename T11 = internal::None, typename T12 = internal::None,
724     typename T13 = internal::None, typename T14 = internal::None,
725     typename T15 = internal::None, typename T16 = internal::None,
726     typename T17 = internal::None, typename T18 = internal::None,
727     typename T19 = internal::None, typename T20 = internal::None,
728     typename T21 = internal::None, typename T22 = internal::None,
729     typename T23 = internal::None, typename T24 = internal::None,
730     typename T25 = internal::None, typename T26 = internal::None,
731     typename T27 = internal::None, typename T28 = internal::None,
732     typename T29 = internal::None, typename T30 = internal::None,
733     typename T31 = internal::None, typename T32 = internal::None,
734     typename T33 = internal::None, typename T34 = internal::None,
735     typename T35 = internal::None, typename T36 = internal::None,
736     typename T37 = internal::None, typename T38 = internal::None,
737     typename T39 = internal::None, typename T40 = internal::None,
738     typename T41 = internal::None, typename T42 = internal::None,
739     typename T43 = internal::None, typename T44 = internal::None,
740     typename T45 = internal::None, typename T46 = internal::None,
741     typename T47 = internal::None, typename T48 = internal::None,
742     typename T49 = internal::None, typename T50 = internal::None>
743 struct Types {
744   typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
745       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
746       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
747       T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
748 };
749
750 template <>
751 struct Types<internal::None, internal::None, internal::None, internal::None,
752     internal::None, internal::None, internal::None, internal::None,
753     internal::None, internal::None, internal::None, internal::None,
754     internal::None, internal::None, internal::None, internal::None,
755     internal::None, internal::None, internal::None, internal::None,
756     internal::None, internal::None, internal::None, internal::None,
757     internal::None, internal::None, internal::None, internal::None,
758     internal::None, internal::None, internal::None, internal::None,
759     internal::None, internal::None, internal::None, internal::None,
760     internal::None, internal::None, internal::None, internal::None,
761     internal::None, internal::None, internal::None, internal::None,
762     internal::None, internal::None, internal::None, internal::None,
763     internal::None, internal::None> {
764   typedef internal::Types0 type;
765 };
766 template <typename T1>
767 struct Types<T1, internal::None, internal::None, internal::None,
768     internal::None, internal::None, internal::None, internal::None,
769     internal::None, internal::None, internal::None, internal::None,
770     internal::None, internal::None, internal::None, internal::None,
771     internal::None, internal::None, internal::None, internal::None,
772     internal::None, internal::None, internal::None, internal::None,
773     internal::None, internal::None, internal::None, internal::None,
774     internal::None, internal::None, internal::None, internal::None,
775     internal::None, internal::None, internal::None, internal::None,
776     internal::None, internal::None, internal::None, internal::None,
777     internal::None, internal::None, internal::None, internal::None,
778     internal::None, internal::None, internal::None, internal::None,
779     internal::None, internal::None> {
780   typedef internal::Types1<T1> type;
781 };
782 template <typename T1, typename T2>
783 struct Types<T1, T2, internal::None, internal::None, internal::None,
784     internal::None, internal::None, internal::None, internal::None,
785     internal::None, internal::None, internal::None, internal::None,
786     internal::None, internal::None, internal::None, internal::None,
787     internal::None, internal::None, internal::None, internal::None,
788     internal::None, internal::None, internal::None, internal::None,
789     internal::None, internal::None, internal::None, internal::None,
790     internal::None, internal::None, internal::None, internal::None,
791     internal::None, internal::None, internal::None, internal::None,
792     internal::None, internal::None, internal::None, internal::None,
793     internal::None, internal::None, internal::None, internal::None,
794     internal::None, internal::None, internal::None, internal::None,
795     internal::None> {
796   typedef internal::Types2<T1, T2> type;
797 };
798 template <typename T1, typename T2, typename T3>
799 struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
800     internal::None, internal::None, internal::None, internal::None,
801     internal::None, internal::None, internal::None, internal::None,
802     internal::None, internal::None, internal::None, internal::None,
803     internal::None, internal::None, internal::None, internal::None,
804     internal::None, internal::None, internal::None, internal::None,
805     internal::None, internal::None, internal::None, internal::None,
806     internal::None, internal::None, internal::None, internal::None,
807     internal::None, internal::None, internal::None, internal::None,
808     internal::None, internal::None, internal::None, internal::None,
809     internal::None, internal::None, internal::None, internal::None,
810     internal::None, internal::None, internal::None, internal::None> {
811   typedef internal::Types3<T1, T2, T3> type;
812 };
813 template <typename T1, typename T2, typename T3, typename T4>
814 struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
815     internal::None, internal::None, internal::None, internal::None,
816     internal::None, internal::None, internal::None, internal::None,
817     internal::None, internal::None, internal::None, internal::None,
818     internal::None, internal::None, internal::None, internal::None,
819     internal::None, internal::None, internal::None, internal::None,
820     internal::None, internal::None, internal::None, internal::None,
821     internal::None, internal::None, internal::None, internal::None,
822     internal::None, internal::None, internal::None, internal::None,
823     internal::None, internal::None, internal::None, internal::None,
824     internal::None, internal::None, internal::None, internal::None,
825     internal::None, internal::None, internal::None> {
826   typedef internal::Types4<T1, T2, T3, T4> type;
827 };
828 template <typename T1, typename T2, typename T3, typename T4, typename T5>
829 struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
830     internal::None, internal::None, internal::None, internal::None,
831     internal::None, internal::None, internal::None, internal::None,
832     internal::None, internal::None, internal::None, internal::None,
833     internal::None, internal::None, internal::None, internal::None,
834     internal::None, internal::None, internal::None, internal::None,
835     internal::None, internal::None, internal::None, internal::None,
836     internal::None, internal::None, internal::None, internal::None,
837     internal::None, internal::None, internal::None, internal::None,
838     internal::None, internal::None, internal::None, internal::None,
839     internal::None, internal::None, internal::None, internal::None,
840     internal::None, internal::None, internal::None> {
841   typedef internal::Types5<T1, T2, T3, T4, T5> type;
842 };
843 template <typename T1, typename T2, typename T3, typename T4, typename T5,
844     typename T6>
845 struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
846     internal::None, internal::None, internal::None, internal::None,
847     internal::None, internal::None, internal::None, internal::None,
848     internal::None, internal::None, internal::None, internal::None,
849     internal::None, internal::None, internal::None, internal::None,
850     internal::None, internal::None, internal::None, internal::None,
851     internal::None, internal::None, internal::None, internal::None,
852     internal::None, internal::None, internal::None, internal::None,
853     internal::None, internal::None, internal::None, internal::None,
854     internal::None, internal::None, internal::None, internal::None,
855     internal::None, internal::None, internal::None, internal::None,
856     internal::None, internal::None> {
857   typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
858 };
859 template <typename T1, typename T2, typename T3, typename T4, typename T5,
860     typename T6, typename T7>
861 struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
862     internal::None, internal::None, internal::None, internal::None,
863     internal::None, internal::None, internal::None, internal::None,
864     internal::None, internal::None, internal::None, internal::None,
865     internal::None, internal::None, internal::None, internal::None,
866     internal::None, internal::None, internal::None, internal::None,
867     internal::None, internal::None, internal::None, internal::None,
868     internal::None, internal::None, internal::None, internal::None,
869     internal::None, internal::None, internal::None, internal::None,
870     internal::None, internal::None, internal::None, internal::None,
871     internal::None, internal::None, internal::None, internal::None,
872     internal::None> {
873   typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
874 };
875 template <typename T1, typename T2, typename T3, typename T4, typename T5,
876     typename T6, typename T7, typename T8>
877 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
878     internal::None, internal::None, internal::None, internal::None,
879     internal::None, internal::None, internal::None, internal::None,
880     internal::None, internal::None, internal::None, internal::None,
881     internal::None, internal::None, internal::None, internal::None,
882     internal::None, internal::None, internal::None, internal::None,
883     internal::None, internal::None, internal::None, internal::None,
884     internal::None, internal::None, internal::None, internal::None,
885     internal::None, internal::None, internal::None, internal::None,
886     internal::None, internal::None, internal::None, internal::None,
887     internal::None, internal::None, internal::None, internal::None> {
888   typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
889 };
890 template <typename T1, typename T2, typename T3, typename T4, typename T5,
891     typename T6, typename T7, typename T8, typename T9>
892 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
893     internal::None, internal::None, internal::None, internal::None,
894     internal::None, internal::None, internal::None, internal::None,
895     internal::None, internal::None, internal::None, internal::None,
896     internal::None, internal::None, internal::None, internal::None,
897     internal::None, internal::None, internal::None, internal::None,
898     internal::None, internal::None, internal::None, internal::None,
899     internal::None, internal::None, internal::None, internal::None,
900     internal::None, internal::None, internal::None, internal::None,
901     internal::None, internal::None, internal::None, internal::None,
902     internal::None, internal::None, internal::None, internal::None> {
903   typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
904 };
905 template <typename T1, typename T2, typename T3, typename T4, typename T5,
906     typename T6, typename T7, typename T8, typename T9, typename T10>
907 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
908     internal::None, internal::None, internal::None, internal::None,
909     internal::None, internal::None, internal::None, internal::None,
910     internal::None, internal::None, internal::None, internal::None,
911     internal::None, internal::None, internal::None, internal::None,
912     internal::None, internal::None, internal::None, internal::None,
913     internal::None, internal::None, internal::None, internal::None,
914     internal::None, internal::None, internal::None, internal::None,
915     internal::None, internal::None, internal::None, internal::None,
916     internal::None, internal::None, internal::None, internal::None,
917     internal::None, internal::None, internal::None> {
918   typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
919 };
920 template <typename T1, typename T2, typename T3, typename T4, typename T5,
921     typename T6, typename T7, typename T8, typename T9, typename T10,
922     typename T11>
923 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
924     internal::None, internal::None, internal::None, internal::None,
925     internal::None, internal::None, internal::None, internal::None,
926     internal::None, internal::None, internal::None, internal::None,
927     internal::None, internal::None, internal::None, internal::None,
928     internal::None, internal::None, internal::None, internal::None,
929     internal::None, internal::None, internal::None, internal::None,
930     internal::None, internal::None, internal::None, internal::None,
931     internal::None, internal::None, internal::None, internal::None,
932     internal::None, internal::None, internal::None, internal::None,
933     internal::None, internal::None> {
934   typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
935 };
936 template <typename T1, typename T2, typename T3, typename T4, typename T5,
937     typename T6, typename T7, typename T8, typename T9, typename T10,
938     typename T11, typename T12>
939 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
940     internal::None, internal::None, internal::None, internal::None,
941     internal::None, internal::None, internal::None, internal::None,
942     internal::None, internal::None, internal::None, internal::None,
943     internal::None, internal::None, internal::None, internal::None,
944     internal::None, internal::None, internal::None, internal::None,
945     internal::None, internal::None, internal::None, internal::None,
946     internal::None, internal::None, internal::None, internal::None,
947     internal::None, internal::None, internal::None, internal::None,
948     internal::None, internal::None, internal::None, internal::None,
949     internal::None> {
950   typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
951       T12> type;
952 };
953 template <typename T1, typename T2, typename T3, typename T4, typename T5,
954     typename T6, typename T7, typename T8, typename T9, typename T10,
955     typename T11, typename T12, typename T13>
956 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
957     internal::None, internal::None, internal::None, internal::None,
958     internal::None, internal::None, internal::None, internal::None,
959     internal::None, internal::None, internal::None, internal::None,
960     internal::None, internal::None, internal::None, internal::None,
961     internal::None, internal::None, internal::None, internal::None,
962     internal::None, internal::None, internal::None, internal::None,
963     internal::None, internal::None, internal::None, internal::None,
964     internal::None, internal::None, internal::None, internal::None,
965     internal::None, internal::None, internal::None, internal::None,
966     internal::None> {
967   typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
968       T13> type;
969 };
970 template <typename T1, typename T2, typename T3, typename T4, typename T5,
971     typename T6, typename T7, typename T8, typename T9, typename T10,
972     typename T11, typename T12, typename T13, typename T14>
973 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
974     internal::None, internal::None, internal::None, internal::None,
975     internal::None, internal::None, internal::None, internal::None,
976     internal::None, internal::None, internal::None, internal::None,
977     internal::None, internal::None, internal::None, internal::None,
978     internal::None, internal::None, internal::None, internal::None,
979     internal::None, internal::None, internal::None, internal::None,
980     internal::None, internal::None, internal::None, internal::None,
981     internal::None, internal::None, internal::None, internal::None,
982     internal::None, internal::None, internal::None, internal::None> {
983   typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
984       T13, T14> type;
985 };
986 template <typename T1, typename T2, typename T3, typename T4, typename T5,
987     typename T6, typename T7, typename T8, typename T9, typename T10,
988     typename T11, typename T12, typename T13, typename T14, typename T15>
989 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
990     internal::None, internal::None, internal::None, internal::None,
991     internal::None, internal::None, internal::None, internal::None,
992     internal::None, internal::None, internal::None, internal::None,
993     internal::None, internal::None, internal::None, internal::None,
994     internal::None, internal::None, internal::None, internal::None,
995     internal::None, internal::None, internal::None, internal::None,
996     internal::None, internal::None, internal::None, internal::None,
997     internal::None, internal::None, internal::None, internal::None,
998     internal::None, internal::None, internal::None> {
999   typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1000       T13, T14, T15> type;
1001 };
1002 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1003     typename T6, typename T7, typename T8, typename T9, typename T10,
1004     typename T11, typename T12, typename T13, typename T14, typename T15,
1005     typename T16>
1006 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1007     T16, internal::None, internal::None, internal::None, internal::None,
1008     internal::None, internal::None, internal::None, internal::None,
1009     internal::None, internal::None, internal::None, internal::None,
1010     internal::None, internal::None, internal::None, internal::None,
1011     internal::None, internal::None, internal::None, internal::None,
1012     internal::None, internal::None, internal::None, internal::None,
1013     internal::None, internal::None, internal::None, internal::None,
1014     internal::None, internal::None, internal::None, internal::None,
1015     internal::None, internal::None> {
1016   typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1017       T13, T14, T15, T16> type;
1018 };
1019 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1020     typename T6, typename T7, typename T8, typename T9, typename T10,
1021     typename T11, typename T12, typename T13, typename T14, typename T15,
1022     typename T16, typename T17>
1023 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1024     T16, T17, internal::None, internal::None, internal::None, internal::None,
1025     internal::None, internal::None, internal::None, internal::None,
1026     internal::None, internal::None, internal::None, internal::None,
1027     internal::None, internal::None, internal::None, internal::None,
1028     internal::None, internal::None, internal::None, internal::None,
1029     internal::None, internal::None, internal::None, internal::None,
1030     internal::None, internal::None, internal::None, internal::None,
1031     internal::None, internal::None, internal::None, internal::None,
1032     internal::None> {
1033   typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1034       T13, T14, T15, T16, T17> type;
1035 };
1036 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1037     typename T6, typename T7, typename T8, typename T9, typename T10,
1038     typename T11, typename T12, typename T13, typename T14, typename T15,
1039     typename T16, typename T17, typename T18>
1040 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1041     T16, T17, T18, internal::None, internal::None, internal::None,
1042     internal::None, internal::None, internal::None, internal::None,
1043     internal::None, internal::None, internal::None, internal::None,
1044     internal::None, internal::None, internal::None, internal::None,
1045     internal::None, internal::None, internal::None, internal::None,
1046     internal::None, internal::None, internal::None, internal::None,
1047     internal::None, internal::None, internal::None, internal::None,
1048     internal::None, internal::None, internal::None, internal::None,
1049     internal::None> {
1050   typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1051       T13, T14, T15, T16, T17, T18> type;
1052 };
1053 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1054     typename T6, typename T7, typename T8, typename T9, typename T10,
1055     typename T11, typename T12, typename T13, typename T14, typename T15,
1056     typename T16, typename T17, typename T18, typename T19>
1057 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1058     T16, T17, T18, T19, internal::None, internal::None, internal::None,
1059     internal::None, internal::None, internal::None, internal::None,
1060     internal::None, internal::None, internal::None, internal::None,
1061     internal::None, internal::None, internal::None, internal::None,
1062     internal::None, internal::None, internal::None, internal::None,
1063     internal::None, internal::None, internal::None, internal::None,
1064     internal::None, internal::None, internal::None, internal::None,
1065     internal::None, internal::None, internal::None, internal::None> {
1066   typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1067       T13, T14, T15, T16, T17, T18, T19> type;
1068 };
1069 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1070     typename T6, typename T7, typename T8, typename T9, typename T10,
1071     typename T11, typename T12, typename T13, typename T14, typename T15,
1072     typename T16, typename T17, typename T18, typename T19, typename T20>
1073 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1074     T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
1075     internal::None, internal::None, internal::None, internal::None,
1076     internal::None, internal::None, internal::None, internal::None,
1077     internal::None, internal::None, internal::None, internal::None,
1078     internal::None, internal::None, internal::None, internal::None,
1079     internal::None, internal::None, internal::None, internal::None,
1080     internal::None, internal::None, internal::None, internal::None,
1081     internal::None, internal::None, internal::None> {
1082   typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1083       T13, T14, T15, T16, T17, T18, T19, T20> type;
1084 };
1085 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1086     typename T6, typename T7, typename T8, typename T9, typename T10,
1087     typename T11, typename T12, typename T13, typename T14, typename T15,
1088     typename T16, typename T17, typename T18, typename T19, typename T20,
1089     typename T21>
1090 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1091     T16, T17, T18, T19, T20, T21, internal::None, internal::None,
1092     internal::None, internal::None, internal::None, internal::None,
1093     internal::None, internal::None, internal::None, internal::None,
1094     internal::None, internal::None, internal::None, internal::None,
1095     internal::None, internal::None, internal::None, internal::None,
1096     internal::None, internal::None, internal::None, internal::None,
1097     internal::None, internal::None, internal::None, internal::None,
1098     internal::None, internal::None, internal::None> {
1099   typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1100       T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
1101 };
1102 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1103     typename T6, typename T7, typename T8, typename T9, typename T10,
1104     typename T11, typename T12, typename T13, typename T14, typename T15,
1105     typename T16, typename T17, typename T18, typename T19, typename T20,
1106     typename T21, typename T22>
1107 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1108     T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
1109     internal::None, internal::None, internal::None, internal::None,
1110     internal::None, internal::None, internal::None, internal::None,
1111     internal::None, internal::None, internal::None, internal::None,
1112     internal::None, internal::None, internal::None, internal::None,
1113     internal::None, internal::None, internal::None, internal::None,
1114     internal::None, internal::None, internal::None, internal::None,
1115     internal::None, internal::None> {
1116   typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1117       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
1118 };
1119 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1120     typename T6, typename T7, typename T8, typename T9, typename T10,
1121     typename T11, typename T12, typename T13, typename T14, typename T15,
1122     typename T16, typename T17, typename T18, typename T19, typename T20,
1123     typename T21, typename T22, typename T23>
1124 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1125     T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
1126     internal::None, internal::None, internal::None, internal::None,
1127     internal::None, internal::None, internal::None, internal::None,
1128     internal::None, internal::None, internal::None, internal::None,
1129     internal::None, internal::None, internal::None, internal::None,
1130     internal::None, internal::None, internal::None, internal::None,
1131     internal::None, internal::None, internal::None, internal::None,
1132     internal::None> {
1133   typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1134       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
1135 };
1136 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1137     typename T6, typename T7, typename T8, typename T9, typename T10,
1138     typename T11, typename T12, typename T13, typename T14, typename T15,
1139     typename T16, typename T17, typename T18, typename T19, typename T20,
1140     typename T21, typename T22, typename T23, typename T24>
1141 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1142     T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
1143     internal::None, internal::None, internal::None, internal::None,
1144     internal::None, internal::None, internal::None, internal::None,
1145     internal::None, internal::None, internal::None, internal::None,
1146     internal::None, internal::None, internal::None, internal::None,
1147     internal::None, internal::None, internal::None, internal::None,
1148     internal::None, internal::None, internal::None, internal::None,
1149     internal::None> {
1150   typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1151       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
1152 };
1153 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1154     typename T6, typename T7, typename T8, typename T9, typename T10,
1155     typename T11, typename T12, typename T13, typename T14, typename T15,
1156     typename T16, typename T17, typename T18, typename T19, typename T20,
1157     typename T21, typename T22, typename T23, typename T24, typename T25>
1158 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1159     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
1160     internal::None, internal::None, internal::None, internal::None,
1161     internal::None, internal::None, internal::None, internal::None,
1162     internal::None, internal::None, internal::None, internal::None,
1163     internal::None, internal::None, internal::None, internal::None,
1164     internal::None, internal::None, internal::None, internal::None,
1165     internal::None, internal::None, internal::None, internal::None> {
1166   typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1167       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
1168 };
1169 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1170     typename T6, typename T7, typename T8, typename T9, typename T10,
1171     typename T11, typename T12, typename T13, typename T14, typename T15,
1172     typename T16, typename T17, typename T18, typename T19, typename T20,
1173     typename T21, typename T22, typename T23, typename T24, typename T25,
1174     typename T26>
1175 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1176     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
1177     internal::None, internal::None, internal::None, internal::None,
1178     internal::None, internal::None, internal::None, internal::None,
1179     internal::None, internal::None, internal::None, internal::None,
1180     internal::None, internal::None, internal::None, internal::None,
1181     internal::None, internal::None, internal::None, internal::None,
1182     internal::None, internal::None, internal::None> {
1183   typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1184       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1185       T26> type;
1186 };
1187 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1188     typename T6, typename T7, typename T8, typename T9, typename T10,
1189     typename T11, typename T12, typename T13, typename T14, typename T15,
1190     typename T16, typename T17, typename T18, typename T19, typename T20,
1191     typename T21, typename T22, typename T23, typename T24, typename T25,
1192     typename T26, typename T27>
1193 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1194     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
1195     internal::None, internal::None, internal::None, internal::None,
1196     internal::None, internal::None, internal::None, internal::None,
1197     internal::None, internal::None, internal::None, internal::None,
1198     internal::None, internal::None, internal::None, internal::None,
1199     internal::None, internal::None, internal::None, internal::None,
1200     internal::None, internal::None> {
1201   typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1202       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1203       T27> type;
1204 };
1205 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1206     typename T6, typename T7, typename T8, typename T9, typename T10,
1207     typename T11, typename T12, typename T13, typename T14, typename T15,
1208     typename T16, typename T17, typename T18, typename T19, typename T20,
1209     typename T21, typename T22, typename T23, typename T24, typename T25,
1210     typename T26, typename T27, typename T28>
1211 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1212     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1213     internal::None, internal::None, internal::None, internal::None,
1214     internal::None, internal::None, internal::None, internal::None,
1215     internal::None, internal::None, internal::None, internal::None,
1216     internal::None, internal::None, internal::None, internal::None,
1217     internal::None, internal::None, internal::None, internal::None,
1218     internal::None, internal::None> {
1219   typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1220       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1221       T27, T28> type;
1222 };
1223 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1224     typename T6, typename T7, typename T8, typename T9, typename T10,
1225     typename T11, typename T12, typename T13, typename T14, typename T15,
1226     typename T16, typename T17, typename T18, typename T19, typename T20,
1227     typename T21, typename T22, typename T23, typename T24, typename T25,
1228     typename T26, typename T27, typename T28, typename T29>
1229 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1230     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
1231     internal::None, internal::None, internal::None, internal::None,
1232     internal::None, internal::None, internal::None, internal::None,
1233     internal::None, internal::None, internal::None, internal::None,
1234     internal::None, internal::None, internal::None, internal::None,
1235     internal::None, internal::None, internal::None, internal::None,
1236     internal::None> {
1237   typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1238       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1239       T27, T28, T29> type;
1240 };
1241 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1242     typename T6, typename T7, typename T8, typename T9, typename T10,
1243     typename T11, typename T12, typename T13, typename T14, typename T15,
1244     typename T16, typename T17, typename T18, typename T19, typename T20,
1245     typename T21, typename T22, typename T23, typename T24, typename T25,
1246     typename T26, typename T27, typename T28, typename T29, typename T30>
1247 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1248     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1249     internal::None, internal::None, internal::None, internal::None,
1250     internal::None, internal::None, internal::None, internal::None,
1251     internal::None, internal::None, internal::None, internal::None,
1252     internal::None, internal::None, internal::None, internal::None,
1253     internal::None, internal::None, internal::None, internal::None> {
1254   typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1255       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1256       T27, T28, T29, T30> type;
1257 };
1258 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1259     typename T6, typename T7, typename T8, typename T9, typename T10,
1260     typename T11, typename T12, typename T13, typename T14, typename T15,
1261     typename T16, typename T17, typename T18, typename T19, typename T20,
1262     typename T21, typename T22, typename T23, typename T24, typename T25,
1263     typename T26, typename T27, typename T28, typename T29, typename T30,
1264     typename T31>
1265 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1266     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1267     T31, internal::None, internal::None, internal::None, internal::None,
1268     internal::None, internal::None, internal::None, internal::None,
1269     internal::None, internal::None, internal::None, internal::None,
1270     internal::None, internal::None, internal::None, internal::None,
1271     internal::None, internal::None, internal::None> {
1272   typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1273       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1274       T27, T28, T29, T30, T31> type;
1275 };
1276 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1277     typename T6, typename T7, typename T8, typename T9, typename T10,
1278     typename T11, typename T12, typename T13, typename T14, typename T15,
1279     typename T16, typename T17, typename T18, typename T19, typename T20,
1280     typename T21, typename T22, typename T23, typename T24, typename T25,
1281     typename T26, typename T27, typename T28, typename T29, typename T30,
1282     typename T31, typename T32>
1283 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1284     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1285     T31, T32, internal::None, internal::None, internal::None, internal::None,
1286     internal::None, internal::None, internal::None, internal::None,
1287     internal::None, internal::None, internal::None, internal::None,
1288     internal::None, internal::None, internal::None, internal::None,
1289     internal::None, internal::None> {
1290   typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1291       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1292       T27, T28, T29, T30, T31, T32> type;
1293 };
1294 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1295     typename T6, typename T7, typename T8, typename T9, typename T10,
1296     typename T11, typename T12, typename T13, typename T14, typename T15,
1297     typename T16, typename T17, typename T18, typename T19, typename T20,
1298     typename T21, typename T22, typename T23, typename T24, typename T25,
1299     typename T26, typename T27, typename T28, typename T29, typename T30,
1300     typename T31, typename T32, typename T33>
1301 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1302     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1303     T31, T32, T33, internal::None, internal::None, internal::None,
1304     internal::None, internal::None, internal::None, internal::None,
1305     internal::None, internal::None, internal::None, internal::None,
1306     internal::None, internal::None, internal::None, internal::None,
1307     internal::None, internal::None> {
1308   typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1309       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1310       T27, T28, T29, T30, T31, T32, T33> type;
1311 };
1312 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1313     typename T6, typename T7, typename T8, typename T9, typename T10,
1314     typename T11, typename T12, typename T13, typename T14, typename T15,
1315     typename T16, typename T17, typename T18, typename T19, typename T20,
1316     typename T21, typename T22, typename T23, typename T24, typename T25,
1317     typename T26, typename T27, typename T28, typename T29, typename T30,
1318     typename T31, typename T32, typename T33, typename T34>
1319 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1320     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1321     T31, T32, T33, T34, internal::None, internal::None, internal::None,
1322     internal::None, internal::None, internal::None, internal::None,
1323     internal::None, internal::None, internal::None, internal::None,
1324     internal::None, internal::None, internal::None, internal::None,
1325     internal::None> {
1326   typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1327       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1328       T27, T28, T29, T30, T31, T32, T33, T34> type;
1329 };
1330 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1331     typename T6, typename T7, typename T8, typename T9, typename T10,
1332     typename T11, typename T12, typename T13, typename T14, typename T15,
1333     typename T16, typename T17, typename T18, typename T19, typename T20,
1334     typename T21, typename T22, typename T23, typename T24, typename T25,
1335     typename T26, typename T27, typename T28, typename T29, typename T30,
1336     typename T31, typename T32, typename T33, typename T34, typename T35>
1337 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1338     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1339     T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
1340     internal::None, internal::None, internal::None, internal::None,
1341     internal::None, internal::None, internal::None, internal::None,
1342     internal::None, internal::None, internal::None, internal::None> {
1343   typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1344       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1345       T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
1346 };
1347 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1348     typename T6, typename T7, typename T8, typename T9, typename T10,
1349     typename T11, typename T12, typename T13, typename T14, typename T15,
1350     typename T16, typename T17, typename T18, typename T19, typename T20,
1351     typename T21, typename T22, typename T23, typename T24, typename T25,
1352     typename T26, typename T27, typename T28, typename T29, typename T30,
1353     typename T31, typename T32, typename T33, typename T34, typename T35,
1354     typename T36>
1355 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1356     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1357     T31, T32, T33, T34, T35, T36, internal::None, internal::None,
1358     internal::None, internal::None, internal::None, internal::None,
1359     internal::None, internal::None, internal::None, internal::None,
1360     internal::None, internal::None, internal::None, internal::None> {
1361   typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1362       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1363       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
1364 };
1365 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1366     typename T6, typename T7, typename T8, typename T9, typename T10,
1367     typename T11, typename T12, typename T13, typename T14, typename T15,
1368     typename T16, typename T17, typename T18, typename T19, typename T20,
1369     typename T21, typename T22, typename T23, typename T24, typename T25,
1370     typename T26, typename T27, typename T28, typename T29, typename T30,
1371     typename T31, typename T32, typename T33, typename T34, typename T35,
1372     typename T36, typename T37>
1373 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1374     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1375     T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
1376     internal::None, internal::None, internal::None, internal::None,
1377     internal::None, internal::None, internal::None, internal::None,
1378     internal::None, internal::None, internal::None> {
1379   typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1380       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1381       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
1382 };
1383 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1384     typename T6, typename T7, typename T8, typename T9, typename T10,
1385     typename T11, typename T12, typename T13, typename T14, typename T15,
1386     typename T16, typename T17, typename T18, typename T19, typename T20,
1387     typename T21, typename T22, typename T23, typename T24, typename T25,
1388     typename T26, typename T27, typename T28, typename T29, typename T30,
1389     typename T31, typename T32, typename T33, typename T34, typename T35,
1390     typename T36, typename T37, typename T38>
1391 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1392     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1393     T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
1394     internal::None, internal::None, internal::None, internal::None,
1395     internal::None, internal::None, internal::None, internal::None,
1396     internal::None, internal::None> {
1397   typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1398       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1399       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
1400 };
1401 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1402     typename T6, typename T7, typename T8, typename T9, typename T10,
1403     typename T11, typename T12, typename T13, typename T14, typename T15,
1404     typename T16, typename T17, typename T18, typename T19, typename T20,
1405     typename T21, typename T22, typename T23, typename T24, typename T25,
1406     typename T26, typename T27, typename T28, typename T29, typename T30,
1407     typename T31, typename T32, typename T33, typename T34, typename T35,
1408     typename T36, typename T37, typename T38, typename T39>
1409 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1410     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1411     T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
1412     internal::None, internal::None, internal::None, internal::None,
1413     internal::None, internal::None, internal::None, internal::None,
1414     internal::None, internal::None> {
1415   typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1416       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1417       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
1418 };
1419 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1420     typename T6, typename T7, typename T8, typename T9, typename T10,
1421     typename T11, typename T12, typename T13, typename T14, typename T15,
1422     typename T16, typename T17, typename T18, typename T19, typename T20,
1423     typename T21, typename T22, typename T23, typename T24, typename T25,
1424     typename T26, typename T27, typename T28, typename T29, typename T30,
1425     typename T31, typename T32, typename T33, typename T34, typename T35,
1426     typename T36, typename T37, typename T38, typename T39, typename T40>
1427 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1428     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1429     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
1430     internal::None, internal::None, internal::None, internal::None,
1431     internal::None, internal::None, internal::None, internal::None,
1432     internal::None> {
1433   typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1434       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1435       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1436       T40> type;
1437 };
1438 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1439     typename T6, typename T7, typename T8, typename T9, typename T10,
1440     typename T11, typename T12, typename T13, typename T14, typename T15,
1441     typename T16, typename T17, typename T18, typename T19, typename T20,
1442     typename T21, typename T22, typename T23, typename T24, typename T25,
1443     typename T26, typename T27, typename T28, typename T29, typename T30,
1444     typename T31, typename T32, typename T33, typename T34, typename T35,
1445     typename T36, typename T37, typename T38, typename T39, typename T40,
1446     typename T41>
1447 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1448     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1449     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
1450     internal::None, internal::None, internal::None, internal::None,
1451     internal::None, internal::None, internal::None, internal::None> {
1452   typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1453       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1454       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1455       T41> type;
1456 };
1457 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1458     typename T6, typename T7, typename T8, typename T9, typename T10,
1459     typename T11, typename T12, typename T13, typename T14, typename T15,
1460     typename T16, typename T17, typename T18, typename T19, typename T20,
1461     typename T21, typename T22, typename T23, typename T24, typename T25,
1462     typename T26, typename T27, typename T28, typename T29, typename T30,
1463     typename T31, typename T32, typename T33, typename T34, typename T35,
1464     typename T36, typename T37, typename T38, typename T39, typename T40,
1465     typename T41, typename T42>
1466 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1467     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1468     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
1469     internal::None, internal::None, internal::None, internal::None,
1470     internal::None, internal::None, internal::None> {
1471   typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1472       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1473       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1474       T41, T42> type;
1475 };
1476 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1477     typename T6, typename T7, typename T8, typename T9, typename T10,
1478     typename T11, typename T12, typename T13, typename T14, typename T15,
1479     typename T16, typename T17, typename T18, typename T19, typename T20,
1480     typename T21, typename T22, typename T23, typename T24, typename T25,
1481     typename T26, typename T27, typename T28, typename T29, typename T30,
1482     typename T31, typename T32, typename T33, typename T34, typename T35,
1483     typename T36, typename T37, typename T38, typename T39, typename T40,
1484     typename T41, typename T42, typename T43>
1485 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1486     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1487     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1488     internal::None, internal::None, internal::None, internal::None,
1489     internal::None, internal::None, internal::None> {
1490   typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1491       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1492       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1493       T41, T42, T43> type;
1494 };
1495 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1496     typename T6, typename T7, typename T8, typename T9, typename T10,
1497     typename T11, typename T12, typename T13, typename T14, typename T15,
1498     typename T16, typename T17, typename T18, typename T19, typename T20,
1499     typename T21, typename T22, typename T23, typename T24, typename T25,
1500     typename T26, typename T27, typename T28, typename T29, typename T30,
1501     typename T31, typename T32, typename T33, typename T34, typename T35,
1502     typename T36, typename T37, typename T38, typename T39, typename T40,
1503     typename T41, typename T42, typename T43, typename T44>
1504 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1505     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1506     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
1507     internal::None, internal::None, internal::None, internal::None,
1508     internal::None, internal::None> {
1509   typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1510       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1511       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1512       T41, T42, T43, T44> type;
1513 };
1514 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1515     typename T6, typename T7, typename T8, typename T9, typename T10,
1516     typename T11, typename T12, typename T13, typename T14, typename T15,
1517     typename T16, typename T17, typename T18, typename T19, typename T20,
1518     typename T21, typename T22, typename T23, typename T24, typename T25,
1519     typename T26, typename T27, typename T28, typename T29, typename T30,
1520     typename T31, typename T32, typename T33, typename T34, typename T35,
1521     typename T36, typename T37, typename T38, typename T39, typename T40,
1522     typename T41, typename T42, typename T43, typename T44, typename T45>
1523 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1524     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1525     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1526     internal::None, internal::None, internal::None, internal::None,
1527     internal::None> {
1528   typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1529       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1530       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1531       T41, T42, T43, T44, T45> type;
1532 };
1533 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1534     typename T6, typename T7, typename T8, typename T9, typename T10,
1535     typename T11, typename T12, typename T13, typename T14, typename T15,
1536     typename T16, typename T17, typename T18, typename T19, typename T20,
1537     typename T21, typename T22, typename T23, typename T24, typename T25,
1538     typename T26, typename T27, typename T28, typename T29, typename T30,
1539     typename T31, typename T32, typename T33, typename T34, typename T35,
1540     typename T36, typename T37, typename T38, typename T39, typename T40,
1541     typename T41, typename T42, typename T43, typename T44, typename T45,
1542     typename T46>
1543 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1544     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1545     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1546     T46, internal::None, internal::None, internal::None, internal::None> {
1547   typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1548       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1549       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1550       T41, T42, T43, T44, T45, T46> type;
1551 };
1552 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1553     typename T6, typename T7, typename T8, typename T9, typename T10,
1554     typename T11, typename T12, typename T13, typename T14, typename T15,
1555     typename T16, typename T17, typename T18, typename T19, typename T20,
1556     typename T21, typename T22, typename T23, typename T24, typename T25,
1557     typename T26, typename T27, typename T28, typename T29, typename T30,
1558     typename T31, typename T32, typename T33, typename T34, typename T35,
1559     typename T36, typename T37, typename T38, typename T39, typename T40,
1560     typename T41, typename T42, typename T43, typename T44, typename T45,
1561     typename T46, typename T47>
1562 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1563     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1564     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1565     T46, T47, internal::None, internal::None, internal::None> {
1566   typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1567       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1568       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1569       T41, T42, T43, T44, T45, T46, T47> type;
1570 };
1571 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1572     typename T6, typename T7, typename T8, typename T9, typename T10,
1573     typename T11, typename T12, typename T13, typename T14, typename T15,
1574     typename T16, typename T17, typename T18, typename T19, typename T20,
1575     typename T21, typename T22, typename T23, typename T24, typename T25,
1576     typename T26, typename T27, typename T28, typename T29, typename T30,
1577     typename T31, typename T32, typename T33, typename T34, typename T35,
1578     typename T36, typename T37, typename T38, typename T39, typename T40,
1579     typename T41, typename T42, typename T43, typename T44, typename T45,
1580     typename T46, typename T47, typename T48>
1581 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1582     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1583     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1584     T46, T47, T48, internal::None, internal::None> {
1585   typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1586       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1587       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1588       T41, T42, T43, T44, T45, T46, T47, T48> type;
1589 };
1590 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1591     typename T6, typename T7, typename T8, typename T9, typename T10,
1592     typename T11, typename T12, typename T13, typename T14, typename T15,
1593     typename T16, typename T17, typename T18, typename T19, typename T20,
1594     typename T21, typename T22, typename T23, typename T24, typename T25,
1595     typename T26, typename T27, typename T28, typename T29, typename T30,
1596     typename T31, typename T32, typename T33, typename T34, typename T35,
1597     typename T36, typename T37, typename T38, typename T39, typename T40,
1598     typename T41, typename T42, typename T43, typename T44, typename T45,
1599     typename T46, typename T47, typename T48, typename T49>
1600 struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1601     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1602     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1603     T46, T47, T48, T49, internal::None> {
1604   typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1605       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1606       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1607       T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
1608 };
1609
1610 namespace internal {
1611
1612 #define GTEST_TEMPLATE_ template <typename T> class
1613
1614 // The template "selector" struct TemplateSel<Tmpl> is used to
1615 // represent Tmpl, which must be a class template with one type
1616 // parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
1617 // as the type Tmpl<T>.  This allows us to actually instantiate the
1618 // template "selected" by TemplateSel<Tmpl>.
1619 //
1620 // This trick is necessary for simulating typedef for class templates,
1621 // which C++ doesn't support directly.
1622 template <GTEST_TEMPLATE_ Tmpl>
1623 struct TemplateSel {
1624   template <typename T>
1625   struct Bind {
1626     typedef Tmpl<T> type;
1627   };
1628 };
1629
1630 #define GTEST_BIND_(TmplSel, T) \
1631   TmplSel::template Bind<T>::type
1632
1633 // A unique struct template used as the default value for the
1634 // arguments of class template Templates.  This allows us to simulate
1635 // variadic templates (e.g. Templates<int>, Templates<int, double>,
1636 // and etc), which C++ doesn't support directly.
1637 template <typename T>
1638 struct NoneT {};
1639
1640 // The following family of struct and struct templates are used to
1641 // represent template lists.  In particular, TemplatesN<T1, T2, ...,
1642 // TN> represents a list of N templates (T1, T2, ..., and TN).  Except
1643 // for Templates0, every struct in the family has two member types:
1644 // Head for the selector of the first template in the list, and Tail
1645 // for the rest of the list.
1646
1647 // The empty template list.
1648 struct Templates0 {};
1649
1650 // Template lists of length 1, 2, 3, and so on.
1651
1652 template <GTEST_TEMPLATE_ T1>
1653 struct Templates1 {
1654   typedef TemplateSel<T1> Head;
1655   typedef Templates0 Tail;
1656 };
1657 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
1658 struct Templates2 {
1659   typedef TemplateSel<T1> Head;
1660   typedef Templates1<T2> Tail;
1661 };
1662
1663 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
1664 struct Templates3 {
1665   typedef TemplateSel<T1> Head;
1666   typedef Templates2<T2, T3> Tail;
1667 };
1668
1669 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1670     GTEST_TEMPLATE_ T4>
1671 struct Templates4 {
1672   typedef TemplateSel<T1> Head;
1673   typedef Templates3<T2, T3, T4> Tail;
1674 };
1675
1676 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1677     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
1678 struct Templates5 {
1679   typedef TemplateSel<T1> Head;
1680   typedef Templates4<T2, T3, T4, T5> Tail;
1681 };
1682
1683 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1684     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
1685 struct Templates6 {
1686   typedef TemplateSel<T1> Head;
1687   typedef Templates5<T2, T3, T4, T5, T6> Tail;
1688 };
1689
1690 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1691     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1692     GTEST_TEMPLATE_ T7>
1693 struct Templates7 {
1694   typedef TemplateSel<T1> Head;
1695   typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
1696 };
1697
1698 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1699     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1700     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
1701 struct Templates8 {
1702   typedef TemplateSel<T1> Head;
1703   typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
1704 };
1705
1706 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1707     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1708     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
1709 struct Templates9 {
1710   typedef TemplateSel<T1> Head;
1711   typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
1712 };
1713
1714 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1715     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1716     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1717     GTEST_TEMPLATE_ T10>
1718 struct Templates10 {
1719   typedef TemplateSel<T1> Head;
1720   typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
1721 };
1722
1723 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1724     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1725     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1726     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
1727 struct Templates11 {
1728   typedef TemplateSel<T1> Head;
1729   typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
1730 };
1731
1732 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1733     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1734     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1735     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
1736 struct Templates12 {
1737   typedef TemplateSel<T1> Head;
1738   typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
1739 };
1740
1741 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1742     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1743     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1744     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1745     GTEST_TEMPLATE_ T13>
1746 struct Templates13 {
1747   typedef TemplateSel<T1> Head;
1748   typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
1749 };
1750
1751 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1752     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1753     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1754     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1755     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
1756 struct Templates14 {
1757   typedef TemplateSel<T1> Head;
1758   typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1759       T14> Tail;
1760 };
1761
1762 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1763     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1764     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1765     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1766     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
1767 struct Templates15 {
1768   typedef TemplateSel<T1> Head;
1769   typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1770       T15> Tail;
1771 };
1772
1773 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1774     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1775     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1776     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1777     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1778     GTEST_TEMPLATE_ T16>
1779 struct Templates16 {
1780   typedef TemplateSel<T1> Head;
1781   typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1782       T15, T16> Tail;
1783 };
1784
1785 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1786     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1787     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1788     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1789     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1790     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
1791 struct Templates17 {
1792   typedef TemplateSel<T1> Head;
1793   typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1794       T15, T16, T17> Tail;
1795 };
1796
1797 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1798     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1799     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1800     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1801     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1802     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
1803 struct Templates18 {
1804   typedef TemplateSel<T1> Head;
1805   typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1806       T15, T16, T17, T18> Tail;
1807 };
1808
1809 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1810     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1811     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1812     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1813     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1814     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1815     GTEST_TEMPLATE_ T19>
1816 struct Templates19 {
1817   typedef TemplateSel<T1> Head;
1818   typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1819       T15, T16, T17, T18, T19> Tail;
1820 };
1821
1822 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1823     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1824     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1825     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1826     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1827     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1828     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
1829 struct Templates20 {
1830   typedef TemplateSel<T1> Head;
1831   typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1832       T15, T16, T17, T18, T19, T20> Tail;
1833 };
1834
1835 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1836     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1837     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1838     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1839     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1840     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1841     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
1842 struct Templates21 {
1843   typedef TemplateSel<T1> Head;
1844   typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1845       T15, T16, T17, T18, T19, T20, T21> Tail;
1846 };
1847
1848 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1849     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1850     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1851     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1852     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1853     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1854     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1855     GTEST_TEMPLATE_ T22>
1856 struct Templates22 {
1857   typedef TemplateSel<T1> Head;
1858   typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1859       T15, T16, T17, T18, T19, T20, T21, T22> Tail;
1860 };
1861
1862 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1863     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1864     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1865     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1866     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1867     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1868     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1869     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
1870 struct Templates23 {
1871   typedef TemplateSel<T1> Head;
1872   typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1873       T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
1874 };
1875
1876 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1877     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1878     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1879     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1880     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1881     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1882     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1883     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
1884 struct Templates24 {
1885   typedef TemplateSel<T1> Head;
1886   typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1887       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
1888 };
1889
1890 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1891     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1892     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1893     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1894     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1895     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1896     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1897     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1898     GTEST_TEMPLATE_ T25>
1899 struct Templates25 {
1900   typedef TemplateSel<T1> Head;
1901   typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1902       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
1903 };
1904
1905 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1906     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1907     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1908     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1909     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1910     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1911     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1912     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1913     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
1914 struct Templates26 {
1915   typedef TemplateSel<T1> Head;
1916   typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1917       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
1918 };
1919
1920 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1921     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1922     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1923     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1924     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1925     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1926     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1927     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1928     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
1929 struct Templates27 {
1930   typedef TemplateSel<T1> Head;
1931   typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1932       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
1933 };
1934
1935 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1936     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1937     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1938     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1939     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1940     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1941     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1942     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1943     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1944     GTEST_TEMPLATE_ T28>
1945 struct Templates28 {
1946   typedef TemplateSel<T1> Head;
1947   typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1948       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
1949       T28> Tail;
1950 };
1951
1952 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1953     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1954     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1955     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1956     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1957     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1958     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1959     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1960     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1961     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
1962 struct Templates29 {
1963   typedef TemplateSel<T1> Head;
1964   typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1965       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1966       T29> Tail;
1967 };
1968
1969 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1970     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1971     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1972     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1973     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1974     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1975     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1976     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1977     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1978     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
1979 struct Templates30 {
1980   typedef TemplateSel<T1> Head;
1981   typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1982       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1983       T29, T30> Tail;
1984 };
1985
1986 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1987     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1988     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1989     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1990     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1991     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1992     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1993     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1994     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1995     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
1996     GTEST_TEMPLATE_ T31>
1997 struct Templates31 {
1998   typedef TemplateSel<T1> Head;
1999   typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2000       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2001       T29, T30, T31> Tail;
2002 };
2003
2004 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2005     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2006     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2007     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2008     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2009     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2010     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2011     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2012     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2013     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2014     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
2015 struct Templates32 {
2016   typedef TemplateSel<T1> Head;
2017   typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2018       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2019       T29, T30, T31, T32> Tail;
2020 };
2021
2022 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2023     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2024     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2025     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2026     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2027     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2028     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2029     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2030     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2031     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2032     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
2033 struct Templates33 {
2034   typedef TemplateSel<T1> Head;
2035   typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2036       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2037       T29, T30, T31, T32, T33> Tail;
2038 };
2039
2040 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2041     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2042     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2043     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2044     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2045     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2046     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2047     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2048     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2049     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2050     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2051     GTEST_TEMPLATE_ T34>
2052 struct Templates34 {
2053   typedef TemplateSel<T1> Head;
2054   typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2055       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2056       T29, T30, T31, T32, T33, T34> Tail;
2057 };
2058
2059 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2060     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2061     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2062     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2063     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2064     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2065     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2066     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2067     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2068     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2069     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2070     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
2071 struct Templates35 {
2072   typedef TemplateSel<T1> Head;
2073   typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2074       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2075       T29, T30, T31, T32, T33, T34, T35> Tail;
2076 };
2077
2078 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2079     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2080     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2081     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2082     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2083     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2084     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2085     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2086     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2087     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2088     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2089     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
2090 struct Templates36 {
2091   typedef TemplateSel<T1> Head;
2092   typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2093       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2094       T29, T30, T31, T32, T33, T34, T35, T36> Tail;
2095 };
2096
2097 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2098     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2099     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2100     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2101     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2102     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2103     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2104     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2105     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2106     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2107     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2108     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2109     GTEST_TEMPLATE_ T37>
2110 struct Templates37 {
2111   typedef TemplateSel<T1> Head;
2112   typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2113       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2114       T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
2115 };
2116
2117 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2118     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2119     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2120     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2121     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2122     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2123     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2124     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2125     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2126     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2127     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2128     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2129     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
2130 struct Templates38 {
2131   typedef TemplateSel<T1> Head;
2132   typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2133       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2134       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
2135 };
2136
2137 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2138     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2139     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2140     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2141     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2142     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2143     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2144     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2145     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2146     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2147     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2148     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2149     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
2150 struct Templates39 {
2151   typedef TemplateSel<T1> Head;
2152   typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2153       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2154       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
2155 };
2156
2157 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2158     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2159     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2160     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2161     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2162     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2163     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2164     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2165     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2166     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2167     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2168     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2169     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2170     GTEST_TEMPLATE_ T40>
2171 struct Templates40 {
2172   typedef TemplateSel<T1> Head;
2173   typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2174       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2175       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
2176 };
2177
2178 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2179     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2180     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2181     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2182     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2183     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2184     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2185     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2186     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2187     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2188     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2189     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2190     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2191     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
2192 struct Templates41 {
2193   typedef TemplateSel<T1> Head;
2194   typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2195       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2196       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
2197 };
2198
2199 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2200     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2201     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2202     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2203     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2204     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2205     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2206     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2207     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2208     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2209     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2210     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2211     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2212     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
2213 struct Templates42 {
2214   typedef TemplateSel<T1> Head;
2215   typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2216       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2217       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
2218       T42> Tail;
2219 };
2220
2221 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2222     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2223     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2224     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2225     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2226     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2227     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2228     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2229     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2230     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2231     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2232     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2233     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2234     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2235     GTEST_TEMPLATE_ T43>
2236 struct Templates43 {
2237   typedef TemplateSel<T1> Head;
2238   typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2239       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2240       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2241       T43> Tail;
2242 };
2243
2244 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2245     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2246     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2247     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2248     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2249     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2250     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2251     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2252     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2253     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2254     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2255     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2256     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2257     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2258     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
2259 struct Templates44 {
2260   typedef TemplateSel<T1> Head;
2261   typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2262       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2263       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2264       T43, T44> Tail;
2265 };
2266
2267 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2268     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2269     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2270     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2271     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2272     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2273     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2274     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2275     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2276     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2277     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2278     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2279     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2280     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2281     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
2282 struct Templates45 {
2283   typedef TemplateSel<T1> Head;
2284   typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2285       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2286       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2287       T43, T44, T45> Tail;
2288 };
2289
2290 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2291     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2292     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2293     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2294     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2295     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2296     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2297     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2298     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2299     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2300     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2301     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2302     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2303     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2304     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2305     GTEST_TEMPLATE_ T46>
2306 struct Templates46 {
2307   typedef TemplateSel<T1> Head;
2308   typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2309       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2310       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2311       T43, T44, T45, T46> Tail;
2312 };
2313
2314 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2315     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2316     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2317     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2318     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2319     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2320     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2321     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2322     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2323     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2324     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2325     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2326     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2327     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2328     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2329     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
2330 struct Templates47 {
2331   typedef TemplateSel<T1> Head;
2332   typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2333       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2334       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2335       T43, T44, T45, T46, T47> Tail;
2336 };
2337
2338 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2339     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2340     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2341     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2342     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2343     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2344     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2345     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2346     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2347     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2348     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2349     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2350     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2351     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2352     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2353     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
2354 struct Templates48 {
2355   typedef TemplateSel<T1> Head;
2356   typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2357       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2358       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2359       T43, T44, T45, T46, T47, T48> Tail;
2360 };
2361
2362 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2363     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2364     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2365     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2366     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2367     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2368     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2369     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2370     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2371     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2372     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2373     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2374     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2375     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2376     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2377     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
2378     GTEST_TEMPLATE_ T49>
2379 struct Templates49 {
2380   typedef TemplateSel<T1> Head;
2381   typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2382       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2383       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2384       T43, T44, T45, T46, T47, T48, T49> Tail;
2385 };
2386
2387 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2388     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2389     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2390     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2391     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2392     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2393     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2394     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2395     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2396     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2397     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2398     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2399     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2400     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
2401     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
2402     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
2403     GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
2404 struct Templates50 {
2405   typedef TemplateSel<T1> Head;
2406   typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2407       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2408       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
2409       T43, T44, T45, T46, T47, T48, T49, T50> Tail;
2410 };
2411
2412
2413 // We don't want to require the users to write TemplatesN<...> directly,
2414 // as that would require them to count the length.  Templates<...> is much
2415 // easier to write, but generates horrible messages when there is a
2416 // compiler error, as gcc insists on printing out each template
2417 // argument, even if it has the default value (this means Templates<list>
2418 // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
2419 // errors).
2420 //
2421 // Our solution is to combine the best part of the two approaches: a
2422 // user would write Templates<T1, ..., TN>, and Google Test will translate
2423 // that to TemplatesN<T1, ..., TN> internally to make error messages
2424 // readable.  The translation is done by the 'type' member of the
2425 // Templates template.
2426 template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
2427     GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
2428     GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
2429     GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
2430     GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
2431     GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
2432     GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
2433     GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
2434     GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
2435     GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
2436     GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
2437     GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
2438     GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
2439     GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
2440     GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
2441     GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
2442     GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
2443     GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
2444     GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
2445     GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
2446     GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
2447     GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
2448     GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
2449     GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
2450     GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
2451 struct Templates {
2452   typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2453       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2454       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
2455       T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
2456 };
2457
2458 template <>
2459 struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2460     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2461     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2462     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2463     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2464     NoneT> {
2465   typedef Templates0 type;
2466 };
2467 template <GTEST_TEMPLATE_ T1>
2468 struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2469     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2470     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2471     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2472     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2473     NoneT> {
2474   typedef Templates1<T1> type;
2475 };
2476 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
2477 struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2478     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2479     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2480     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2481     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2482     NoneT> {
2483   typedef Templates2<T1, T2> type;
2484 };
2485 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
2486 struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2487     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2488     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2489     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2490     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2491   typedef Templates3<T1, T2, T3> type;
2492 };
2493 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2494     GTEST_TEMPLATE_ T4>
2495 struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2496     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2497     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2498     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2499     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2500   typedef Templates4<T1, T2, T3, T4> type;
2501 };
2502 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2503     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
2504 struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2505     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2506     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2507     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2508     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2509   typedef Templates5<T1, T2, T3, T4, T5> type;
2510 };
2511 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2512     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
2513 struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
2514     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2515     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2516     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2517     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2518   typedef Templates6<T1, T2, T3, T4, T5, T6> type;
2519 };
2520 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2521     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2522     GTEST_TEMPLATE_ T7>
2523 struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
2524     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2525     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2526     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2527     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2528   typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
2529 };
2530 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2531     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2532     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
2533 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
2534     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2535     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2536     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2537     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2538   typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
2539 };
2540 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2541     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2542     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
2543 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
2544     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2545     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2546     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2547     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2548   typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
2549 };
2550 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2551     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2552     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2553     GTEST_TEMPLATE_ T10>
2554 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
2555     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2556     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2557     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2558     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2559   typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
2560 };
2561 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2562     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2563     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2564     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
2565 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
2566     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2567     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2568     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2569     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2570   typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
2571 };
2572 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2573     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2574     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2575     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
2576 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
2577     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2578     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2579     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2580     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2581   typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
2582 };
2583 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2584     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2585     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2586     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2587     GTEST_TEMPLATE_ T13>
2588 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
2589     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2590     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2591     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2592     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2593   typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
2594       T13> type;
2595 };
2596 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2597     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2598     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2599     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2600     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
2601 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2602     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2603     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2604     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2605     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2606   typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2607       T14> type;
2608 };
2609 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2610     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2611     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2612     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2613     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
2614 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2615     T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2616     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2617     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2618     NoneT, NoneT, NoneT, NoneT, NoneT> {
2619   typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2620       T14, T15> type;
2621 };
2622 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2623     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2624     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2625     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2626     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2627     GTEST_TEMPLATE_ T16>
2628 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2629     T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2630     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2631     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2632     NoneT, NoneT, NoneT, NoneT, NoneT> {
2633   typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2634       T14, T15, T16> type;
2635 };
2636 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2637     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2638     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2639     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2640     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2641     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
2642 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2643     T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2644     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2645     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2646     NoneT, NoneT, NoneT, NoneT, NoneT> {
2647   typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2648       T14, T15, T16, T17> type;
2649 };
2650 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2651     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2652     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2653     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2654     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2655     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
2656 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2657     T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2658     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2659     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2660     NoneT, NoneT, NoneT, NoneT> {
2661   typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2662       T14, T15, T16, T17, T18> type;
2663 };
2664 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2665     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2666     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2667     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2668     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2669     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2670     GTEST_TEMPLATE_ T19>
2671 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2672     T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2673     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2674     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2675     NoneT, NoneT, NoneT, NoneT> {
2676   typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2677       T14, T15, T16, T17, T18, T19> type;
2678 };
2679 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2680     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2681     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2682     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2683     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2684     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2685     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
2686 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2687     T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2688     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2689     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2690     NoneT, NoneT, NoneT, NoneT> {
2691   typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2692       T14, T15, T16, T17, T18, T19, T20> type;
2693 };
2694 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2695     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2696     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2697     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2698     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2699     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2700     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
2701 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2702     T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
2703     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2704     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2705     NoneT, NoneT, NoneT, NoneT> {
2706   typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2707       T14, T15, T16, T17, T18, T19, T20, T21> type;
2708 };
2709 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2710     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2711     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2712     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2713     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2714     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2715     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2716     GTEST_TEMPLATE_ T22>
2717 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2718     T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
2719     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2720     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2721     NoneT, NoneT, NoneT> {
2722   typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2723       T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
2724 };
2725 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2726     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2727     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2728     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2729     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2730     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2731     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2732     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
2733 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2734     T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
2735     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2736     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2737     NoneT, NoneT, NoneT> {
2738   typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2739       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
2740 };
2741 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2742     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2743     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2744     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2745     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2746     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2747     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2748     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
2749 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2750     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
2751     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2752     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2753     NoneT, NoneT, NoneT> {
2754   typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2755       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
2756 };
2757 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2758     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2759     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2760     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2761     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2762     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2763     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2764     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2765     GTEST_TEMPLATE_ T25>
2766 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2767     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
2768     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2769     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2770     NoneT, NoneT> {
2771   typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2772       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
2773 };
2774 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2775     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2776     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2777     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2778     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2779     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2780     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2781     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2782     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
2783 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2784     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
2785     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2786     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2787     NoneT, NoneT> {
2788   typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2789       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
2790 };
2791 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2792     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2793     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2794     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2795     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2796     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2797     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2798     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2799     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
2800 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2801     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
2802     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2803     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2804     NoneT, NoneT> {
2805   typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2806       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
2807       T27> type;
2808 };
2809 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2810     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2811     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2812     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2813     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2814     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2815     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2816     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2817     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2818     GTEST_TEMPLATE_ T28>
2819 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2820     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2821     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2822     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2823     NoneT, NoneT> {
2824   typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2825       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2826       T28> type;
2827 };
2828 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2829     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2830     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2831     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2832     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2833     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2834     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2835     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2836     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2837     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
2838 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2839     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2840     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2841     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2842     NoneT> {
2843   typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2844       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2845       T28, T29> type;
2846 };
2847 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2848     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2849     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2850     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2851     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2852     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2853     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2854     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2855     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2856     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
2857 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2858     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2859     T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2860     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2861   typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2862       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2863       T28, T29, T30> type;
2864 };
2865 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2866     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2867     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2868     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2869     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2870     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2871     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2872     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2873     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2874     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2875     GTEST_TEMPLATE_ T31>
2876 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2877     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2878     T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2879     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2880   typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2881       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2882       T28, T29, T30, T31> type;
2883 };
2884 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2885     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2886     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2887     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2888     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2889     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2890     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2891     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2892     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2893     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2894     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
2895 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2896     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2897     T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2898     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2899   typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2900       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2901       T28, T29, T30, T31, T32> type;
2902 };
2903 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2904     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2905     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2906     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2907     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2908     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2909     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2910     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2911     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2912     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2913     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
2914 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2915     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2916     T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2917     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2918   typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2919       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2920       T28, T29, T30, T31, T32, T33> type;
2921 };
2922 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2923     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2924     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2925     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2926     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2927     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2928     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2929     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2930     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2931     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2932     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2933     GTEST_TEMPLATE_ T34>
2934 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2935     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2936     T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2937     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2938   typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2939       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2940       T28, T29, T30, T31, T32, T33, T34> type;
2941 };
2942 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2943     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2944     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2945     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2946     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2947     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2948     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2949     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2950     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2951     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2952     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2953     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
2954 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2955     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2956     T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
2957     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2958   typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2959       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2960       T28, T29, T30, T31, T32, T33, T34, T35> type;
2961 };
2962 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2963     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2964     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2965     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2966     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2967     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2968     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2969     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2970     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2971     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2972     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2973     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
2974 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2975     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2976     T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
2977     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2978   typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
2979       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
2980       T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
2981 };
2982 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2983     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2984     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2985     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2986     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2987     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2988     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2989     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2990     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2991     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2992     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2993     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2994     GTEST_TEMPLATE_ T37>
2995 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2996     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
2997     T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
2998     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
2999   typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3000       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3001       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
3002 };
3003 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3004     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3005     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3006     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3007     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3008     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3009     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3010     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3011     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3012     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3013     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3014     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3015     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
3016 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3017     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3018     T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
3019     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3020   typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3021       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3022       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
3023 };
3024 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3025     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3026     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3027     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3028     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3029     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3030     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3031     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3032     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3033     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3034     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3035     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3036     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
3037 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3038     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3039     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
3040     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3041   typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3042       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3043       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
3044 };
3045 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3046     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3047     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3048     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3049     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3050     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3051     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3052     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3053     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3054     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3055     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3056     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3057     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3058     GTEST_TEMPLATE_ T40>
3059 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3060     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3061     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
3062     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3063   typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3064       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3065       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
3066 };
3067 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3068     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3069     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3070     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3071     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3072     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3073     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3074     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3075     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3076     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3077     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3078     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3079     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3080     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
3081 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3082     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3083     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
3084     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3085   typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3086       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3087       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
3088       T41> type;
3089 };
3090 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3091     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3092     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3093     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3094     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3095     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3096     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3097     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3098     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3099     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3100     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3101     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3102     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3103     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
3104 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3105     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3106     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
3107     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3108   typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3109       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3110       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3111       T42> type;
3112 };
3113 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3114     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3115     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3116     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3117     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3118     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3119     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3120     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3121     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3122     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3123     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3124     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3125     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3126     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3127     GTEST_TEMPLATE_ T43>
3128 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3129     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3130     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
3131     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3132   typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3133       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3134       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3135       T42, T43> type;
3136 };
3137 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3138     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3139     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3140     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3141     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3142     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3143     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3144     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3145     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3146     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3147     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3148     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3149     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3150     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3151     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
3152 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3153     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3154     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3155     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
3156   typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3157       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3158       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3159       T42, T43, T44> type;
3160 };
3161 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3162     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3163     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3164     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3165     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3166     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3167     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3168     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3169     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3170     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3171     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3172     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3173     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3174     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3175     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
3176 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3177     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3178     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3179     T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
3180   typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3181       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3182       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3183       T42, T43, T44, T45> type;
3184 };
3185 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3186     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3187     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3188     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3189     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3190     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3191     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3192     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3193     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3194     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3195     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3196     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3197     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3198     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3199     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3200     GTEST_TEMPLATE_ T46>
3201 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3202     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3203     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3204     T45, T46, NoneT, NoneT, NoneT, NoneT> {
3205   typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3206       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3207       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3208       T42, T43, T44, T45, T46> type;
3209 };
3210 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3211     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3212     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3213     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3214     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3215     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3216     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3217     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3218     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3219     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3220     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3221     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3222     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3223     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3224     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3225     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
3226 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3227     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3228     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3229     T45, T46, T47, NoneT, NoneT, NoneT> {
3230   typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3231       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3232       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3233       T42, T43, T44, T45, T46, T47> type;
3234 };
3235 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3236     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3237     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3238     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3239     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3240     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3241     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3242     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3243     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3244     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3245     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3246     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3247     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3248     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3249     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3250     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
3251 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3252     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3253     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3254     T45, T46, T47, T48, NoneT, NoneT> {
3255   typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3256       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3257       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3258       T42, T43, T44, T45, T46, T47, T48> type;
3259 };
3260 template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
3261     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
3262     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
3263     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
3264     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
3265     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
3266     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
3267     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
3268     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
3269     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
3270     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
3271     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
3272     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
3273     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
3274     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
3275     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
3276     GTEST_TEMPLATE_ T49>
3277 struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
3278     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
3279     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
3280     T45, T46, T47, T48, T49, NoneT> {
3281   typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3282       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
3283       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
3284       T42, T43, T44, T45, T46, T47, T48, T49> type;
3285 };
3286
3287 // The TypeList template makes it possible to use either a single type
3288 // or a Types<...> list in TYPED_TEST_CASE() and
3289 // INSTANTIATE_TYPED_TEST_CASE_P().
3290
3291 template <typename T>
3292 struct TypeList { typedef Types1<T> type; };
3293
3294 template <typename T1, typename T2, typename T3, typename T4, typename T5,
3295     typename T6, typename T7, typename T8, typename T9, typename T10,
3296     typename T11, typename T12, typename T13, typename T14, typename T15,
3297     typename T16, typename T17, typename T18, typename T19, typename T20,
3298     typename T21, typename T22, typename T23, typename T24, typename T25,
3299     typename T26, typename T27, typename T28, typename T29, typename T30,
3300     typename T31, typename T32, typename T33, typename T34, typename T35,
3301     typename T36, typename T37, typename T38, typename T39, typename T40,
3302     typename T41, typename T42, typename T43, typename T44, typename T45,
3303     typename T46, typename T47, typename T48, typename T49, typename T50>
3304 struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
3305     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
3306     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
3307     T44, T45, T46, T47, T48, T49, T50> > {
3308   typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
3309       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
3310       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
3311       T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
3312 };
3313
3314 }  // namespace internal
3315 }  // namespace testing
3316
3317 #endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
3318
3319 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_