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