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