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