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