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