Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/testing/src/external/gtest/include/gtest/internal/gtest-type-util.h @ 9021

Last change on this file since 9021 was 9021, checked in by landauf, 12 years ago

added google test and google mock to external libraries

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