1// This file was GENERATED by command:
2//     pump.py gtest-type-util.h.pump
3// DO NOT EDIT BY HAND!!!
4
5// Copyright 2008 Google Inc.
6// All Rights Reserved.
7//
8// Redistribution and use in source and binary forms, with or without
9// modification, are permitted provided that the following conditions are
10// met:
11//
12//     * Redistributions of source code must retain the above copyright
13// notice, this list of conditions and the following disclaimer.
14//     * Redistributions in binary form must reproduce the above
15// copyright notice, this list of conditions and the following disclaimer
16// in the documentation and/or other materials provided with the
17// distribution.
18//     * Neither the name of Google Inc. nor the names of its
19// contributors may be used to endorse or promote products derived from
20// this software without specific prior written permission.
21//
22// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33//
34// Author: wan@google.com (Zhanyong Wan)
35
36// Type utilities needed for implementing typed and type-parameterized
37// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
38//
39// Currently we support at most 50 types in a list, and at most 50
40// type-parameterized tests in one type-parameterized test case.
41// Please contact googletestframework@googlegroups.com if you need
42// more.
43
44#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
45#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
46
47#include "gtest/internal/gtest-port.h"
48#include "gtest/internal/gtest-string.h"
49
50// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
51// libstdc++ (which is where cxxabi.h comes from).
52# ifdef __GLIBCXX__
53#  include <cxxabi.h>
54# elif defined(__HP_aCC)
55#  include <acxx_demangle.h>
56# endif  // __GLIBCXX__
57
58namespace testing {
59namespace internal {
60
61// GetTypeName<T>() returns a human-readable name of type T.
62// NB: This function is also used in Google Mock, so don't move it inside of
63// the typed-test-only section below.
64template <typename T>
65String GetTypeName() {
66# if GTEST_HAS_RTTI
67
68  const char* const name = typeid(T).name();
69#  if defined(__GLIBCXX__) || defined(__HP_aCC)
70  int status = 0;
71  // gcc's implementation of typeid(T).name() mangles the type name,
72  // so we have to demangle it.
73#   ifdef __GLIBCXX__
74  using abi::__cxa_demangle;
75#   endif // __GLIBCXX__
76  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
77  const String name_str(status == 0 ? readable_name : name);
78  free(readable_name);
79  return name_str;
80#  else
81  return name;
82#  endif  // __GLIBCXX__ || __HP_aCC
83
84# else
85
86  return "<type>";
87
88# endif  // GTEST_HAS_RTTI
89}
90
91#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
92
93// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
94// type.  This can be used as a compile-time assertion to ensure that
95// two types are equal.
96
97template <typename T1, typename T2>
98struct AssertTypeEq;
99
100template <typename T>
101struct AssertTypeEq<T, T> {
102  typedef bool type;
103};
104
105// A unique type used as the default value for the arguments of class
106// template Types.  This allows us to simulate variadic templates
107// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
108// support directly.
109struct None {};
110
111// The following family of struct and struct templates are used to
112// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
113// represents a type list with N types (T1, T2, ..., and TN) in it.
114// Except for Types0, every struct in the family has two member types:
115// Head for the first type in the list, and Tail for the rest of the
116// list.
117
118// The empty type list.
119struct Types0 {};
120
121// Type lists of length 1, 2, 3, and so on.
122
123template <typename T1>
124struct Types1 {
125  typedef T1 Head;
126  typedef Types0 Tail;
127};
128template <typename T1, typename T2>
129struct Types2 {
130  typedef T1 Head;
131  typedef Types1<T2> Tail;
132};
133
134template <typename T1, typename T2, typename T3>
135struct Types3 {
136  typedef T1 Head;
137  typedef Types2<T2, T3> Tail;
138};
139
140template <typename T1, typename T2, typename T3, typename T4>
141struct Types4 {
142  typedef T1 Head;
143  typedef Types3<T2, T3, T4> Tail;
144};
145
146template <typename T1, typename T2, typename T3, typename T4, typename T5>
147struct Types5 {
148  typedef T1 Head;
149  typedef Types4<T2, T3, T4, T5> Tail;
150};
151
152template <typename T1, typename T2, typename T3, typename T4, typename T5,
153    typename T6>
154struct Types6 {
155  typedef T1 Head;
156  typedef Types5<T2, T3, T4, T5, T6> Tail;
157};
158
159template <typename T1, typename T2, typename T3, typename T4, typename T5,
160    typename T6, typename T7>
161struct Types7 {
162  typedef T1 Head;
163  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
164};
165
166template <typename T1, typename T2, typename T3, typename T4, typename T5,
167    typename T6, typename T7, typename T8>
168struct Types8 {
169  typedef T1 Head;
170  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
171};
172
173template <typename T1, typename T2, typename T3, typename T4, typename T5,
174    typename T6, typename T7, typename T8, typename T9>
175struct Types9 {
176  typedef T1 Head;
177  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
178};
179
180template <typename T1, typename T2, typename T3, typename T4, typename T5,
181    typename T6, typename T7, typename T8, typename T9, typename T10>
182struct Types10 {
183  typedef T1 Head;
184  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
185};
186
187template <typename T1, typename T2, typename T3, typename T4, typename T5,
188    typename T6, typename T7, typename T8, typename T9, typename T10,
189    typename T11>
190struct Types11 {
191  typedef T1 Head;
192  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
193};
194
195template <typename T1, typename T2, typename T3, typename T4, typename T5,
196    typename T6, typename T7, typename T8, typename T9, typename T10,
197    typename T11, typename T12>
198struct Types12 {
199  typedef T1 Head;
200  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
201};
202
203template <typename T1, typename T2, typename T3, typename T4, typename T5,
204    typename T6, typename T7, typename T8, typename T9, typename T10,
205    typename T11, typename T12, typename T13>
206struct Types13 {
207  typedef T1 Head;
208  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
209};
210
211template <typename T1, typename T2, typename T3, typename T4, typename T5,
212    typename T6, typename T7, typename T8, typename T9, typename T10,
213    typename T11, typename T12, typename T13, typename T14>
214struct Types14 {
215  typedef T1 Head;
216  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
217};
218
219template <typename T1, typename T2, typename T3, typename T4, typename T5,
220    typename T6, typename T7, typename T8, typename T9, typename T10,
221    typename T11, typename T12, typename T13, typename T14, typename T15>
222struct Types15 {
223  typedef T1 Head;
224  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
225      T15> Tail;
226};
227
228template <typename T1, typename T2, typename T3, typename T4, typename T5,
229    typename T6, typename T7, typename T8, typename T9, typename T10,
230    typename T11, typename T12, typename T13, typename T14, typename T15,
231    typename T16>
232struct Types16 {
233  typedef T1 Head;
234  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
235      T16> Tail;
236};
237
238template <typename T1, typename T2, typename T3, typename T4, typename T5,
239    typename T6, typename T7, typename T8, typename T9, typename T10,
240    typename T11, typename T12, typename T13, typename T14, typename T15,
241    typename T16, typename T17>
242struct Types17 {
243  typedef T1 Head;
244  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
245      T16, T17> Tail;
246};
247
248template <typename T1, typename T2, typename T3, typename T4, typename T5,
249    typename T6, typename T7, typename T8, typename T9, typename T10,
250    typename T11, typename T12, typename T13, typename T14, typename T15,
251    typename T16, typename T17, typename T18>
252struct Types18 {
253  typedef T1 Head;
254  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
255      T16, T17, T18> Tail;
256};
257
258template <typename T1, typename T2, typename T3, typename T4, typename T5,
259    typename T6, typename T7, typename T8, typename T9, typename T10,
260    typename T11, typename T12, typename T13, typename T14, typename T15,
261    typename T16, typename T17, typename T18, typename T19>
262struct Types19 {
263  typedef T1 Head;
264  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
265      T16, T17, T18, T19> Tail;
266};
267
268template <typename T1, typename T2, typename T3, typename T4, typename T5,
269    typename T6, typename T7, typename T8, typename T9, typename T10,
270    typename T11, typename T12, typename T13, typename T14, typename T15,
271    typename T16, typename T17, typename T18, typename T19, typename T20>
272struct Types20 {
273  typedef T1 Head;
274  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
275      T16, T17, T18, T19, T20> Tail;
276};
277
278template <typename T1, typename T2, typename T3, typename T4, typename T5,
279    typename T6, typename T7, typename T8, typename T9, typename T10,
280    typename T11, typename T12, typename T13, typename T14, typename T15,
281    typename T16, typename T17, typename T18, typename T19, typename T20,
282    typename T21>
283struct Types21 {
284  typedef T1 Head;
285  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
286      T16, T17, T18, T19, T20, T21> Tail;
287};
288
289template <typename T1, typename T2, typename T3, typename T4, typename T5,
290    typename T6, typename T7, typename T8, typename T9, typename T10,
291    typename T11, typename T12, typename T13, typename T14, typename T15,
292    typename T16, typename T17, typename T18, typename T19, typename T20,
293    typename T21, typename T22>
294struct Types22 {
295  typedef T1 Head;
296  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
297      T16, T17, T18, T19, T20, T21, T22> Tail;
298};
299
300template <typename T1, typename T2, typename T3, typename T4, typename T5,
301    typename T6, typename T7, typename T8, typename T9, typename T10,
302    typename T11, typename T12, typename T13, typename T14, typename T15,
303    typename T16, typename T17, typename T18, typename T19, typename T20,
304    typename T21, typename T22, typename T23>
305struct Types23 {
306  typedef T1 Head;
307  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
308      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
309};
310
311template <typename T1, typename T2, typename T3, typename T4, typename T5,
312    typename T6, typename T7, typename T8, typename T9, typename T10,
313    typename T11, typename T12, typename T13, typename T14, typename T15,
314    typename T16, typename T17, typename T18, typename T19, typename T20,
315    typename T21, typename T22, typename T23, typename T24>
316struct Types24 {
317  typedef T1 Head;
318  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
319      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
320};
321
322template <typename T1, typename T2, typename T3, typename T4, typename T5,
323    typename T6, typename T7, typename T8, typename T9, typename T10,
324    typename T11, typename T12, typename T13, typename T14, typename T15,
325    typename T16, typename T17, typename T18, typename T19, typename T20,
326    typename T21, typename T22, typename T23, typename T24, typename T25>
327struct Types25 {
328  typedef T1 Head;
329  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
330      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
331};
332
333template <typename T1, typename T2, typename T3, typename T4, typename T5,
334    typename T6, typename T7, typename T8, typename T9, typename T10,
335    typename T11, typename T12, typename T13, typename T14, typename T15,
336    typename T16, typename T17, typename T18, typename T19, typename T20,
337    typename T21, typename T22, typename T23, typename T24, typename T25,
338    typename T26>
339struct Types26 {
340  typedef T1 Head;
341  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
342      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
343};
344
345template <typename T1, typename T2, typename T3, typename T4, typename T5,
346    typename T6, typename T7, typename T8, typename T9, typename T10,
347    typename T11, typename T12, typename T13, typename T14, typename T15,
348    typename T16, typename T17, typename T18, typename T19, typename T20,
349    typename T21, typename T22, typename T23, typename T24, typename T25,
350    typename T26, typename T27>
351struct Types27 {
352  typedef T1 Head;
353  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
354      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
355};
356
357template <typename T1, typename T2, typename T3, typename T4, typename T5,
358    typename T6, typename T7, typename T8, typename T9, typename T10,
359    typename T11, typename T12, typename T13, typename T14, typename T15,
360    typename T16, typename T17, typename T18, typename T19, typename T20,
361    typename T21, typename T22, typename T23, typename T24, typename T25,
362    typename T26, typename T27, typename T28>
363struct Types28 {
364  typedef T1 Head;
365  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
366      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
367};
368
369template <typename T1, typename T2, typename T3, typename T4, typename T5,
370    typename T6, typename T7, typename T8, typename T9, typename T10,
371    typename T11, typename T12, typename T13, typename T14, typename T15,
372    typename T16, typename T17, typename T18, typename T19, typename T20,
373    typename T21, typename T22, typename T23, typename T24, typename T25,
374    typename T26, typename T27, typename T28, typename T29>
375struct Types29 {
376  typedef T1 Head;
377  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
378      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
379      T29> Tail;
380};
381
382template <typename T1, typename T2, typename T3, typename T4, typename T5,
383    typename T6, typename T7, typename T8, typename T9, typename T10,
384    typename T11, typename T12, typename T13, typename T14, typename T15,
385    typename T16, typename T17, typename T18, typename T19, typename T20,
386    typename T21, typename T22, typename T23, typename T24, typename T25,
387    typename T26, typename T27, typename T28, typename T29, typename T30>
388struct Types30 {
389  typedef T1 Head;
390  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
391      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
392      T30> Tail;
393};
394
395template <typename T1, typename T2, typename T3, typename T4, typename T5,
396    typename T6, typename T7, typename T8, typename T9, typename T10,
397    typename T11, typename T12, typename T13, typename T14, typename T15,
398    typename T16, typename T17, typename T18, typename T19, typename T20,
399    typename T21, typename T22, typename T23, typename T24, typename T25,
400    typename T26, typename T27, typename T28, typename T29, typename T30,
401    typename T31>
402struct Types31 {
403  typedef T1 Head;
404  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
405      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
406      T30, T31> Tail;
407};
408
409template <typename T1, typename T2, typename T3, typename T4, typename T5,
410    typename T6, typename T7, typename T8, typename T9, typename T10,
411    typename T11, typename T12, typename T13, typename T14, typename T15,
412    typename T16, typename T17, typename T18, typename T19, typename T20,
413    typename T21, typename T22, typename T23, typename T24, typename T25,
414    typename T26, typename T27, typename T28, typename T29, typename T30,
415    typename T31, typename T32>
416struct Types32 {
417  typedef T1 Head;
418  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
419      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
420      T30, T31, T32> Tail;
421};
422
423template <typename T1, typename T2, typename T3, typename T4, typename T5,
424    typename T6, typename T7, typename T8, typename T9, typename T10,
425    typename T11, typename T12, typename T13, typename T14, typename T15,
426    typename T16, typename T17, typename T18, typename T19, typename T20,
427    typename T21, typename T22, typename T23, typename T24, typename T25,
428    typename T26, typename T27, typename T28, typename T29, typename T30,
429    typename T31, typename T32, typename T33>
430struct Types33 {
431  typedef T1 Head;
432  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
433      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
434      T30, T31, T32, T33> Tail;
435};
436
437template <typename T1, typename T2, typename T3, typename T4, typename T5,
438    typename T6, typename T7, typename T8, typename T9, typename T10,
439    typename T11, typename T12, typename T13, typename T14, typename T15,
440    typename T16, typename T17, typename T18, typename T19, typename T20,
441    typename T21, typename T22, typename T23, typename T24, typename T25,
442    typename T26, typename T27, typename T28, typename T29, typename T30,
443    typename T31, typename T32, typename T33, typename T34>
444struct Types34 {
445  typedef T1 Head;
446  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
447      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
448      T30, T31, T32, T33, T34> Tail;
449};
450
451template <typename T1, typename T2, typename T3, typename T4, typename T5,
452    typename T6, typename T7, typename T8, typename T9, typename T10,
453    typename T11, typename T12, typename T13, typename T14, typename T15,
454    typename T16, typename T17, typename T18, typename T19, typename T20,
455    typename T21, typename T22, typename T23, typename T24, typename T25,
456    typename T26, typename T27, typename T28, typename T29, typename T30,
457    typename T31, typename T32, typename T33, typename T34, typename T35>
458struct Types35 {
459  typedef T1 Head;
460  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
461      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
462      T30, T31, T32, T33, T34, T35> Tail;
463};
464
465template <typename T1, typename T2, typename T3, typename T4, typename T5,
466    typename T6, typename T7, typename T8, typename T9, typename T10,
467    typename T11, typename T12, typename T13, typename T14, typename T15,
468    typename T16, typename T17, typename T18, typename T19, typename T20,
469    typename T21, typename T22, typename T23, typename T24, typename T25,
470    typename T26, typename T27, typename T28, typename T29, typename T30,
471    typename T31, typename T32, typename T33, typename T34, typename T35,
472    typename T36>
473struct Types36 {
474  typedef T1 Head;
475  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
476      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
477      T30, T31, T32, T33, T34, T35, T36> Tail;
478};
479
480template <typename T1, typename T2, typename T3, typename T4, typename T5,
481    typename T6, typename T7, typename T8, typename T9, typename T10,
482    typename T11, typename T12, typename T13, typename T14, typename T15,
483    typename T16, typename T17, typename T18, typename T19, typename T20,
484    typename T21, typename T22, typename T23, typename T24, typename T25,
485    typename T26, typename T27, typename T28, typename T29, typename T30,
486    typename T31, typename T32, typename T33, typename T34, typename T35,
487    typename T36, typename T37>
488struct Types37 {
489  typedef T1 Head;
490  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
491      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
492      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
493};
494
495template <typename T1, typename T2, typename T3, typename T4, typename T5,
496    typename T6, typename T7, typename T8, typename T9, typename T10,
497    typename T11, typename T12, typename T13, typename T14, typename T15,
498    typename T16, typename T17, typename T18, typename T19, typename T20,
499    typename T21, typename T22, typename T23, typename T24, typename T25,
500    typename T26, typename T27, typename T28, typename T29, typename T30,
501    typename T31, typename T32, typename T33, typename T34, typename T35,
502    typename T36, typename T37, typename T38>
503struct Types38 {
504  typedef T1 Head;
505  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
506      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
507      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
508};
509
510template <typename T1, typename T2, typename T3, typename T4, typename T5,
511    typename T6, typename T7, typename T8, typename T9, typename T10,
512    typename T11, typename T12, typename T13, typename T14, typename T15,
513    typename T16, typename T17, typename T18, typename T19, typename T20,
514    typename T21, typename T22, typename T23, typename T24, typename T25,
515    typename T26, typename T27, typename T28, typename T29, typename T30,
516    typename T31, typename T32, typename T33, typename T34, typename T35,
517    typename T36, typename T37, typename T38, typename T39>
518struct Types39 {
519  typedef T1 Head;
520  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
521      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
522      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
523};
524
525template <typename T1, typename T2, typename T3, typename T4, typename T5,
526    typename T6, typename T7, typename T8, typename T9, typename T10,
527    typename T11, typename T12, typename T13, typename T14, typename T15,
528    typename T16, typename T17, typename T18, typename T19, typename T20,
529    typename T21, typename T22, typename T23, typename T24, typename T25,
530    typename T26, typename T27, typename T28, typename T29, typename T30,
531    typename T31, typename T32, typename T33, typename T34, typename T35,
532    typename T36, typename T37, typename T38, typename T39, typename T40>
533struct Types40 {
534  typedef T1 Head;
535  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
536      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
537      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
538};
539
540template <typename T1, typename T2, typename T3, typename T4, typename T5,
541    typename T6, typename T7, typename T8, typename T9, typename T10,
542    typename T11, typename T12, typename T13, typename T14, typename T15,
543    typename T16, typename T17, typename T18, typename T19, typename T20,
544    typename T21, typename T22, typename T23, typename T24, typename T25,
545    typename T26, typename T27, typename T28, typename T29, typename T30,
546    typename T31, typename T32, typename T33, typename T34, typename T35,
547    typename T36, typename T37, typename T38, typename T39, typename T40,
548    typename T41>
549struct Types41 {
550  typedef T1 Head;
551  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
552      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
553      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
554};
555
556template <typename T1, typename T2, typename T3, typename T4, typename T5,
557    typename T6, typename T7, typename T8, typename T9, typename T10,
558    typename T11, typename T12, typename T13, typename T14, typename T15,
559    typename T16, typename T17, typename T18, typename T19, typename T20,
560    typename T21, typename T22, typename T23, typename T24, typename T25,
561    typename T26, typename T27, typename T28, typename T29, typename T30,
562    typename T31, typename T32, typename T33, typename T34, typename T35,
563    typename T36, typename T37, typename T38, typename T39, typename T40,
564    typename T41, typename T42>
565struct Types42 {
566  typedef T1 Head;
567  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
568      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
569      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
570};
571
572template <typename T1, typename T2, typename T3, typename T4, typename T5,
573    typename T6, typename T7, typename T8, typename T9, typename T10,
574    typename T11, typename T12, typename T13, typename T14, typename T15,
575    typename T16, typename T17, typename T18, typename T19, typename T20,
576    typename T21, typename T22, typename T23, typename T24, typename T25,
577    typename T26, typename T27, typename T28, typename T29, typename T30,
578    typename T31, typename T32, typename T33, typename T34, typename T35,
579    typename T36, typename T37, typename T38, typename T39, typename T40,
580    typename T41, typename T42, typename T43>
581struct Types43 {
582  typedef T1 Head;
583  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
584      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
585      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
586      T43> Tail;
587};
588
589template <typename T1, typename T2, typename T3, typename T4, typename T5,
590    typename T6, typename T7, typename T8, typename T9, typename T10,
591    typename T11, typename T12, typename T13, typename T14, typename T15,
592    typename T16, typename T17, typename T18, typename T19, typename T20,
593    typename T21, typename T22, typename T23, typename T24, typename T25,
594    typename T26, typename T27, typename T28, typename T29, typename T30,
595    typename T31, typename T32, typename T33, typename T34, typename T35,
596    typename T36, typename T37, typename T38, typename T39, typename T40,
597    typename T41, typename T42, typename T43, typename T44>
598struct Types44 {
599  typedef T1 Head;
600  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
601      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
602      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
603      T44> Tail;
604};
605
606template <typename T1, typename T2, typename T3, typename T4, typename T5,
607    typename T6, typename T7, typename T8, typename T9, typename T10,
608    typename T11, typename T12, typename T13, typename T14, typename T15,
609    typename T16, typename T17, typename T18, typename T19, typename T20,
610    typename T21, typename T22, typename T23, typename T24, typename T25,
611    typename T26, typename T27, typename T28, typename T29, typename T30,
612    typename T31, typename T32, typename T33, typename T34, typename T35,
613    typename T36, typename T37, typename T38, typename T39, typename T40,
614    typename T41, typename T42, typename T43, typename T44, typename T45>
615struct Types45 {
616  typedef T1 Head;
617  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
618      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
619      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
620      T44, T45> Tail;
621};
622
623template <typename T1, typename T2, typename T3, typename T4, typename T5,
624    typename T6, typename T7, typename T8, typename T9, typename T10,
625    typename T11, typename T12, typename T13, typename T14, typename T15,
626    typename T16, typename T17, typename T18, typename T19, typename T20,
627    typename T21, typename T22, typename T23, typename T24, typename T25,
628    typename T26, typename T27, typename T28, typename T29, typename T30,
629    typename T31, typename T32, typename T33, typename T34, typename T35,
630    typename T36, typename T37, typename T38, typename T39, typename T40,
631    typename T41, typename T42, typename T43, typename T44, typename T45,
632    typename T46>
633struct Types46 {
634  typedef T1 Head;
635  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
636      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
637      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
638      T44, T45, T46> Tail;
639};
640
641template <typename T1, typename T2, typename T3, typename T4, typename T5,
642    typename T6, typename T7, typename T8, typename T9, typename T10,
643    typename T11, typename T12, typename T13, typename T14, typename T15,
644    typename T16, typename T17, typename T18, typename T19, typename T20,
645    typename T21, typename T22, typename T23, typename T24, typename T25,
646    typename T26, typename T27, typename T28, typename T29, typename T30,
647    typename T31, typename T32, typename T33, typename T34, typename T35,
648    typename T36, typename T37, typename T38, typename T39, typename T40,
649    typename T41, typename T42, typename T43, typename T44, typename T45,
650    typename T46, typename T47>
651struct Types47 {
652  typedef T1 Head;
653  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
654      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
655      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
656      T44, T45, T46, T47> Tail;
657};
658
659template <typename T1, typename T2, typename T3, typename T4, typename T5,
660    typename T6, typename T7, typename T8, typename T9, typename T10,
661    typename T11, typename T12, typename T13, typename T14, typename T15,
662    typename T16, typename T17, typename T18, typename T19, typename T20,
663    typename T21, typename T22, typename T23, typename T24, typename T25,
664    typename T26, typename T27, typename T28, typename T29, typename T30,
665    typename T31, typename T32, typename T33, typename T34, typename T35,
666    typename T36, typename T37, typename T38, typename T39, typename T40,
667    typename T41, typename T42, typename T43, typename T44, typename T45,
668    typename T46, typename T47, typename T48>
669struct Types48 {
670  typedef T1 Head;
671  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
672      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
673      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
674      T44, T45, T46, T47, T48> Tail;
675};
676
677template <typename T1, typename T2, typename T3, typename T4, typename T5,
678    typename T6, typename T7, typename T8, typename T9, typename T10,
679    typename T11, typename T12, typename T13, typename T14, typename T15,
680    typename T16, typename T17, typename T18, typename T19, typename T20,
681    typename T21, typename T22, typename T23, typename T24, typename T25,
682    typename T26, typename T27, typename T28, typename T29, typename T30,
683    typename T31, typename T32, typename T33, typename T34, typename T35,
684    typename T36, typename T37, typename T38, typename T39, typename T40,
685    typename T41, typename T42, typename T43, typename T44, typename T45,
686    typename T46, typename T47, typename T48, typename T49>
687struct Types49 {
688  typedef T1 Head;
689  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
690      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
691      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
692      T44, T45, T46, T47, T48, T49> Tail;
693};
694
695template <typename T1, typename T2, typename T3, typename T4, typename T5,
696    typename T6, typename T7, typename T8, typename T9, typename T10,
697    typename T11, typename T12, typename T13, typename T14, typename T15,
698    typename T16, typename T17, typename T18, typename T19, typename T20,
699    typename T21, typename T22, typename T23, typename T24, typename T25,
700    typename T26, typename T27, typename T28, typename T29, typename T30,
701    typename T31, typename T32, typename T33, typename T34, typename T35,
702    typename T36, typename T37, typename T38, typename T39, typename T40,
703    typename T41, typename T42, typename T43, typename T44, typename T45,
704    typename T46, typename T47, typename T48, typename T49, typename T50>
705struct Types50 {
706  typedef T1 Head;
707  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
708      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
709      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
710      T44, T45, T46, T47, T48, T49, T50> Tail;
711};
712
713
714}  // namespace internal
715
716// We don't want to require the users to write TypesN<...> directly,
717// as that would require them to count the length.  Types<...> is much
718// easier to write, but generates horrible messages when there is a
719// compiler error, as gcc insists on printing out each template
720// argument, even if it has the default value (this means Types<int>
721// will appear as Types<int, None, None, ..., None> in the compiler
722// errors).
723//
724// Our solution is to combine the best part of the two approaches: a
725// user would write Types<T1, ..., TN>, and Google Test will translate
726// that to TypesN<T1, ..., TN> internally to make error messages
727// readable.  The translation is done by the 'type' member of the
728// Types template.
729template <typename T1 = internal::None, typename T2 = internal::None,
730    typename T3 = internal::None, typename T4 = internal::None,
731    typename T5 = internal::None, typename T6 = internal::None,
732    typename T7 = internal::None, typename T8 = internal::None,
733    typename T9 = internal::None, typename T10 = internal::None,
734    typename T11 = internal::None, typename T12 = internal::None,
735    typename T13 = internal::None, typename T14 = internal::None,
736    typename T15 = internal::None, typename T16 = internal::None,
737    typename T17 = internal::None, typename T18 = internal::None,
738    typename T19 = internal::None, typename T20 = internal::None,
739    typename T21 = internal::None, typename T22 = internal::None,
740    typename T23 = internal::None, typename T24 = internal::None,
741    typename T25 = internal::None, typename T26 = internal::None,
742    typename T27 = internal::None, typename T28 = internal::None,
743    typename T29 = internal::None, typename T30 = internal::None,
744    typename T31 = internal::None, typename T32 = internal::None,
745    typename T33 = internal::None, typename T34 = internal::None,
746    typename T35 = internal::None, typename T36 = internal::None,
747    typename T37 = internal::None, typename T38 = internal::None,
748    typename T39 = internal::None, typename T40 = internal::None,
749    typename T41 = internal::None, typename T42 = internal::None,
750    typename T43 = internal::None, typename T44 = internal::None,
751    typename T45 = internal::None, typename T46 = internal::None,
752    typename T47 = internal::None, typename T48 = internal::None,
753    typename T49 = internal::None, typename T50 = internal::None>
754struct Types {
755  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
756      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
757      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
758      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
759};
760
761template <>
762struct Types<internal::None, internal::None, internal::None, internal::None,
763    internal::None, internal::None, internal::None, internal::None,
764    internal::None, internal::None, internal::None, internal::None,
765    internal::None, internal::None, internal::None, internal::None,
766    internal::None, internal::None, internal::None, internal::None,
767    internal::None, internal::None, internal::None, internal::None,
768    internal::None, internal::None, internal::None, internal::None,
769    internal::None, internal::None, internal::None, internal::None,
770    internal::None, internal::None, internal::None, internal::None,
771    internal::None, internal::None, internal::None, internal::None,
772    internal::None, internal::None, internal::None, internal::None,
773    internal::None, internal::None, internal::None, internal::None,
774    internal::None, internal::None> {
775  typedef internal::Types0 type;
776};
777template <typename T1>
778struct Types<T1, internal::None, internal::None, internal::None,
779    internal::None, internal::None, internal::None, internal::None,
780    internal::None, internal::None, internal::None, internal::None,
781    internal::None, internal::None, internal::None, internal::None,
782    internal::None, internal::None, internal::None, internal::None,
783    internal::None, internal::None, internal::None, internal::None,
784    internal::None, internal::None, internal::None, internal::None,
785    internal::None, internal::None, internal::None, internal::None,
786    internal::None, internal::None, internal::None, internal::None,
787    internal::None, internal::None, internal::None, internal::None,
788    internal::None, internal::None, internal::None, internal::None,
789    internal::None, internal::None, internal::None, internal::None,
790    internal::None, internal::None> {
791  typedef internal::Types1<T1> type;
792};
793template <typename T1, typename T2>
794struct Types<T1, T2, internal::None, internal::None, internal::None,
795    internal::None, internal::None, internal::None, internal::None,
796    internal::None, internal::None, internal::None, internal::None,
797    internal::None, internal::None, internal::None, internal::None,
798    internal::None, internal::None, internal::None, internal::None,
799    internal::None, internal::None, internal::None, internal::None,
800    internal::None, internal::None, internal::None, internal::None,
801    internal::None, internal::None, internal::None, internal::None,
802    internal::None, internal::None, internal::None, internal::None,
803    internal::None, internal::None, internal::None, internal::None,
804    internal::None, internal::None, internal::None, internal::None,
805    internal::None, internal::None, internal::None, internal::None,
806    internal::None> {
807  typedef internal::Types2<T1, T2> type;
808};
809template <typename T1, typename T2, typename T3>
810struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
811    internal::None, internal::None, internal::None, internal::None,
812    internal::None, internal::None, internal::None, internal::None,
813    internal::None, internal::None, internal::None, internal::None,
814    internal::None, internal::None, internal::None, internal::None,
815    internal::None, internal::None, internal::None, internal::None,
816    internal::None, internal::None, internal::None, internal::None,
817    internal::None, internal::None, internal::None, internal::None,
818    internal::None, internal::None, internal::None, internal::None,
819    internal::None, internal::None, internal::None, internal::None,
820    internal::None, internal::None, internal::None, internal::None,
821    internal::None, internal::None, internal::None, internal::None> {
822  typedef internal::Types3<T1, T2, T3> type;
823};
824template <typename T1, typename T2, typename T3, typename T4>
825struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
826    internal::None, internal::None, internal::None, internal::None,
827    internal::None, internal::None, internal::None, internal::None,
828    internal::None, internal::None, internal::None, internal::None,
829    internal::None, internal::None, internal::None, internal::None,
830    internal::None, internal::None, internal::None, internal::None,
831    internal::None, internal::None, internal::None, internal::None,
832    internal::None, internal::None, internal::None, internal::None,
833    internal::None, internal::None, internal::None, internal::None,
834    internal::None, internal::None, internal::None, internal::None,
835    internal::None, internal::None, internal::None, internal::None,
836    internal::None, internal::None, internal::None> {
837  typedef internal::Types4<T1, T2, T3, T4> type;
838};
839template <typename T1, typename T2, typename T3, typename T4, typename T5>
840struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
841    internal::None, internal::None, internal::None, internal::None,
842    internal::None, internal::None, internal::None, internal::None,
843    internal::None, internal::None, internal::None, internal::None,
844    internal::None, internal::None, internal::None, internal::None,
845    internal::None, internal::None, internal::None, internal::None,
846    internal::None, internal::None, internal::None, internal::None,
847    internal::None, internal::None, internal::None, internal::None,
848    internal::None, internal::None, internal::None, internal::None,
849    internal::None, internal::None, internal::None, internal::None,
850    internal::None, internal::None, internal::None, internal::None,
851    internal::None, internal::None, internal::None> {
852  typedef internal::Types5<T1, T2, T3, T4, T5> type;
853};
854template <typename T1, typename T2, typename T3, typename T4, typename T5,
855    typename T6>
856struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
857    internal::None, internal::None, internal::None, internal::None,
858    internal::None, internal::None, internal::None, internal::None,
859    internal::None, internal::None, internal::None, internal::None,
860    internal::None, internal::None, internal::None, internal::None,
861    internal::None, internal::None, internal::None, internal::None,
862    internal::None, internal::None, internal::None, internal::None,
863    internal::None, internal::None, internal::None, internal::None,
864    internal::None, internal::None, internal::None, internal::None,
865    internal::None, internal::None, internal::None, internal::None,
866    internal::None, internal::None, internal::None, internal::None,
867    internal::None, internal::None> {
868  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
869};
870template <typename T1, typename T2, typename T3, typename T4, typename T5,
871    typename T6, typename T7>
872struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
873    internal::None, internal::None, internal::None, internal::None,
874    internal::None, internal::None, internal::None, internal::None,
875    internal::None, internal::None, internal::None, internal::None,
876    internal::None, internal::None, internal::None, internal::None,
877    internal::None, internal::None, internal::None, internal::None,
878    internal::None, internal::None, internal::None, internal::None,
879    internal::None, internal::None, internal::None, internal::None,
880    internal::None, internal::None, internal::None, internal::None,
881    internal::None, internal::None, internal::None, internal::None,
882    internal::None, internal::None, internal::None, internal::None,
883    internal::None> {
884  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
885};
886template <typename T1, typename T2, typename T3, typename T4, typename T5,
887    typename T6, typename T7, typename T8>
888struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
889    internal::None, internal::None, internal::None, internal::None,
890    internal::None, internal::None, internal::None, internal::None,
891    internal::None, internal::None, internal::None, internal::None,
892    internal::None, internal::None, internal::None, internal::None,
893    internal::None, internal::None, internal::None, internal::None,
894    internal::None, internal::None, internal::None, internal::None,
895    internal::None, internal::None, internal::None, internal::None,
896    internal::None, internal::None, internal::None, internal::None,
897    internal::None, internal::None, internal::None, internal::None,
898    internal::None, internal::None, internal::None, internal::None> {
899  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
900};
901template <typename T1, typename T2, typename T3, typename T4, typename T5,
902    typename T6, typename T7, typename T8, typename T9>
903struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
904    internal::None, internal::None, internal::None, internal::None,
905    internal::None, internal::None, internal::None, internal::None,
906    internal::None, internal::None, internal::None, internal::None,
907    internal::None, internal::None, internal::None, internal::None,
908    internal::None, internal::None, internal::None, internal::None,
909    internal::None, internal::None, internal::None, internal::None,
910    internal::None, internal::None, internal::None, internal::None,
911    internal::None, internal::None, internal::None, internal::None,
912    internal::None, internal::None, internal::None, internal::None,
913    internal::None, internal::None, internal::None, internal::None> {
914  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
915};
916template <typename T1, typename T2, typename T3, typename T4, typename T5,
917    typename T6, typename T7, typename T8, typename T9, typename T10>
918struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
919    internal::None, internal::None, internal::None, internal::None,
920    internal::None, internal::None, internal::None, internal::None,
921    internal::None, internal::None, internal::None, internal::None,
922    internal::None, internal::None, internal::None, internal::None,
923    internal::None, internal::None, internal::None, internal::None,
924    internal::None, internal::None, internal::None, internal::None,
925    internal::None, internal::None, internal::None, internal::None,
926    internal::None, internal::None, internal::None, internal::None,
927    internal::None, internal::None, internal::None, internal::None,
928    internal::None, internal::None, internal::None> {
929  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
930};
931template <typename T1, typename T2, typename T3, typename T4, typename T5,
932    typename T6, typename T7, typename T8, typename T9, typename T10,
933    typename T11>
934struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
935    internal::None, internal::None, internal::None, internal::None,
936    internal::None, internal::None, internal::None, internal::None,
937    internal::None, internal::None, internal::None, internal::None,
938    internal::None, internal::None, internal::None, internal::None,
939    internal::None, internal::None, internal::None, internal::None,
940    internal::None, internal::None, internal::None, internal::None,
941    internal::None, internal::None, internal::None, internal::None,
942    internal::None, internal::None, internal::None, internal::None,
943    internal::None, internal::None, internal::None, internal::None,
944    internal::None, internal::None> {
945  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
946};
947template <typename T1, typename T2, typename T3, typename T4, typename T5,
948    typename T6, typename T7, typename T8, typename T9, typename T10,
949    typename T11, typename T12>
950struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
951    internal::None, internal::None, internal::None, internal::None,
952    internal::None, internal::None, internal::None, internal::None,
953    internal::None, internal::None, internal::None, internal::None,
954    internal::None, internal::None, internal::None, internal::None,
955    internal::None, internal::None, internal::None, internal::None,
956    internal::None, internal::None, internal::None, internal::None,
957    internal::None, internal::None, internal::None, internal::None,
958    internal::None, internal::None, internal::None, internal::None,
959    internal::None, internal::None, internal::None, internal::None,
960    internal::None> {
961  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
962      T12> type;
963};
964template <typename T1, typename T2, typename T3, typename T4, typename T5,
965    typename T6, typename T7, typename T8, typename T9, typename T10,
966    typename T11, typename T12, typename T13>
967struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
968    internal::None, internal::None, internal::None, internal::None,
969    internal::None, internal::None, internal::None, internal::None,
970    internal::None, internal::None, internal::None, internal::None,
971    internal::None, internal::None, internal::None, internal::None,
972    internal::None, internal::None, internal::None, internal::None,
973    internal::None, internal::None, internal::None, internal::None,
974    internal::None, internal::None, internal::None, internal::None,
975    internal::None, internal::None, internal::None, internal::None,
976    internal::None, internal::None, internal::None, internal::None,
977    internal::None> {
978  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
979      T13> type;
980};
981template <typename T1, typename T2, typename T3, typename T4, typename T5,
982    typename T6, typename T7, typename T8, typename T9, typename T10,
983    typename T11, typename T12, typename T13, typename T14>
984struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
985    internal::None, internal::None, internal::None, internal::None,
986    internal::None, internal::None, internal::None, internal::None,
987    internal::None, internal::None, internal::None, internal::None,
988    internal::None, internal::None, internal::None, internal::None,
989    internal::None, internal::None, internal::None, internal::None,
990    internal::None, internal::None, internal::None, internal::None,
991    internal::None, internal::None, internal::None, internal::None,
992    internal::None, internal::None, internal::None, internal::None,
993    internal::None, internal::None, internal::None, internal::None> {
994  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
995      T13, T14> type;
996};
997template <typename T1, typename T2, typename T3, typename T4, typename T5,
998    typename T6, typename T7, typename T8, typename T9, typename T10,
999    typename T11, typename T12, typename T13, typename T14, typename T15>
1000struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1001    internal::None, internal::None, internal::None, internal::None,
1002    internal::None, internal::None, internal::None, internal::None,
1003    internal::None, internal::None, internal::None, internal::None,
1004    internal::None, internal::None, internal::None, internal::None,
1005    internal::None, internal::None, internal::None, internal::None,
1006    internal::None, internal::None, internal::None, internal::None,
1007    internal::None, internal::None, internal::None, internal::None,
1008    internal::None, internal::None, internal::None, internal::None,
1009    internal::None, internal::None, internal::None> {
1010  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1011      T13, T14, T15> type;
1012};
1013template <typename T1, typename T2, typename T3, typename T4, typename T5,
1014    typename T6, typename T7, typename T8, typename T9, typename T10,
1015    typename T11, typename T12, typename T13, typename T14, typename T15,
1016    typename T16>
1017struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1018    T16, internal::None, internal::None, internal::None, internal::None,
1019    internal::None, internal::None, internal::None, internal::None,
1020    internal::None, internal::None, internal::None, internal::None,
1021    internal::None, internal::None, internal::None, internal::None,
1022    internal::None, internal::None, internal::None, internal::None,
1023    internal::None, internal::None, internal::None, internal::None,
1024    internal::None, internal::None, internal::None, internal::None,
1025    internal::None, internal::None, internal::None, internal::None,
1026    internal::None, internal::None> {
1027  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1028      T13, T14, T15, T16> type;
1029};
1030template <typename T1, typename T2, typename T3, typename T4, typename T5,
1031    typename T6, typename T7, typename T8, typename T9, typename T10,
1032    typename T11, typename T12, typename T13, typename T14, typename T15,
1033    typename T16, typename T17>
1034struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1035    T16, T17, internal::None, internal::None, internal::None, internal::None,
1036    internal::None, internal::None, internal::None, internal::None,
1037    internal::None, internal::None, internal::None, internal::None,
1038    internal::None, internal::None, internal::None, internal::None,
1039    internal::None, internal::None, internal::None, internal::None,
1040    internal::None, internal::None, internal::None, internal::None,
1041    internal::None, internal::None, internal::None, internal::None,
1042    internal::None, internal::None, internal::None, internal::None,
1043    internal::None> {
1044  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1045      T13, T14, T15, T16, T17> type;
1046};
1047template <typename T1, typename T2, typename T3, typename T4, typename T5,
1048    typename T6, typename T7, typename T8, typename T9, typename T10,
1049    typename T11, typename T12, typename T13, typename T14, typename T15,
1050    typename T16, typename T17, typename T18>
1051struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1052    T16, T17, T18, internal::None, internal::None, internal::None,
1053    internal::None, internal::None, internal::None, internal::None,
1054    internal::None, internal::None, internal::None, internal::None,
1055    internal::None, internal::None, internal::None, internal::None,
1056    internal::None, internal::None, internal::None, internal::None,
1057    internal::None, internal::None, internal::None, internal::None,
1058    internal::None, internal::None, internal::None, internal::None,
1059    internal::None, internal::None, internal::None, internal::None,
1060    internal::None> {
1061  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1062      T13, T14, T15, T16, T17, T18> type;
1063};
1064template <typename T1, typename T2, typename T3, typename T4, typename T5,
1065    typename T6, typename T7, typename T8, typename T9, typename T10,
1066    typename T11, typename T12, typename T13, typename T14, typename T15,
1067    typename T16, typename T17, typename T18, typename T19>
1068struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1069    T16, T17, T18, T19, internal::None, internal::None, internal::None,
1070    internal::None, internal::None, internal::None, internal::None,
1071    internal::None, internal::None, internal::None, internal::None,
1072    internal::None, internal::None, internal::None, internal::None,
1073    internal::None, internal::None, internal::None, internal::None,
1074    internal::None, internal::None, internal::None, internal::None,
1075    internal::None, internal::None, internal::None, internal::None,
1076    internal::None, internal::None, internal::None, internal::None> {
1077  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1078      T13, T14, T15, T16, T17, T18, T19> type;
1079};
1080template <typename T1, typename T2, typename T3, typename T4, typename T5,
1081    typename T6, typename T7, typename T8, typename T9, typename T10,
1082    typename T11, typename T12, typename T13, typename T14, typename T15,
1083    typename T16, typename T17, typename T18, typename T19, typename T20>
1084struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1085    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
1086    internal::None, internal::None, internal::None, internal::None,
1087    internal::None, internal::None, internal::None, internal::None,
1088    internal::None, internal::None, internal::None, internal::None,
1089    internal::None, internal::None, internal::None, internal::None,
1090    internal::None, internal::None, internal::None, internal::None,
1091    internal::None, internal::None, internal::None, internal::None,
1092    internal::None, internal::None, internal::None> {
1093  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1094      T13, T14, T15, T16, T17, T18, T19, T20> type;
1095};
1096template <typename T1, typename T2, typename T3, typename T4, typename T5,
1097    typename T6, typename T7, typename T8, typename T9, typename T10,
1098    typename T11, typename T12, typename T13, typename T14, typename T15,
1099    typename T16, typename T17, typename T18, typename T19, typename T20,
1100    typename T21>
1101struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1102    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
1103    internal::None, internal::None, internal::None, internal::None,
1104    internal::None, internal::None, internal::None, internal::None,
1105    internal::None, internal::None, internal::None, internal::None,
1106    internal::None, internal::None, internal::None, internal::None,
1107    internal::None, internal::None, internal::None, internal::None,
1108    internal::None, internal::None, internal::None, internal::None,
1109    internal::None, internal::None, internal::None> {
1110  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1111      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
1112};
1113template <typename T1, typename T2, typename T3, typename T4, typename T5,
1114    typename T6, typename T7, typename T8, typename T9, typename T10,
1115    typename T11, typename T12, typename T13, typename T14, typename T15,
1116    typename T16, typename T17, typename T18, typename T19, typename T20,
1117    typename T21, typename T22>
1118struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1119    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
1120    internal::None, internal::None, internal::None, internal::None,
1121    internal::None, internal::None, internal::None, internal::None,
1122    internal::None, internal::None, internal::None, internal::None,
1123    internal::None, internal::None, internal::None, internal::None,
1124    internal::None, internal::None, internal::None, internal::None,
1125    internal::None, internal::None, internal::None, internal::None,
1126    internal::None, internal::None> {
1127  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1128      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
1129};
1130template <typename T1, typename T2, typename T3, typename T4, typename T5,
1131    typename T6, typename T7, typename T8, typename T9, typename T10,
1132    typename T11, typename T12, typename T13, typename T14, typename T15,
1133    typename T16, typename T17, typename T18, typename T19, typename T20,
1134    typename T21, typename T22, typename T23>
1135struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1136    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
1137    internal::None, internal::None, internal::None, internal::None,
1138    internal::None, internal::None, internal::None, internal::None,
1139    internal::None, internal::None, internal::None, internal::None,
1140    internal::None, internal::None, internal::None, internal::None,
1141    internal::None, internal::None, internal::None, internal::None,
1142    internal::None, internal::None, internal::None, internal::None,
1143    internal::None> {
1144  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1145      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
1146};
1147template <typename T1, typename T2, typename T3, typename T4, typename T5,
1148    typename T6, typename T7, typename T8, typename T9, typename T10,
1149    typename T11, typename T12, typename T13, typename T14, typename T15,
1150    typename T16, typename T17, typename T18, typename T19, typename T20,
1151    typename T21, typename T22, typename T23, typename T24>
1152struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1153    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
1154    internal::None, internal::None, internal::None, internal::None,
1155    internal::None, internal::None, internal::None, internal::None,
1156    internal::None, internal::None, internal::None, internal::None,
1157    internal::None, internal::None, internal::None, internal::None,
1158    internal::None, internal::None, internal::None, internal::None,
1159    internal::None, internal::None, internal::None, internal::None,
1160    internal::None> {
1161  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1162      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
1163};
1164template <typename T1, typename T2, typename T3, typename T4, typename T5,
1165    typename T6, typename T7, typename T8, typename T9, typename T10,
1166    typename T11, typename T12, typename T13, typename T14, typename T15,
1167    typename T16, typename T17, typename T18, typename T19, typename T20,
1168    typename T21, typename T22, typename T23, typename T24, typename T25>
1169struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1170    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
1171    internal::None, internal::None, internal::None, internal::None,
1172    internal::None, internal::None, internal::None, internal::None,
1173    internal::None, internal::None, internal::None, internal::None,
1174    internal::None, internal::None, internal::None, internal::None,
1175    internal::None, internal::None, internal::None, internal::None,
1176    internal::None, internal::None, internal::None, internal::None> {
1177  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1178      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
1179};
1180template <typename T1, typename T2, typename T3, typename T4, typename T5,
1181    typename T6, typename T7, typename T8, typename T9, typename T10,
1182    typename T11, typename T12, typename T13, typename T14, typename T15,
1183    typename T16, typename T17, typename T18, typename T19, typename T20,
1184    typename T21, typename T22, typename T23, typename T24, typename T25,
1185    typename T26>
1186struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1187    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
1188    internal::None, internal::None, internal::None, internal::None,
1189    internal::None, internal::None, internal::None, internal::None,
1190    internal::None, internal::None, internal::None, internal::None,
1191    internal::None, internal::None, internal::None, internal::None,
1192    internal::None, internal::None, internal::None, internal::None,
1193    internal::None, internal::None, internal::None> {
1194  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1195      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
1196      T26> type;
1197};
1198template <typename T1, typename T2, typename T3, typename T4, typename T5,
1199    typename T6, typename T7, typename T8, typename T9, typename T10,
1200    typename T11, typename T12, typename T13, typename T14, typename T15,
1201    typename T16, typename T17, typename T18, typename T19, typename T20,
1202    typename T21, typename T22, typename T23, typename T24, typename T25,
1203    typename T26, typename T27>
1204struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1205    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
1206    internal::None, internal::None, internal::None, internal::None,
1207    internal::None, internal::None, internal::None, internal::None,
1208    internal::None, internal::None, internal::None, internal::None,
1209    internal::None, internal::None, internal::None, internal::None,
1210    internal::None, internal::None, internal::None, internal::None,
1211    internal::None, internal::None> {
1212  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1213      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1214      T27> type;
1215};
1216template <typename T1, typename T2, typename T3, typename T4, typename T5,
1217    typename T6, typename T7, typename T8, typename T9, typename T10,
1218    typename T11, typename T12, typename T13, typename T14, typename T15,
1219    typename T16, typename T17, typename T18, typename T19, typename T20,
1220    typename T21, typename T22, typename T23, typename T24, typename T25,
1221    typename T26, typename T27, typename T28>
1222struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1223    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1224    internal::None, internal::None, internal::None, internal::None,
1225    internal::None, internal::None, internal::None, internal::None,
1226    internal::None, internal::None, internal::None, internal::None,
1227    internal::None, internal::None, internal::None, internal::None,
1228    internal::None, internal::None, internal::None, internal::None,
1229    internal::None, internal::None> {
1230  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1231      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1232      T27, T28> type;
1233};
1234template <typename T1, typename T2, typename T3, typename T4, typename T5,
1235    typename T6, typename T7, typename T8, typename T9, typename T10,
1236    typename T11, typename T12, typename T13, typename T14, typename T15,
1237    typename T16, typename T17, typename T18, typename T19, typename T20,
1238    typename T21, typename T22, typename T23, typename T24, typename T25,
1239    typename T26, typename T27, typename T28, typename T29>
1240struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1241    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
1242    internal::None, internal::None, internal::None, internal::None,
1243    internal::None, internal::None, internal::None, internal::None,
1244    internal::None, internal::None, internal::None, internal::None,
1245    internal::None, internal::None, internal::None, internal::None,
1246    internal::None, internal::None, internal::None, internal::None,
1247    internal::None> {
1248  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1249      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1250      T27, T28, T29> type;
1251};
1252template <typename T1, typename T2, typename T3, typename T4, typename T5,
1253    typename T6, typename T7, typename T8, typename T9, typename T10,
1254    typename T11, typename T12, typename T13, typename T14, typename T15,
1255    typename T16, typename T17, typename T18, typename T19, typename T20,
1256    typename T21, typename T22, typename T23, typename T24, typename T25,
1257    typename T26, typename T27, typename T28, typename T29, typename T30>
1258struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1259    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1260    internal::None, internal::None, internal::None, internal::None,
1261    internal::None, internal::None, internal::None, internal::None,
1262    internal::None, internal::None, internal::None, internal::None,
1263    internal::None, internal::None, internal::None, internal::None,
1264    internal::None, internal::None, internal::None, internal::None> {
1265  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1266      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1267      T27, T28, T29, T30> type;
1268};
1269template <typename T1, typename T2, typename T3, typename T4, typename T5,
1270    typename T6, typename T7, typename T8, typename T9, typename T10,
1271    typename T11, typename T12, typename T13, typename T14, typename T15,
1272    typename T16, typename T17, typename T18, typename T19, typename T20,
1273    typename T21, typename T22, typename T23, typename T24, typename T25,
1274    typename T26, typename T27, typename T28, typename T29, typename T30,
1275    typename T31>
1276struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1277    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1278    T31, internal::None, internal::None, internal::None, internal::None,
1279    internal::None, internal::None, internal::None, internal::None,
1280    internal::None, internal::None, internal::None, internal::None,
1281    internal::None, internal::None, internal::None, internal::None,
1282    internal::None, internal::None, internal::None> {
1283  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1284      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1285      T27, T28, T29, T30, T31> type;
1286};
1287template <typename T1, typename T2, typename T3, typename T4, typename T5,
1288    typename T6, typename T7, typename T8, typename T9, typename T10,
1289    typename T11, typename T12, typename T13, typename T14, typename T15,
1290    typename T16, typename T17, typename T18, typename T19, typename T20,
1291    typename T21, typename T22, typename T23, typename T24, typename T25,
1292    typename T26, typename T27, typename T28, typename T29, typename T30,
1293    typename T31, typename T32>
1294struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1295    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1296    T31, T32, internal::None, internal::None, internal::None, internal::None,
1297    internal::None, internal::None, internal::None, internal::None,
1298    internal::None, internal::None, internal::None, internal::None,
1299    internal::None, internal::None, internal::None, internal::None,
1300    internal::None, internal::None> {
1301  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1302      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1303      T27, T28, T29, T30, T31, T32> type;
1304};
1305template <typename T1, typename T2, typename T3, typename T4, typename T5,
1306    typename T6, typename T7, typename T8, typename T9, typename T10,
1307    typename T11, typename T12, typename T13, typename T14, typename T15,
1308    typename T16, typename T17, typename T18, typename T19, typename T20,
1309    typename T21, typename T22, typename T23, typename T24, typename T25,
1310    typename T26, typename T27, typename T28, typename T29, typename T30,
1311    typename T31, typename T32, typename T33>
1312struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1313    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1314    T31, T32, T33, internal::None, internal::None, internal::None,
1315    internal::None, internal::None, internal::None, internal::None,
1316    internal::None, internal::None, internal::None, internal::None,
1317    internal::None, internal::None, internal::None, internal::None,
1318    internal::None, internal::None> {
1319  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1320      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1321      T27, T28, T29, T30, T31, T32, T33> type;
1322};
1323template <typename T1, typename T2, typename T3, typename T4, typename T5,
1324    typename T6, typename T7, typename T8, typename T9, typename T10,
1325    typename T11, typename T12, typename T13, typename T14, typename T15,
1326    typename T16, typename T17, typename T18, typename T19, typename T20,
1327    typename T21, typename T22, typename T23, typename T24, typename T25,
1328    typename T26, typename T27, typename T28, typename T29, typename T30,
1329    typename T31, typename T32, typename T33, typename T34>
1330struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1331    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1332    T31, T32, T33, T34, internal::None, internal::None, internal::None,
1333    internal::None, internal::None, internal::None, internal::None,
1334    internal::None, internal::None, internal::None, internal::None,
1335    internal::None, internal::None, internal::None, internal::None,
1336    internal::None> {
1337  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1338      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1339      T27, T28, T29, T30, T31, T32, T33, T34> type;
1340};
1341template <typename T1, typename T2, typename T3, typename T4, typename T5,
1342    typename T6, typename T7, typename T8, typename T9, typename T10,
1343    typename T11, typename T12, typename T13, typename T14, typename T15,
1344    typename T16, typename T17, typename T18, typename T19, typename T20,
1345    typename T21, typename T22, typename T23, typename T24, typename T25,
1346    typename T26, typename T27, typename T28, typename T29, typename T30,
1347    typename T31, typename T32, typename T33, typename T34, typename T35>
1348struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1349    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1350    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
1351    internal::None, internal::None, internal::None, internal::None,
1352    internal::None, internal::None, internal::None, internal::None,
1353    internal::None, internal::None, internal::None, internal::None> {
1354  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1355      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1356      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
1357};
1358template <typename T1, typename T2, typename T3, typename T4, typename T5,
1359    typename T6, typename T7, typename T8, typename T9, typename T10,
1360    typename T11, typename T12, typename T13, typename T14, typename T15,
1361    typename T16, typename T17, typename T18, typename T19, typename T20,
1362    typename T21, typename T22, typename T23, typename T24, typename T25,
1363    typename T26, typename T27, typename T28, typename T29, typename T30,
1364    typename T31, typename T32, typename T33, typename T34, typename T35,
1365    typename T36>
1366struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1367    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1368    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
1369    internal::None, internal::None, internal::None, internal::None,
1370    internal::None, internal::None, internal::None, internal::None,
1371    internal::None, internal::None, internal::None, internal::None> {
1372  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1373      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1374      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
1375};
1376template <typename T1, typename T2, typename T3, typename T4, typename T5,
1377    typename T6, typename T7, typename T8, typename T9, typename T10,
1378    typename T11, typename T12, typename T13, typename T14, typename T15,
1379    typename T16, typename T17, typename T18, typename T19, typename T20,
1380    typename T21, typename T22, typename T23, typename T24, typename T25,
1381    typename T26, typename T27, typename T28, typename T29, typename T30,
1382    typename T31, typename T32, typename T33, typename T34, typename T35,
1383    typename T36, typename T37>
1384struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1385    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1386    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
1387    internal::None, internal::None, internal::None, internal::None,
1388    internal::None, internal::None, internal::None, internal::None,
1389    internal::None, internal::None, internal::None> {
1390  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1391      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1392      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
1393};
1394template <typename T1, typename T2, typename T3, typename T4, typename T5,
1395    typename T6, typename T7, typename T8, typename T9, typename T10,
1396    typename T11, typename T12, typename T13, typename T14, typename T15,
1397    typename T16, typename T17, typename T18, typename T19, typename T20,
1398    typename T21, typename T22, typename T23, typename T24, typename T25,
1399    typename T26, typename T27, typename T28, typename T29, typename T30,
1400    typename T31, typename T32, typename T33, typename T34, typename T35,
1401    typename T36, typename T37, typename T38>
1402struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1403    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1404    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
1405    internal::None, internal::None, internal::None, internal::None,
1406    internal::None, internal::None, internal::None, internal::None,
1407    internal::None, internal::None> {
1408  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1409      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1410      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
1411};
1412template <typename T1, typename T2, typename T3, typename T4, typename T5,
1413    typename T6, typename T7, typename T8, typename T9, typename T10,
1414    typename T11, typename T12, typename T13, typename T14, typename T15,
1415    typename T16, typename T17, typename T18, typename T19, typename T20,
1416    typename T21, typename T22, typename T23, typename T24, typename T25,
1417    typename T26, typename T27, typename T28, typename T29, typename T30,
1418    typename T31, typename T32, typename T33, typename T34, typename T35,
1419    typename T36, typename T37, typename T38, typename T39>
1420struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1421    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1422    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
1423    internal::None, internal::None, internal::None, internal::None,
1424    internal::None, internal::None, internal::None, internal::None,
1425    internal::None, internal::None> {
1426  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1427      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1428      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
1429};
1430template <typename T1, typename T2, typename T3, typename T4, typename T5,
1431    typename T6, typename T7, typename T8, typename T9, typename T10,
1432    typename T11, typename T12, typename T13, typename T14, typename T15,
1433    typename T16, typename T17, typename T18, typename T19, typename T20,
1434    typename T21, typename T22, typename T23, typename T24, typename T25,
1435    typename T26, typename T27, typename T28, typename T29, typename T30,
1436    typename T31, typename T32, typename T33, typename T34, typename T35,
1437    typename T36, typename T37, typename T38, typename T39, typename T40>
1438struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1439    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1440    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
1441    internal::None, internal::None, internal::None, internal::None,
1442    internal::None, internal::None, internal::None, internal::None,
1443    internal::None> {
1444  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1445      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1446      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
1447      T40> type;
1448};
1449template <typename T1, typename T2, typename T3, typename T4, typename T5,
1450    typename T6, typename T7, typename T8, typename T9, typename T10,
1451    typename T11, typename T12, typename T13, typename T14, typename T15,
1452    typename T16, typename T17, typename T18, typename T19, typename T20,
1453    typename T21, typename T22, typename T23, typename T24, typename T25,
1454    typename T26, typename T27, typename T28, typename T29, typename T30,
1455    typename T31, typename T32, typename T33, typename T34, typename T35,
1456    typename T36, typename T37, typename T38, typename T39, typename T40,
1457    typename T41>
1458struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1459    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1460    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
1461    internal::None, internal::None, internal::None, internal::None,
1462    internal::None, internal::None, internal::None, internal::None> {
1463  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1464      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1465      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1466      T41> type;
1467};
1468template <typename T1, typename T2, typename T3, typename T4, typename T5,
1469    typename T6, typename T7, typename T8, typename T9, typename T10,
1470    typename T11, typename T12, typename T13, typename T14, typename T15,
1471    typename T16, typename T17, typename T18, typename T19, typename T20,
1472    typename T21, typename T22, typename T23, typename T24, typename T25,
1473    typename T26, typename T27, typename T28, typename T29, typename T30,
1474    typename T31, typename T32, typename T33, typename T34, typename T35,
1475    typename T36, typename T37, typename T38, typename T39, typename T40,
1476    typename T41, typename T42>
1477struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1478    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1479    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
1480    internal::None, internal::None, internal::None, internal::None,
1481    internal::None, internal::None, internal::None> {
1482  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1483      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1484      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1485      T41, T42> type;
1486};
1487template <typename T1, typename T2, typename T3, typename T4, typename T5,
1488    typename T6, typename T7, typename T8, typename T9, typename T10,
1489    typename T11, typename T12, typename T13, typename T14, typename T15,
1490    typename T16, typename T17, typename T18, typename T19, typename T20,
1491    typename T21, typename T22, typename T23, typename T24, typename T25,
1492    typename T26, typename T27, typename T28, typename T29, typename T30,
1493    typename T31, typename T32, typename T33, typename T34, typename T35,
1494    typename T36, typename T37, typename T38, typename T39, typename T40,
1495    typename T41, typename T42, typename T43>
1496struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1497    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1498    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
1499    internal::None, internal::None, internal::None, internal::None,
1500    internal::None, internal::None, internal::None> {
1501  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1502      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1503      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1504      T41, T42, T43> type;
1505};
1506template <typename T1, typename T2, typename T3, typename T4, typename T5,
1507    typename T6, typename T7, typename T8, typename T9, typename T10,
1508    typename T11, typename T12, typename T13, typename T14, typename T15,
1509    typename T16, typename T17, typename T18, typename T19, typename T20,
1510    typename T21, typename T22, typename T23, typename T24, typename T25,
1511    typename T26, typename T27, typename T28, typename T29, typename T30,
1512    typename T31, typename T32, typename T33, typename T34, typename T35,
1513    typename T36, typename T37, typename T38, typename T39, typename T40,
1514    typename T41, typename T42, typename T43, typename T44>
1515struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1516    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1517    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
1518    internal::None, internal::None, internal::None, internal::None,
1519    internal::None, internal::None> {
1520  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1521      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1522      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1523      T41, T42, T43, T44> type;
1524};
1525template <typename T1, typename T2, typename T3, typename T4, typename T5,
1526    typename T6, typename T7, typename T8, typename T9, typename T10,
1527    typename T11, typename T12, typename T13, typename T14, typename T15,
1528    typename T16, typename T17, typename T18, typename T19, typename T20,
1529    typename T21, typename T22, typename T23, typename T24, typename T25,
1530    typename T26, typename T27, typename T28, typename T29, typename T30,
1531    typename T31, typename T32, typename T33, typename T34, typename T35,
1532    typename T36, typename T37, typename T38, typename T39, typename T40,
1533    typename T41, typename T42, typename T43, typename T44, typename T45>
1534struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1535    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1536    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1537    internal::None, internal::None, internal::None, internal::None,
1538    internal::None> {
1539  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1540      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1541      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1542      T41, T42, T43, T44, T45> type;
1543};
1544template <typename T1, typename T2, typename T3, typename T4, typename T5,
1545    typename T6, typename T7, typename T8, typename T9, typename T10,
1546    typename T11, typename T12, typename T13, typename T14, typename T15,
1547    typename T16, typename T17, typename T18, typename T19, typename T20,
1548    typename T21, typename T22, typename T23, typename T24, typename T25,
1549    typename T26, typename T27, typename T28, typename T29, typename T30,
1550    typename T31, typename T32, typename T33, typename T34, typename T35,
1551    typename T36, typename T37, typename T38, typename T39, typename T40,
1552    typename T41, typename T42, typename T43, typename T44, typename T45,
1553    typename T46>
1554struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1555    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1556    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1557    T46, internal::None, internal::None, internal::None, internal::None> {
1558  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1559      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1560      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1561      T41, T42, T43, T44, T45, T46> type;
1562};
1563template <typename T1, typename T2, typename T3, typename T4, typename T5,
1564    typename T6, typename T7, typename T8, typename T9, typename T10,
1565    typename T11, typename T12, typename T13, typename T14, typename T15,
1566    typename T16, typename T17, typename T18, typename T19, typename T20,
1567    typename T21, typename T22, typename T23, typename T24, typename T25,
1568    typename T26, typename T27, typename T28, typename T29, typename T30,
1569    typename T31, typename T32, typename T33, typename T34, typename T35,
1570    typename T36, typename T37, typename T38, typename T39, typename T40,
1571    typename T41, typename T42, typename T43, typename T44, typename T45,
1572    typename T46, typename T47>
1573struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1574    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1575    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1576    T46, T47, internal::None, internal::None, internal::None> {
1577  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1578      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1579      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1580      T41, T42, T43, T44, T45, T46, T47> type;
1581};
1582template <typename T1, typename T2, typename T3, typename T4, typename T5,
1583    typename T6, typename T7, typename T8, typename T9, typename T10,
1584    typename T11, typename T12, typename T13, typename T14, typename T15,
1585    typename T16, typename T17, typename T18, typename T19, typename T20,
1586    typename T21, typename T22, typename T23, typename T24, typename T25,
1587    typename T26, typename T27, typename T28, typename T29, typename T30,
1588    typename T31, typename T32, typename T33, typename T34, typename T35,
1589    typename T36, typename T37, typename T38, typename T39, typename T40,
1590    typename T41, typename T42, typename T43, typename T44, typename T45,
1591    typename T46, typename T47, typename T48>
1592struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1593    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1594    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1595    T46, T47, T48, internal::None, internal::None> {
1596  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1597      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1598      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1599      T41, T42, T43, T44, T45, T46, T47, T48> type;
1600};
1601template <typename T1, typename T2, typename T3, typename T4, typename T5,
1602    typename T6, typename T7, typename T8, typename T9, typename T10,
1603    typename T11, typename T12, typename T13, typename T14, typename T15,
1604    typename T16, typename T17, typename T18, typename T19, typename T20,
1605    typename T21, typename T22, typename T23, typename T24, typename T25,
1606    typename T26, typename T27, typename T28, typename T29, typename T30,
1607    typename T31, typename T32, typename T33, typename T34, typename T35,
1608    typename T36, typename T37, typename T38, typename T39, typename T40,
1609    typename T41, typename T42, typename T43, typename T44, typename T45,
1610    typename T46, typename T47, typename T48, typename T49>
1611struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
1612    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
1613    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
1614    T46, T47, T48, T49, internal::None> {
1615  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
1616      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
1617      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
1618      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
1619};
1620
1621namespace internal {
1622
1623# define GTEST_TEMPLATE_ template <typename T> class
1624
1625// The template "selector" struct TemplateSel<Tmpl> is used to
1626// represent Tmpl, which must be a class template with one type
1627// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
1628// as the type Tmpl<T>.  This allows us to actually instantiate the
1629// template "selected" by TemplateSel<Tmpl>.
1630//
1631// This trick is necessary for simulating typedef for class templates,
1632// which C++ doesn't support directly.
1633template <GTEST_TEMPLATE_ Tmpl>
1634struct TemplateSel {
1635  template <typename T>
1636  struct Bind {
1637    typedef Tmpl<T> type;
1638  };
1639};
1640
1641# define GTEST_BIND_(TmplSel, T) \
1642  TmplSel::template Bind<T>::type
1643
1644// A unique struct template used as the default value for the
1645// arguments of class template Templates.  This allows us to simulate
1646// variadic templates (e.g. Templates<int>, Templates<int, double>,
1647// and etc), which C++ doesn't support directly.
1648template <typename T>
1649struct NoneT {};
1650
1651// The following family of struct and struct templates are used to
1652// represent template lists.  In particular, TemplatesN<T1, T2, ...,
1653// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
1654// for Templates0, every struct in the family has two member types:
1655// Head for the selector of the first template in the list, and Tail
1656// for the rest of the list.
1657
1658// The empty template list.
1659struct Templates0 {};
1660
1661// Template lists of length 1, 2, 3, and so on.
1662
1663template <GTEST_TEMPLATE_ T1>
1664struct Templates1 {
1665  typedef TemplateSel<T1> Head;
1666  typedef Templates0 Tail;
1667};
1668template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
1669struct Templates2 {
1670  typedef TemplateSel<T1> Head;
1671  typedef Templates1<T2> Tail;
1672};
1673
1674template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
1675struct Templates3 {
1676  typedef TemplateSel<T1> Head;
1677  typedef Templates2<T2, T3> Tail;
1678};
1679
1680template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1681    GTEST_TEMPLATE_ T4>
1682struct Templates4 {
1683  typedef TemplateSel<T1> Head;
1684  typedef Templates3<T2, T3, T4> Tail;
1685};
1686
1687template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1688    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
1689struct Templates5 {
1690  typedef TemplateSel<T1> Head;
1691  typedef Templates4<T2, T3, T4, T5> Tail;
1692};
1693
1694template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1695    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
1696struct Templates6 {
1697  typedef TemplateSel<T1> Head;
1698  typedef Templates5<T2, T3, T4, T5, T6> Tail;
1699};
1700
1701template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1702    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1703    GTEST_TEMPLATE_ T7>
1704struct Templates7 {
1705  typedef TemplateSel<T1> Head;
1706  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
1707};
1708
1709template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1710    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1711    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
1712struct Templates8 {
1713  typedef TemplateSel<T1> Head;
1714  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
1715};
1716
1717template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1718    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1719    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
1720struct Templates9 {
1721  typedef TemplateSel<T1> Head;
1722  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
1723};
1724
1725template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1726    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1727    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1728    GTEST_TEMPLATE_ T10>
1729struct Templates10 {
1730  typedef TemplateSel<T1> Head;
1731  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
1732};
1733
1734template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1735    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1736    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1737    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
1738struct Templates11 {
1739  typedef TemplateSel<T1> Head;
1740  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
1741};
1742
1743template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1744    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1745    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1746    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
1747struct Templates12 {
1748  typedef TemplateSel<T1> Head;
1749  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
1750};
1751
1752template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1753    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1754    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1755    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1756    GTEST_TEMPLATE_ T13>
1757struct Templates13 {
1758  typedef TemplateSel<T1> Head;
1759  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
1760};
1761
1762template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1763    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1764    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1765    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1766    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
1767struct Templates14 {
1768  typedef TemplateSel<T1> Head;
1769  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
1770      T14> Tail;
1771};
1772
1773template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1774    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1775    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1776    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1777    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
1778struct Templates15 {
1779  typedef TemplateSel<T1> Head;
1780  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1781      T15> Tail;
1782};
1783
1784template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1785    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1786    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1787    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1788    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1789    GTEST_TEMPLATE_ T16>
1790struct Templates16 {
1791  typedef TemplateSel<T1> Head;
1792  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1793      T15, T16> Tail;
1794};
1795
1796template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1797    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1798    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1799    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1800    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1801    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
1802struct Templates17 {
1803  typedef TemplateSel<T1> Head;
1804  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1805      T15, T16, T17> Tail;
1806};
1807
1808template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1809    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1810    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1811    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1812    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1813    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
1814struct Templates18 {
1815  typedef TemplateSel<T1> Head;
1816  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1817      T15, T16, T17, T18> Tail;
1818};
1819
1820template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1821    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1822    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1823    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1824    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1825    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1826    GTEST_TEMPLATE_ T19>
1827struct Templates19 {
1828  typedef TemplateSel<T1> Head;
1829  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1830      T15, T16, T17, T18, T19> Tail;
1831};
1832
1833template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1834    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1835    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1836    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1837    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1838    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1839    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
1840struct Templates20 {
1841  typedef TemplateSel<T1> Head;
1842  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1843      T15, T16, T17, T18, T19, T20> Tail;
1844};
1845
1846template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1847    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1848    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1849    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1850    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1851    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1852    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
1853struct Templates21 {
1854  typedef TemplateSel<T1> Head;
1855  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1856      T15, T16, T17, T18, T19, T20, T21> Tail;
1857};
1858
1859template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1860    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1861    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1862    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1863    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1864    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1865    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1866    GTEST_TEMPLATE_ T22>
1867struct Templates22 {
1868  typedef TemplateSel<T1> Head;
1869  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1870      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
1871};
1872
1873template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1874    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1875    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1876    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1877    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1878    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1879    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1880    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
1881struct Templates23 {
1882  typedef TemplateSel<T1> Head;
1883  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1884      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
1885};
1886
1887template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1888    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1889    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1890    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1891    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1892    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1893    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1894    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
1895struct Templates24 {
1896  typedef TemplateSel<T1> Head;
1897  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1898      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
1899};
1900
1901template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1902    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1903    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1904    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1905    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1906    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1907    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1908    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1909    GTEST_TEMPLATE_ T25>
1910struct Templates25 {
1911  typedef TemplateSel<T1> Head;
1912  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1913      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
1914};
1915
1916template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1917    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1918    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1919    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1920    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1921    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1922    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1923    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1924    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
1925struct Templates26 {
1926  typedef TemplateSel<T1> Head;
1927  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1928      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
1929};
1930
1931template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1932    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1933    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1934    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1935    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1936    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1937    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1938    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1939    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
1940struct Templates27 {
1941  typedef TemplateSel<T1> Head;
1942  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1943      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
1944};
1945
1946template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1947    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1948    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1949    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1950    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1951    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1952    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1953    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1954    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1955    GTEST_TEMPLATE_ T28>
1956struct Templates28 {
1957  typedef TemplateSel<T1> Head;
1958  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1959      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
1960      T28> Tail;
1961};
1962
1963template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1964    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1965    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1966    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1967    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1968    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1969    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1970    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1971    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1972    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
1973struct Templates29 {
1974  typedef TemplateSel<T1> Head;
1975  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1976      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1977      T29> Tail;
1978};
1979
1980template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1981    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1982    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
1983    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
1984    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
1985    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
1986    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
1987    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
1988    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
1989    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
1990struct Templates30 {
1991  typedef TemplateSel<T1> Head;
1992  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
1993      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
1994      T29, T30> Tail;
1995};
1996
1997template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
1998    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
1999    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2000    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2001    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2002    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2003    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2004    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2005    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2006    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2007    GTEST_TEMPLATE_ T31>
2008struct Templates31 {
2009  typedef TemplateSel<T1> Head;
2010  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2011      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2012      T29, T30, T31> Tail;
2013};
2014
2015template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2016    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2017    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2018    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2019    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2020    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2021    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2022    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2023    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2024    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2025    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
2026struct Templates32 {
2027  typedef TemplateSel<T1> Head;
2028  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2029      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2030      T29, T30, T31, T32> Tail;
2031};
2032
2033template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2034    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2035    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2036    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2037    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2038    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2039    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2040    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2041    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2042    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2043    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
2044struct Templates33 {
2045  typedef TemplateSel<T1> Head;
2046  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2047      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2048      T29, T30, T31, T32, T33> Tail;
2049};
2050
2051template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2052    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2053    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2054    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2055    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2056    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2057    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2058    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2059    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2060    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2061    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2062    GTEST_TEMPLATE_ T34>
2063struct Templates34 {
2064  typedef TemplateSel<T1> Head;
2065  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2066      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2067      T29, T30, T31, T32, T33, T34> Tail;
2068};
2069
2070template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2071    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2072    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2073    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2074    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2075    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2076    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2077    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2078    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2079    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2080    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2081    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
2082struct Templates35 {
2083  typedef TemplateSel<T1> Head;
2084  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2085      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2086      T29, T30, T31, T32, T33, T34, T35> Tail;
2087};
2088
2089template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2090    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2091    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2092    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2093    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2094    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2095    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2096    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2097    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2098    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2099    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2100    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
2101struct Templates36 {
2102  typedef TemplateSel<T1> Head;
2103  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2104      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2105      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
2106};
2107
2108template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2109    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2110    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2111    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2112    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2113    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2114    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2115    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2116    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2117    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2118    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2119    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2120    GTEST_TEMPLATE_ T37>
2121struct Templates37 {
2122  typedef TemplateSel<T1> Head;
2123  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2124      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2125      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
2126};
2127
2128template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2129    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2130    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2131    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2132    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2133    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2134    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2135    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2136    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2137    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2138    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2139    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2140    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
2141struct Templates38 {
2142  typedef TemplateSel<T1> Head;
2143  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2144      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2145      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
2146};
2147
2148template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2149    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2150    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2151    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2152    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2153    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2154    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2155    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2156    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2157    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2158    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2159    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2160    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
2161struct Templates39 {
2162  typedef TemplateSel<T1> Head;
2163  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2164      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2165      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
2166};
2167
2168template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2169    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
2170    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
2171    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
2172    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
2173    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
2174    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
2175    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
2176    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
2177    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
2178    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
2179    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
2180    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
2181    GTEST_TEMPLATE_ T40>
2182struct Templates40 {
2183  typedef TemplateSel<T1> Head;
2184  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
2185      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
2186      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
2187};
2188
2189template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
2190    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_