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