106f32e7eSjoerg // This file was GENERATED by command:
206f32e7eSjoerg //     pump.py gtest-type-util.h.pump
306f32e7eSjoerg // DO NOT EDIT BY HAND!!!
406f32e7eSjoerg 
506f32e7eSjoerg // Copyright 2008 Google Inc.
606f32e7eSjoerg // All Rights Reserved.
706f32e7eSjoerg //
806f32e7eSjoerg // Redistribution and use in source and binary forms, with or without
906f32e7eSjoerg // modification, are permitted provided that the following conditions are
1006f32e7eSjoerg // met:
1106f32e7eSjoerg //
1206f32e7eSjoerg //     * Redistributions of source code must retain the above copyright
1306f32e7eSjoerg // notice, this list of conditions and the following disclaimer.
1406f32e7eSjoerg //     * Redistributions in binary form must reproduce the above
1506f32e7eSjoerg // copyright notice, this list of conditions and the following disclaimer
1606f32e7eSjoerg // in the documentation and/or other materials provided with the
1706f32e7eSjoerg // distribution.
1806f32e7eSjoerg //     * Neither the name of Google Inc. nor the names of its
1906f32e7eSjoerg // contributors may be used to endorse or promote products derived from
2006f32e7eSjoerg // this software without specific prior written permission.
2106f32e7eSjoerg //
2206f32e7eSjoerg // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2306f32e7eSjoerg // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2406f32e7eSjoerg // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2506f32e7eSjoerg // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2606f32e7eSjoerg // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2706f32e7eSjoerg // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2806f32e7eSjoerg // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2906f32e7eSjoerg // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3006f32e7eSjoerg // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3106f32e7eSjoerg // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3206f32e7eSjoerg // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3306f32e7eSjoerg 
3406f32e7eSjoerg // Type utilities needed for implementing typed and type-parameterized
3506f32e7eSjoerg // tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
3606f32e7eSjoerg //
3706f32e7eSjoerg // Currently we support at most 50 types in a list, and at most 50
38*da58b97aSjoerg // type-parameterized tests in one type-parameterized test suite.
3906f32e7eSjoerg // Please contact googletestframework@googlegroups.com if you need
4006f32e7eSjoerg // more.
4106f32e7eSjoerg 
42*da58b97aSjoerg // GOOGLETEST_CM0001 DO NOT DELETE
43*da58b97aSjoerg 
4406f32e7eSjoerg #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
4506f32e7eSjoerg #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
4606f32e7eSjoerg 
4706f32e7eSjoerg #include "gtest/internal/gtest-port.h"
4806f32e7eSjoerg 
4906f32e7eSjoerg // #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
5006f32e7eSjoerg // libstdc++ (which is where cxxabi.h comes from).
5106f32e7eSjoerg # if GTEST_HAS_CXXABI_H_
5206f32e7eSjoerg #  include <cxxabi.h>
5306f32e7eSjoerg # elif defined(__HP_aCC)
5406f32e7eSjoerg #  include <acxx_demangle.h>
5506f32e7eSjoerg # endif  // GTEST_HASH_CXXABI_H_
5606f32e7eSjoerg 
5706f32e7eSjoerg namespace testing {
5806f32e7eSjoerg namespace internal {
5906f32e7eSjoerg 
60*da58b97aSjoerg // Canonicalizes a given name with respect to the Standard C++ Library.
61*da58b97aSjoerg // This handles removing the inline namespace within `std` that is
62*da58b97aSjoerg // used by various standard libraries (e.g., `std::__1`).  Names outside
63*da58b97aSjoerg // of namespace std are returned unmodified.
CanonicalizeForStdLibVersioning(std::string s)64*da58b97aSjoerg inline std::string CanonicalizeForStdLibVersioning(std::string s) {
65*da58b97aSjoerg   static const char prefix[] = "std::__";
66*da58b97aSjoerg   if (s.compare(0, strlen(prefix), prefix) == 0) {
67*da58b97aSjoerg     std::string::size_type end = s.find("::", strlen(prefix));
68*da58b97aSjoerg     if (end != s.npos) {
69*da58b97aSjoerg       // Erase everything between the initial `std` and the second `::`.
70*da58b97aSjoerg       s.erase(strlen("std"), end - strlen("std"));
71*da58b97aSjoerg     }
72*da58b97aSjoerg   }
73*da58b97aSjoerg   return s;
74*da58b97aSjoerg }
75*da58b97aSjoerg 
7606f32e7eSjoerg // GetTypeName<T>() returns a human-readable name of type T.
7706f32e7eSjoerg // NB: This function is also used in Google Mock, so don't move it inside of
7806f32e7eSjoerg // the typed-test-only section below.
7906f32e7eSjoerg template <typename T>
GetTypeName()8006f32e7eSjoerg std::string GetTypeName() {
8106f32e7eSjoerg # if GTEST_HAS_RTTI
8206f32e7eSjoerg 
8306f32e7eSjoerg   const char* const name = typeid(T).name();
8406f32e7eSjoerg #  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
8506f32e7eSjoerg   int status = 0;
8606f32e7eSjoerg   // gcc's implementation of typeid(T).name() mangles the type name,
8706f32e7eSjoerg   // so we have to demangle it.
8806f32e7eSjoerg #   if GTEST_HAS_CXXABI_H_
8906f32e7eSjoerg   using abi::__cxa_demangle;
9006f32e7eSjoerg #   endif  // GTEST_HAS_CXXABI_H_
91*da58b97aSjoerg   char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status);
9206f32e7eSjoerg   const std::string name_str(status == 0 ? readable_name : name);
9306f32e7eSjoerg   free(readable_name);
94*da58b97aSjoerg   return CanonicalizeForStdLibVersioning(name_str);
9506f32e7eSjoerg #  else
9606f32e7eSjoerg   return name;
9706f32e7eSjoerg #  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
9806f32e7eSjoerg 
9906f32e7eSjoerg # else
10006f32e7eSjoerg 
10106f32e7eSjoerg   return "<type>";
10206f32e7eSjoerg 
10306f32e7eSjoerg # endif  // GTEST_HAS_RTTI
10406f32e7eSjoerg }
10506f32e7eSjoerg 
10606f32e7eSjoerg #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
10706f32e7eSjoerg 
10806f32e7eSjoerg // A unique type used as the default value for the arguments of class
10906f32e7eSjoerg // template Types.  This allows us to simulate variadic templates
11006f32e7eSjoerg // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
11106f32e7eSjoerg // support directly.
11206f32e7eSjoerg struct None {};
11306f32e7eSjoerg 
11406f32e7eSjoerg // The following family of struct and struct templates are used to
11506f32e7eSjoerg // represent type lists.  In particular, TypesN<T1, T2, ..., TN>
11606f32e7eSjoerg // represents a type list with N types (T1, T2, ..., and TN) in it.
11706f32e7eSjoerg // Except for Types0, every struct in the family has two member types:
11806f32e7eSjoerg // Head for the first type in the list, and Tail for the rest of the
11906f32e7eSjoerg // list.
12006f32e7eSjoerg 
12106f32e7eSjoerg // The empty type list.
12206f32e7eSjoerg struct Types0 {};
12306f32e7eSjoerg 
12406f32e7eSjoerg // Type lists of length 1, 2, 3, and so on.
12506f32e7eSjoerg 
12606f32e7eSjoerg template <typename T1>
12706f32e7eSjoerg struct Types1 {
12806f32e7eSjoerg   typedef T1 Head;
12906f32e7eSjoerg   typedef Types0 Tail;
13006f32e7eSjoerg };
13106f32e7eSjoerg template <typename T1, typename T2>
13206f32e7eSjoerg struct Types2 {
13306f32e7eSjoerg   typedef T1 Head;
13406f32e7eSjoerg   typedef Types1<T2> Tail;
13506f32e7eSjoerg };
13606f32e7eSjoerg 
13706f32e7eSjoerg template <typename T1, typename T2, typename T3>
13806f32e7eSjoerg struct Types3 {
13906f32e7eSjoerg   typedef T1 Head;
14006f32e7eSjoerg   typedef Types2<T2, T3> Tail;
14106f32e7eSjoerg };
14206f32e7eSjoerg 
14306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4>
14406f32e7eSjoerg struct Types4 {
14506f32e7eSjoerg   typedef T1 Head;
14606f32e7eSjoerg   typedef Types3<T2, T3, T4> Tail;
14706f32e7eSjoerg };
14806f32e7eSjoerg 
14906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5>
15006f32e7eSjoerg struct Types5 {
15106f32e7eSjoerg   typedef T1 Head;
15206f32e7eSjoerg   typedef Types4<T2, T3, T4, T5> Tail;
15306f32e7eSjoerg };
15406f32e7eSjoerg 
15506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
15606f32e7eSjoerg     typename T6>
15706f32e7eSjoerg struct Types6 {
15806f32e7eSjoerg   typedef T1 Head;
15906f32e7eSjoerg   typedef Types5<T2, T3, T4, T5, T6> Tail;
16006f32e7eSjoerg };
16106f32e7eSjoerg 
16206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
16306f32e7eSjoerg     typename T6, typename T7>
16406f32e7eSjoerg struct Types7 {
16506f32e7eSjoerg   typedef T1 Head;
16606f32e7eSjoerg   typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
16706f32e7eSjoerg };
16806f32e7eSjoerg 
16906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
17006f32e7eSjoerg     typename T6, typename T7, typename T8>
17106f32e7eSjoerg struct Types8 {
17206f32e7eSjoerg   typedef T1 Head;
17306f32e7eSjoerg   typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
17406f32e7eSjoerg };
17506f32e7eSjoerg 
17606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
17706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9>
17806f32e7eSjoerg struct Types9 {
17906f32e7eSjoerg   typedef T1 Head;
18006f32e7eSjoerg   typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
18106f32e7eSjoerg };
18206f32e7eSjoerg 
18306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
18406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10>
18506f32e7eSjoerg struct Types10 {
18606f32e7eSjoerg   typedef T1 Head;
18706f32e7eSjoerg   typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
18806f32e7eSjoerg };
18906f32e7eSjoerg 
19006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
19106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
19206f32e7eSjoerg     typename T11>
19306f32e7eSjoerg struct Types11 {
19406f32e7eSjoerg   typedef T1 Head;
19506f32e7eSjoerg   typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
19606f32e7eSjoerg };
19706f32e7eSjoerg 
19806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
19906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
20006f32e7eSjoerg     typename T11, typename T12>
20106f32e7eSjoerg struct Types12 {
20206f32e7eSjoerg   typedef T1 Head;
20306f32e7eSjoerg   typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
20406f32e7eSjoerg };
20506f32e7eSjoerg 
20606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
20706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
20806f32e7eSjoerg     typename T11, typename T12, typename T13>
20906f32e7eSjoerg struct Types13 {
21006f32e7eSjoerg   typedef T1 Head;
21106f32e7eSjoerg   typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
21206f32e7eSjoerg };
21306f32e7eSjoerg 
21406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
21506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
21606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14>
21706f32e7eSjoerg struct Types14 {
21806f32e7eSjoerg   typedef T1 Head;
21906f32e7eSjoerg   typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
22006f32e7eSjoerg };
22106f32e7eSjoerg 
22206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
22306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
22406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15>
22506f32e7eSjoerg struct Types15 {
22606f32e7eSjoerg   typedef T1 Head;
22706f32e7eSjoerg   typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
22806f32e7eSjoerg       T15> Tail;
22906f32e7eSjoerg };
23006f32e7eSjoerg 
23106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
23206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
23306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
23406f32e7eSjoerg     typename T16>
23506f32e7eSjoerg struct Types16 {
23606f32e7eSjoerg   typedef T1 Head;
23706f32e7eSjoerg   typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
23806f32e7eSjoerg       T16> Tail;
23906f32e7eSjoerg };
24006f32e7eSjoerg 
24106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
24206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
24306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
24406f32e7eSjoerg     typename T16, typename T17>
24506f32e7eSjoerg struct Types17 {
24606f32e7eSjoerg   typedef T1 Head;
24706f32e7eSjoerg   typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
24806f32e7eSjoerg       T16, T17> Tail;
24906f32e7eSjoerg };
25006f32e7eSjoerg 
25106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
25206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
25306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
25406f32e7eSjoerg     typename T16, typename T17, typename T18>
25506f32e7eSjoerg struct Types18 {
25606f32e7eSjoerg   typedef T1 Head;
25706f32e7eSjoerg   typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
25806f32e7eSjoerg       T16, T17, T18> Tail;
25906f32e7eSjoerg };
26006f32e7eSjoerg 
26106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
26206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
26306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
26406f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19>
26506f32e7eSjoerg struct Types19 {
26606f32e7eSjoerg   typedef T1 Head;
26706f32e7eSjoerg   typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
26806f32e7eSjoerg       T16, T17, T18, T19> Tail;
26906f32e7eSjoerg };
27006f32e7eSjoerg 
27106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
27206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
27306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
27406f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20>
27506f32e7eSjoerg struct Types20 {
27606f32e7eSjoerg   typedef T1 Head;
27706f32e7eSjoerg   typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
27806f32e7eSjoerg       T16, T17, T18, T19, T20> Tail;
27906f32e7eSjoerg };
28006f32e7eSjoerg 
28106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
28206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
28306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
28406f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
28506f32e7eSjoerg     typename T21>
28606f32e7eSjoerg struct Types21 {
28706f32e7eSjoerg   typedef T1 Head;
28806f32e7eSjoerg   typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
28906f32e7eSjoerg       T16, T17, T18, T19, T20, T21> Tail;
29006f32e7eSjoerg };
29106f32e7eSjoerg 
29206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
29306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
29406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
29506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
29606f32e7eSjoerg     typename T21, typename T22>
29706f32e7eSjoerg struct Types22 {
29806f32e7eSjoerg   typedef T1 Head;
29906f32e7eSjoerg   typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
30006f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22> Tail;
30106f32e7eSjoerg };
30206f32e7eSjoerg 
30306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
30406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
30506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
30606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
30706f32e7eSjoerg     typename T21, typename T22, typename T23>
30806f32e7eSjoerg struct Types23 {
30906f32e7eSjoerg   typedef T1 Head;
31006f32e7eSjoerg   typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
31106f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23> Tail;
31206f32e7eSjoerg };
31306f32e7eSjoerg 
31406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
31506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
31606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
31706f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
31806f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24>
31906f32e7eSjoerg struct Types24 {
32006f32e7eSjoerg   typedef T1 Head;
32106f32e7eSjoerg   typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
32206f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
32306f32e7eSjoerg };
32406f32e7eSjoerg 
32506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
32606f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
32706f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
32806f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
32906f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25>
33006f32e7eSjoerg struct Types25 {
33106f32e7eSjoerg   typedef T1 Head;
33206f32e7eSjoerg   typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
33306f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
33406f32e7eSjoerg };
33506f32e7eSjoerg 
33606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
33706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
33806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
33906f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
34006f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
34106f32e7eSjoerg     typename T26>
34206f32e7eSjoerg struct Types26 {
34306f32e7eSjoerg   typedef T1 Head;
34406f32e7eSjoerg   typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
34506f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
34606f32e7eSjoerg };
34706f32e7eSjoerg 
34806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
34906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
35006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
35106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
35206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
35306f32e7eSjoerg     typename T26, typename T27>
35406f32e7eSjoerg struct Types27 {
35506f32e7eSjoerg   typedef T1 Head;
35606f32e7eSjoerg   typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
35706f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
35806f32e7eSjoerg };
35906f32e7eSjoerg 
36006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
36106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
36206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
36306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
36406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
36506f32e7eSjoerg     typename T26, typename T27, typename T28>
36606f32e7eSjoerg struct Types28 {
36706f32e7eSjoerg   typedef T1 Head;
36806f32e7eSjoerg   typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
36906f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
37006f32e7eSjoerg };
37106f32e7eSjoerg 
37206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
37306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
37406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
37506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
37606f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
37706f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29>
37806f32e7eSjoerg struct Types29 {
37906f32e7eSjoerg   typedef T1 Head;
38006f32e7eSjoerg   typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
38106f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
38206f32e7eSjoerg       T29> Tail;
38306f32e7eSjoerg };
38406f32e7eSjoerg 
38506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
38606f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
38706f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
38806f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
38906f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
39006f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30>
39106f32e7eSjoerg struct Types30 {
39206f32e7eSjoerg   typedef T1 Head;
39306f32e7eSjoerg   typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
39406f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
39506f32e7eSjoerg       T30> Tail;
39606f32e7eSjoerg };
39706f32e7eSjoerg 
39806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
39906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
40006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
40106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
40206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
40306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
40406f32e7eSjoerg     typename T31>
40506f32e7eSjoerg struct Types31 {
40606f32e7eSjoerg   typedef T1 Head;
40706f32e7eSjoerg   typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
40806f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
40906f32e7eSjoerg       T30, T31> Tail;
41006f32e7eSjoerg };
41106f32e7eSjoerg 
41206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
41306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
41406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
41506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
41606f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
41706f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
41806f32e7eSjoerg     typename T31, typename T32>
41906f32e7eSjoerg struct Types32 {
42006f32e7eSjoerg   typedef T1 Head;
42106f32e7eSjoerg   typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
42206f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
42306f32e7eSjoerg       T30, T31, T32> Tail;
42406f32e7eSjoerg };
42506f32e7eSjoerg 
42606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
42706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
42806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
42906f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
43006f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
43106f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
43206f32e7eSjoerg     typename T31, typename T32, typename T33>
43306f32e7eSjoerg struct Types33 {
43406f32e7eSjoerg   typedef T1 Head;
43506f32e7eSjoerg   typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
43606f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
43706f32e7eSjoerg       T30, T31, T32, T33> Tail;
43806f32e7eSjoerg };
43906f32e7eSjoerg 
44006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
44106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
44206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
44306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
44406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
44506f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
44606f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34>
44706f32e7eSjoerg struct Types34 {
44806f32e7eSjoerg   typedef T1 Head;
44906f32e7eSjoerg   typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
45006f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
45106f32e7eSjoerg       T30, T31, T32, T33, T34> Tail;
45206f32e7eSjoerg };
45306f32e7eSjoerg 
45406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
45506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
45606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
45706f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
45806f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
45906f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
46006f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35>
46106f32e7eSjoerg struct Types35 {
46206f32e7eSjoerg   typedef T1 Head;
46306f32e7eSjoerg   typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
46406f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
46506f32e7eSjoerg       T30, T31, T32, T33, T34, T35> Tail;
46606f32e7eSjoerg };
46706f32e7eSjoerg 
46806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
46906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
47006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
47106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
47206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
47306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
47406f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
47506f32e7eSjoerg     typename T36>
47606f32e7eSjoerg struct Types36 {
47706f32e7eSjoerg   typedef T1 Head;
47806f32e7eSjoerg   typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
47906f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
48006f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36> Tail;
48106f32e7eSjoerg };
48206f32e7eSjoerg 
48306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
48406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
48506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
48606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
48706f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
48806f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
48906f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
49006f32e7eSjoerg     typename T36, typename T37>
49106f32e7eSjoerg struct Types37 {
49206f32e7eSjoerg   typedef T1 Head;
49306f32e7eSjoerg   typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
49406f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
49506f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37> Tail;
49606f32e7eSjoerg };
49706f32e7eSjoerg 
49806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
49906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
50006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
50106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
50206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
50306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
50406f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
50506f32e7eSjoerg     typename T36, typename T37, typename T38>
50606f32e7eSjoerg struct Types38 {
50706f32e7eSjoerg   typedef T1 Head;
50806f32e7eSjoerg   typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
50906f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
51006f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
51106f32e7eSjoerg };
51206f32e7eSjoerg 
51306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
51406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
51506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
51606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
51706f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
51806f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
51906f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
52006f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39>
52106f32e7eSjoerg struct Types39 {
52206f32e7eSjoerg   typedef T1 Head;
52306f32e7eSjoerg   typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
52406f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
52506f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
52606f32e7eSjoerg };
52706f32e7eSjoerg 
52806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
52906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
53006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
53106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
53206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
53306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
53406f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
53506f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40>
53606f32e7eSjoerg struct Types40 {
53706f32e7eSjoerg   typedef T1 Head;
53806f32e7eSjoerg   typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
53906f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
54006f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
54106f32e7eSjoerg };
54206f32e7eSjoerg 
54306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
54406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
54506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
54606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
54706f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
54806f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
54906f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
55006f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
55106f32e7eSjoerg     typename T41>
55206f32e7eSjoerg struct Types41 {
55306f32e7eSjoerg   typedef T1 Head;
55406f32e7eSjoerg   typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
55506f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
55606f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
55706f32e7eSjoerg };
55806f32e7eSjoerg 
55906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
56006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
56106f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
56206f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
56306f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
56406f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
56506f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
56606f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
56706f32e7eSjoerg     typename T41, typename T42>
56806f32e7eSjoerg struct Types42 {
56906f32e7eSjoerg   typedef T1 Head;
57006f32e7eSjoerg   typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
57106f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
57206f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
57306f32e7eSjoerg };
57406f32e7eSjoerg 
57506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
57606f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
57706f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
57806f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
57906f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
58006f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
58106f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
58206f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
58306f32e7eSjoerg     typename T41, typename T42, typename T43>
58406f32e7eSjoerg struct Types43 {
58506f32e7eSjoerg   typedef T1 Head;
58606f32e7eSjoerg   typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
58706f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
58806f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
58906f32e7eSjoerg       T43> Tail;
59006f32e7eSjoerg };
59106f32e7eSjoerg 
59206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
59306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
59406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
59506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
59606f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
59706f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
59806f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
59906f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
60006f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44>
60106f32e7eSjoerg struct Types44 {
60206f32e7eSjoerg   typedef T1 Head;
60306f32e7eSjoerg   typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
60406f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
60506f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
60606f32e7eSjoerg       T44> Tail;
60706f32e7eSjoerg };
60806f32e7eSjoerg 
60906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
61006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
61106f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
61206f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
61306f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
61406f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
61506f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
61606f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
61706f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45>
61806f32e7eSjoerg struct Types45 {
61906f32e7eSjoerg   typedef T1 Head;
62006f32e7eSjoerg   typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
62106f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
62206f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
62306f32e7eSjoerg       T44, T45> Tail;
62406f32e7eSjoerg };
62506f32e7eSjoerg 
62606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
62706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
62806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
62906f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
63006f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
63106f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
63206f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
63306f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
63406f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
63506f32e7eSjoerg     typename T46>
63606f32e7eSjoerg struct Types46 {
63706f32e7eSjoerg   typedef T1 Head;
63806f32e7eSjoerg   typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
63906f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
64006f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
64106f32e7eSjoerg       T44, T45, T46> Tail;
64206f32e7eSjoerg };
64306f32e7eSjoerg 
64406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
64506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
64606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
64706f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
64806f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
64906f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
65006f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
65106f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
65206f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
65306f32e7eSjoerg     typename T46, typename T47>
65406f32e7eSjoerg struct Types47 {
65506f32e7eSjoerg   typedef T1 Head;
65606f32e7eSjoerg   typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
65706f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
65806f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
65906f32e7eSjoerg       T44, T45, T46, T47> Tail;
66006f32e7eSjoerg };
66106f32e7eSjoerg 
66206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
66306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
66406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
66506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
66606f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
66706f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
66806f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
66906f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
67006f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
67106f32e7eSjoerg     typename T46, typename T47, typename T48>
67206f32e7eSjoerg struct Types48 {
67306f32e7eSjoerg   typedef T1 Head;
67406f32e7eSjoerg   typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
67506f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
67606f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
67706f32e7eSjoerg       T44, T45, T46, T47, T48> Tail;
67806f32e7eSjoerg };
67906f32e7eSjoerg 
68006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
68106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
68206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
68306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
68406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
68506f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
68606f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
68706f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
68806f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
68906f32e7eSjoerg     typename T46, typename T47, typename T48, typename T49>
69006f32e7eSjoerg struct Types49 {
69106f32e7eSjoerg   typedef T1 Head;
69206f32e7eSjoerg   typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
69306f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
69406f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
69506f32e7eSjoerg       T44, T45, T46, T47, T48, T49> Tail;
69606f32e7eSjoerg };
69706f32e7eSjoerg 
69806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
69906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
70006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
70106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
70206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
70306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
70406f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
70506f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
70606f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
70706f32e7eSjoerg     typename T46, typename T47, typename T48, typename T49, typename T50>
70806f32e7eSjoerg struct Types50 {
70906f32e7eSjoerg   typedef T1 Head;
71006f32e7eSjoerg   typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
71106f32e7eSjoerg       T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
71206f32e7eSjoerg       T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
71306f32e7eSjoerg       T44, T45, T46, T47, T48, T49, T50> Tail;
71406f32e7eSjoerg };
71506f32e7eSjoerg 
71606f32e7eSjoerg 
71706f32e7eSjoerg }  // namespace internal
71806f32e7eSjoerg 
71906f32e7eSjoerg // We don't want to require the users to write TypesN<...> directly,
72006f32e7eSjoerg // as that would require them to count the length.  Types<...> is much
72106f32e7eSjoerg // easier to write, but generates horrible messages when there is a
72206f32e7eSjoerg // compiler error, as gcc insists on printing out each template
72306f32e7eSjoerg // argument, even if it has the default value (this means Types<int>
72406f32e7eSjoerg // will appear as Types<int, None, None, ..., None> in the compiler
72506f32e7eSjoerg // errors).
72606f32e7eSjoerg //
72706f32e7eSjoerg // Our solution is to combine the best part of the two approaches: a
72806f32e7eSjoerg // user would write Types<T1, ..., TN>, and Google Test will translate
72906f32e7eSjoerg // that to TypesN<T1, ..., TN> internally to make error messages
73006f32e7eSjoerg // readable.  The translation is done by the 'type' member of the
73106f32e7eSjoerg // Types template.
73206f32e7eSjoerg template <typename T1 = internal::None, typename T2 = internal::None,
73306f32e7eSjoerg     typename T3 = internal::None, typename T4 = internal::None,
73406f32e7eSjoerg     typename T5 = internal::None, typename T6 = internal::None,
73506f32e7eSjoerg     typename T7 = internal::None, typename T8 = internal::None,
73606f32e7eSjoerg     typename T9 = internal::None, typename T10 = internal::None,
73706f32e7eSjoerg     typename T11 = internal::None, typename T12 = internal::None,
73806f32e7eSjoerg     typename T13 = internal::None, typename T14 = internal::None,
73906f32e7eSjoerg     typename T15 = internal::None, typename T16 = internal::None,
74006f32e7eSjoerg     typename T17 = internal::None, typename T18 = internal::None,
74106f32e7eSjoerg     typename T19 = internal::None, typename T20 = internal::None,
74206f32e7eSjoerg     typename T21 = internal::None, typename T22 = internal::None,
74306f32e7eSjoerg     typename T23 = internal::None, typename T24 = internal::None,
74406f32e7eSjoerg     typename T25 = internal::None, typename T26 = internal::None,
74506f32e7eSjoerg     typename T27 = internal::None, typename T28 = internal::None,
74606f32e7eSjoerg     typename T29 = internal::None, typename T30 = internal::None,
74706f32e7eSjoerg     typename T31 = internal::None, typename T32 = internal::None,
74806f32e7eSjoerg     typename T33 = internal::None, typename T34 = internal::None,
74906f32e7eSjoerg     typename T35 = internal::None, typename T36 = internal::None,
75006f32e7eSjoerg     typename T37 = internal::None, typename T38 = internal::None,
75106f32e7eSjoerg     typename T39 = internal::None, typename T40 = internal::None,
75206f32e7eSjoerg     typename T41 = internal::None, typename T42 = internal::None,
75306f32e7eSjoerg     typename T43 = internal::None, typename T44 = internal::None,
75406f32e7eSjoerg     typename T45 = internal::None, typename T46 = internal::None,
75506f32e7eSjoerg     typename T47 = internal::None, typename T48 = internal::None,
75606f32e7eSjoerg     typename T49 = internal::None, typename T50 = internal::None>
75706f32e7eSjoerg struct Types {
75806f32e7eSjoerg   typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
75906f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
76006f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
76106f32e7eSjoerg       T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
76206f32e7eSjoerg };
76306f32e7eSjoerg 
76406f32e7eSjoerg template <>
76506f32e7eSjoerg struct Types<internal::None, internal::None, internal::None, internal::None,
76606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
76706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
76806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
76906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
77706f32e7eSjoerg     internal::None, internal::None> {
77806f32e7eSjoerg   typedef internal::Types0 type;
77906f32e7eSjoerg };
78006f32e7eSjoerg template <typename T1>
78106f32e7eSjoerg struct Types<T1, internal::None, internal::None, internal::None,
78206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
78906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
79006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
79106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
79206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
79306f32e7eSjoerg     internal::None, internal::None> {
79406f32e7eSjoerg   typedef internal::Types1<T1> type;
79506f32e7eSjoerg };
79606f32e7eSjoerg template <typename T1, typename T2>
79706f32e7eSjoerg struct Types<T1, T2, internal::None, internal::None, internal::None,
79806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
79906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
80906f32e7eSjoerg     internal::None> {
81006f32e7eSjoerg   typedef internal::Types2<T1, T2> type;
81106f32e7eSjoerg };
81206f32e7eSjoerg template <typename T1, typename T2, typename T3>
81306f32e7eSjoerg struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
81406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
81506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
81606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
81706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
81806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
81906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
82006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
82106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
82206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
82306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
82406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
82506f32e7eSjoerg   typedef internal::Types3<T1, T2, T3> type;
82606f32e7eSjoerg };
82706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4>
82806f32e7eSjoerg struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
82906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
83906f32e7eSjoerg     internal::None, internal::None, internal::None> {
84006f32e7eSjoerg   typedef internal::Types4<T1, T2, T3, T4> type;
84106f32e7eSjoerg };
84206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5>
84306f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
84406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
84506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
84606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
84706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
84806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
84906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
85006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
85106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
85206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
85306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
85406f32e7eSjoerg     internal::None, internal::None, internal::None> {
85506f32e7eSjoerg   typedef internal::Types5<T1, T2, T3, T4, T5> type;
85606f32e7eSjoerg };
85706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
85806f32e7eSjoerg     typename T6>
85906f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
86006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
86906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
87006f32e7eSjoerg     internal::None, internal::None> {
87106f32e7eSjoerg   typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
87206f32e7eSjoerg };
87306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
87406f32e7eSjoerg     typename T6, typename T7>
87506f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
87606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
87706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
87806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
87906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
88606f32e7eSjoerg     internal::None> {
88706f32e7eSjoerg   typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
88806f32e7eSjoerg };
88906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
89006f32e7eSjoerg     typename T6, typename T7, typename T8>
89106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
89206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
89906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
90006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
90106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
90206f32e7eSjoerg   typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
90306f32e7eSjoerg };
90406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
90506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9>
90606f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
90706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
90806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
90906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
91606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
91706f32e7eSjoerg   typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
91806f32e7eSjoerg };
91906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
92006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10>
92106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
92206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
92906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
93006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
93106f32e7eSjoerg     internal::None, internal::None, internal::None> {
93206f32e7eSjoerg   typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
93306f32e7eSjoerg };
93406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
93506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
93606f32e7eSjoerg     typename T11>
93706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
93806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
93906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
94706f32e7eSjoerg     internal::None, internal::None> {
94806f32e7eSjoerg   typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
94906f32e7eSjoerg };
95006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
95106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
95206f32e7eSjoerg     typename T11, typename T12>
95306f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
95406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
95506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
95606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
95706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
95806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
95906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
96006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
96106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
96206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
96306f32e7eSjoerg     internal::None> {
96406f32e7eSjoerg   typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
96506f32e7eSjoerg       T12> type;
96606f32e7eSjoerg };
96706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
96806f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
96906f32e7eSjoerg     typename T11, typename T12, typename T13>
97006f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
97106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
97906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
98006f32e7eSjoerg     internal::None> {
98106f32e7eSjoerg   typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
98206f32e7eSjoerg       T13> type;
98306f32e7eSjoerg };
98406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
98506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
98606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14>
98706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
98806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
98906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
99606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
99706f32e7eSjoerg   typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
99806f32e7eSjoerg       T13, T14> type;
99906f32e7eSjoerg };
100006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
100106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
100206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15>
100306f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
100406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
100506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
100606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
100706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
100806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
100906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
101006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
101106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
101206f32e7eSjoerg     internal::None, internal::None, internal::None> {
101306f32e7eSjoerg   typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
101406f32e7eSjoerg       T13, T14, T15> type;
101506f32e7eSjoerg };
101606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
101706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
101806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
101906f32e7eSjoerg     typename T16>
102006f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
102106f32e7eSjoerg     T16, internal::None, internal::None, internal::None, internal::None,
102206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
102906f32e7eSjoerg     internal::None, internal::None> {
103006f32e7eSjoerg   typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
103106f32e7eSjoerg       T13, T14, T15, T16> type;
103206f32e7eSjoerg };
103306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
103406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
103506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
103606f32e7eSjoerg     typename T16, typename T17>
103706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
103806f32e7eSjoerg     T16, T17, internal::None, internal::None, internal::None, internal::None,
103906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
104606f32e7eSjoerg     internal::None> {
104706f32e7eSjoerg   typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
104806f32e7eSjoerg       T13, T14, T15, T16, T17> type;
104906f32e7eSjoerg };
105006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
105106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
105206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
105306f32e7eSjoerg     typename T16, typename T17, typename T18>
105406f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
105506f32e7eSjoerg     T16, T17, T18, internal::None, internal::None, internal::None,
105606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
105706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
105806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
105906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
106006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
106106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
106206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
106306f32e7eSjoerg     internal::None> {
106406f32e7eSjoerg   typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
106506f32e7eSjoerg       T13, T14, T15, T16, T17, T18> type;
106606f32e7eSjoerg };
106706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
106806f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
106906f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
107006f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19>
107106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
107206f32e7eSjoerg     T16, T17, T18, T19, internal::None, internal::None, internal::None,
107306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
107406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
107506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
107606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
107706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
107806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
107906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
108006f32e7eSjoerg   typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
108106f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19> type;
108206f32e7eSjoerg };
108306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
108406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
108506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
108606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20>
108706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
108806f32e7eSjoerg     T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
108906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
109006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
109106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
109206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
109306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
109406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
109506f32e7eSjoerg     internal::None, internal::None, internal::None> {
109606f32e7eSjoerg   typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
109706f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20> type;
109806f32e7eSjoerg };
109906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
110006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
110106f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
110206f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
110306f32e7eSjoerg     typename T21>
110406f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
110506f32e7eSjoerg     T16, T17, T18, T19, T20, T21, internal::None, internal::None,
110606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
110706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
110806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
110906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
111006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
111106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
111206f32e7eSjoerg     internal::None, internal::None, internal::None> {
111306f32e7eSjoerg   typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
111406f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
111506f32e7eSjoerg };
111606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
111706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
111806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
111906f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
112006f32e7eSjoerg     typename T21, typename T22>
112106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
112206f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
112306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
112406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
112506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
112606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
112706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
112806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
112906f32e7eSjoerg     internal::None, internal::None> {
113006f32e7eSjoerg   typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
113106f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
113206f32e7eSjoerg };
113306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
113406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
113506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
113606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
113706f32e7eSjoerg     typename T21, typename T22, typename T23>
113806f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
113906f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
114006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
114106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
114206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
114306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
114406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
114506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
114606f32e7eSjoerg     internal::None> {
114706f32e7eSjoerg   typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
114806f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
114906f32e7eSjoerg };
115006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
115106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
115206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
115306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
115406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24>
115506f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
115606f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
115706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
115806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
115906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
116006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
116106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
116206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
116306f32e7eSjoerg     internal::None> {
116406f32e7eSjoerg   typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
116506f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
116606f32e7eSjoerg };
116706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
116806f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
116906f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
117006f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
117106f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25>
117206f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
117306f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
117406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
117506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
117606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
117706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
117806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
117906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
118006f32e7eSjoerg   typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
118106f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
118206f32e7eSjoerg };
118306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
118406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
118506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
118606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
118706f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
118806f32e7eSjoerg     typename T26>
118906f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
119006f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
119106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
119206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
119306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
119406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
119506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
119606f32e7eSjoerg     internal::None, internal::None, internal::None> {
119706f32e7eSjoerg   typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
119806f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
119906f32e7eSjoerg       T26> type;
120006f32e7eSjoerg };
120106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
120206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
120306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
120406f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
120506f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
120606f32e7eSjoerg     typename T26, typename T27>
120706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
120806f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
120906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
121006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
121106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
121206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
121306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
121406f32e7eSjoerg     internal::None, internal::None> {
121506f32e7eSjoerg   typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
121606f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
121706f32e7eSjoerg       T27> type;
121806f32e7eSjoerg };
121906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
122006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
122106f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
122206f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
122306f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
122406f32e7eSjoerg     typename T26, typename T27, typename T28>
122506f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
122606f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
122706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
122806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
122906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
123006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
123106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
123206f32e7eSjoerg     internal::None, internal::None> {
123306f32e7eSjoerg   typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
123406f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
123506f32e7eSjoerg       T27, T28> type;
123606f32e7eSjoerg };
123706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
123806f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
123906f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
124006f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
124106f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
124206f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29>
124306f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
124406f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
124506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
124606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
124706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
124806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
124906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
125006f32e7eSjoerg     internal::None> {
125106f32e7eSjoerg   typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
125206f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
125306f32e7eSjoerg       T27, T28, T29> type;
125406f32e7eSjoerg };
125506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
125606f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
125706f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
125806f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
125906f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
126006f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30>
126106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
126206f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
126306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
126406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
126506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
126606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
126706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
126806f32e7eSjoerg   typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
126906f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
127006f32e7eSjoerg       T27, T28, T29, T30> type;
127106f32e7eSjoerg };
127206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
127306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
127406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
127506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
127606f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
127706f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
127806f32e7eSjoerg     typename T31>
127906f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
128006f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
128106f32e7eSjoerg     T31, internal::None, internal::None, internal::None, internal::None,
128206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
128306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
128406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
128506f32e7eSjoerg     internal::None, internal::None, internal::None> {
128606f32e7eSjoerg   typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
128706f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
128806f32e7eSjoerg       T27, T28, T29, T30, T31> type;
128906f32e7eSjoerg };
129006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
129106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
129206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
129306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
129406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
129506f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
129606f32e7eSjoerg     typename T31, typename T32>
129706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
129806f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
129906f32e7eSjoerg     T31, T32, internal::None, internal::None, internal::None, internal::None,
130006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
130106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
130206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
130306f32e7eSjoerg     internal::None, internal::None> {
130406f32e7eSjoerg   typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
130506f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
130606f32e7eSjoerg       T27, T28, T29, T30, T31, T32> type;
130706f32e7eSjoerg };
130806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
130906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
131006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
131106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
131206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
131306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
131406f32e7eSjoerg     typename T31, typename T32, typename T33>
131506f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
131606f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
131706f32e7eSjoerg     T31, T32, T33, internal::None, internal::None, internal::None,
131806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
131906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
132006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
132106f32e7eSjoerg     internal::None, internal::None> {
132206f32e7eSjoerg   typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
132306f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
132406f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33> type;
132506f32e7eSjoerg };
132606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
132706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
132806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
132906f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
133006f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
133106f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
133206f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34>
133306f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
133406f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
133506f32e7eSjoerg     T31, T32, T33, T34, internal::None, internal::None, internal::None,
133606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
133706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
133806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
133906f32e7eSjoerg     internal::None> {
134006f32e7eSjoerg   typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
134106f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
134206f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34> type;
134306f32e7eSjoerg };
134406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
134506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
134606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
134706f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
134806f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
134906f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
135006f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35>
135106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
135206f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
135306f32e7eSjoerg     T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
135406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
135506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
135606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
135706f32e7eSjoerg   typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
135806f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
135906f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
136006f32e7eSjoerg };
136106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
136206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
136306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
136406f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
136506f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
136606f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
136706f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
136806f32e7eSjoerg     typename T36>
136906f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
137006f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
137106f32e7eSjoerg     T31, T32, T33, T34, T35, T36, internal::None, internal::None,
137206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
137306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
137406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
137506f32e7eSjoerg   typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
137606f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
137706f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
137806f32e7eSjoerg };
137906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
138006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
138106f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
138206f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
138306f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
138406f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
138506f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
138606f32e7eSjoerg     typename T36, typename T37>
138706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
138806f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
138906f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
139006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
139106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
139206f32e7eSjoerg     internal::None, internal::None, internal::None> {
139306f32e7eSjoerg   typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
139406f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
139506f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
139606f32e7eSjoerg };
139706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
139806f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
139906f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
140006f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
140106f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
140206f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
140306f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
140406f32e7eSjoerg     typename T36, typename T37, typename T38>
140506f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
140606f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
140706f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
140806f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
140906f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
141006f32e7eSjoerg     internal::None, internal::None> {
141106f32e7eSjoerg   typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
141206f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
141306f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
141406f32e7eSjoerg };
141506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
141606f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
141706f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
141806f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
141906f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
142006f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
142106f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
142206f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39>
142306f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
142406f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
142506f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
142606f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
142706f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
142806f32e7eSjoerg     internal::None, internal::None> {
142906f32e7eSjoerg   typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
143006f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
143106f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
143206f32e7eSjoerg };
143306f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
143406f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
143506f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
143606f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
143706f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
143806f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
143906f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
144006f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40>
144106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
144206f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
144306f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
144406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
144506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
144606f32e7eSjoerg     internal::None> {
144706f32e7eSjoerg   typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
144806f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
144906f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
145006f32e7eSjoerg       T40> type;
145106f32e7eSjoerg };
145206f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
145306f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
145406f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
145506f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
145606f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
145706f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
145806f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
145906f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
146006f32e7eSjoerg     typename T41>
146106f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
146206f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
146306f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
146406f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
146506f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None> {
146606f32e7eSjoerg   typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
146706f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
146806f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
146906f32e7eSjoerg       T41> type;
147006f32e7eSjoerg };
147106f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
147206f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
147306f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
147406f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
147506f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
147606f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
147706f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
147806f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
147906f32e7eSjoerg     typename T41, typename T42>
148006f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
148106f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
148206f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
148306f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
148406f32e7eSjoerg     internal::None, internal::None, internal::None> {
148506f32e7eSjoerg   typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
148606f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
148706f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
148806f32e7eSjoerg       T41, T42> type;
148906f32e7eSjoerg };
149006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
149106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
149206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
149306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
149406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
149506f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
149606f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
149706f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
149806f32e7eSjoerg     typename T41, typename T42, typename T43>
149906f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
150006f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
150106f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
150206f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
150306f32e7eSjoerg     internal::None, internal::None, internal::None> {
150406f32e7eSjoerg   typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
150506f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
150606f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
150706f32e7eSjoerg       T41, T42, T43> type;
150806f32e7eSjoerg };
150906f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
151006f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
151106f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
151206f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
151306f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
151406f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
151506f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
151606f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
151706f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44>
151806f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
151906f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
152006f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
152106f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
152206f32e7eSjoerg     internal::None, internal::None> {
152306f32e7eSjoerg   typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
152406f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
152506f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
152606f32e7eSjoerg       T41, T42, T43, T44> type;
152706f32e7eSjoerg };
152806f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
152906f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
153006f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
153106f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
153206f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
153306f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
153406f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
153506f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
153606f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45>
153706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
153806f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
153906f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
154006f32e7eSjoerg     internal::None, internal::None, internal::None, internal::None,
154106f32e7eSjoerg     internal::None> {
154206f32e7eSjoerg   typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
154306f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
154406f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
154506f32e7eSjoerg       T41, T42, T43, T44, T45> type;
154606f32e7eSjoerg };
154706f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
154806f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
154906f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
155006f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
155106f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
155206f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
155306f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
155406f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
155506f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
155606f32e7eSjoerg     typename T46>
155706f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
155806f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
155906f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
156006f32e7eSjoerg     T46, internal::None, internal::None, internal::None, internal::None> {
156106f32e7eSjoerg   typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
156206f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
156306f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
156406f32e7eSjoerg       T41, T42, T43, T44, T45, T46> type;
156506f32e7eSjoerg };
156606f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
156706f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
156806f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
156906f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
157006f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
157106f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
157206f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
157306f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
157406f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
157506f32e7eSjoerg     typename T46, typename T47>
157606f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
157706f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
157806f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
157906f32e7eSjoerg     T46, T47, internal::None, internal::None, internal::None> {
158006f32e7eSjoerg   typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
158106f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
158206f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
158306f32e7eSjoerg       T41, T42, T43, T44, T45, T46, T47> type;
158406f32e7eSjoerg };
158506f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
158606f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
158706f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
158806f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
158906f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
159006f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
159106f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
159206f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
159306f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
159406f32e7eSjoerg     typename T46, typename T47, typename T48>
159506f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
159606f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
159706f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
159806f32e7eSjoerg     T46, T47, T48, internal::None, internal::None> {
159906f32e7eSjoerg   typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
160006f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
160106f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
160206f32e7eSjoerg       T41, T42, T43, T44, T45, T46, T47, T48> type;
160306f32e7eSjoerg };
160406f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
160506f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
160606f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
160706f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
160806f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
160906f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
161006f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
161106f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
161206f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
161306f32e7eSjoerg     typename T46, typename T47, typename T48, typename T49>
161406f32e7eSjoerg struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
161506f32e7eSjoerg     T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
161606f32e7eSjoerg     T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
161706f32e7eSjoerg     T46, T47, T48, T49, internal::None> {
161806f32e7eSjoerg   typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
161906f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
162006f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
162106f32e7eSjoerg       T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
162206f32e7eSjoerg };
162306f32e7eSjoerg 
162406f32e7eSjoerg namespace internal {
162506f32e7eSjoerg 
162606f32e7eSjoerg # define GTEST_TEMPLATE_ template <typename T> class
162706f32e7eSjoerg 
162806f32e7eSjoerg // The template "selector" struct TemplateSel<Tmpl> is used to
162906f32e7eSjoerg // represent Tmpl, which must be a class template with one type
163006f32e7eSjoerg // parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
163106f32e7eSjoerg // as the type Tmpl<T>.  This allows us to actually instantiate the
163206f32e7eSjoerg // template "selected" by TemplateSel<Tmpl>.
163306f32e7eSjoerg //
163406f32e7eSjoerg // This trick is necessary for simulating typedef for class templates,
163506f32e7eSjoerg // which C++ doesn't support directly.
163606f32e7eSjoerg template <GTEST_TEMPLATE_ Tmpl>
163706f32e7eSjoerg struct TemplateSel {
163806f32e7eSjoerg   template <typename T>
163906f32e7eSjoerg   struct Bind {
164006f32e7eSjoerg     typedef Tmpl<T> type;
164106f32e7eSjoerg   };
164206f32e7eSjoerg };
164306f32e7eSjoerg 
164406f32e7eSjoerg # define GTEST_BIND_(TmplSel, T) \
164506f32e7eSjoerg   TmplSel::template Bind<T>::type
164606f32e7eSjoerg 
164706f32e7eSjoerg // A unique struct template used as the default value for the
164806f32e7eSjoerg // arguments of class template Templates.  This allows us to simulate
164906f32e7eSjoerg // variadic templates (e.g. Templates<int>, Templates<int, double>,
165006f32e7eSjoerg // and etc), which C++ doesn't support directly.
165106f32e7eSjoerg template <typename T>
165206f32e7eSjoerg struct NoneT {};
165306f32e7eSjoerg 
165406f32e7eSjoerg // The following family of struct and struct templates are used to
165506f32e7eSjoerg // represent template lists.  In particular, TemplatesN<T1, T2, ...,
165606f32e7eSjoerg // TN> represents a list of N templates (T1, T2, ..., and TN).  Except
165706f32e7eSjoerg // for Templates0, every struct in the family has two member types:
165806f32e7eSjoerg // Head for the selector of the first template in the list, and Tail
165906f32e7eSjoerg // for the rest of the list.
166006f32e7eSjoerg 
166106f32e7eSjoerg // The empty template list.
166206f32e7eSjoerg struct Templates0 {};
166306f32e7eSjoerg 
166406f32e7eSjoerg // Template lists of length 1, 2, 3, and so on.
166506f32e7eSjoerg 
166606f32e7eSjoerg template <GTEST_TEMPLATE_ T1>
166706f32e7eSjoerg struct Templates1 {
166806f32e7eSjoerg   typedef TemplateSel<T1> Head;
166906f32e7eSjoerg   typedef Templates0 Tail;
167006f32e7eSjoerg };
167106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
167206f32e7eSjoerg struct Templates2 {
167306f32e7eSjoerg   typedef TemplateSel<T1> Head;
167406f32e7eSjoerg   typedef Templates1<T2> Tail;
167506f32e7eSjoerg };
167606f32e7eSjoerg 
167706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
167806f32e7eSjoerg struct Templates3 {
167906f32e7eSjoerg   typedef TemplateSel<T1> Head;
168006f32e7eSjoerg   typedef Templates2<T2, T3> Tail;
168106f32e7eSjoerg };
168206f32e7eSjoerg 
168306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
168406f32e7eSjoerg     GTEST_TEMPLATE_ T4>
168506f32e7eSjoerg struct Templates4 {
168606f32e7eSjoerg   typedef TemplateSel<T1> Head;
168706f32e7eSjoerg   typedef Templates3<T2, T3, T4> Tail;
168806f32e7eSjoerg };
168906f32e7eSjoerg 
169006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
169106f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
169206f32e7eSjoerg struct Templates5 {
169306f32e7eSjoerg   typedef TemplateSel<T1> Head;
169406f32e7eSjoerg   typedef Templates4<T2, T3, T4, T5> Tail;
169506f32e7eSjoerg };
169606f32e7eSjoerg 
169706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
169806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
169906f32e7eSjoerg struct Templates6 {
170006f32e7eSjoerg   typedef TemplateSel<T1> Head;
170106f32e7eSjoerg   typedef Templates5<T2, T3, T4, T5, T6> Tail;
170206f32e7eSjoerg };
170306f32e7eSjoerg 
170406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
170506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
170606f32e7eSjoerg     GTEST_TEMPLATE_ T7>
170706f32e7eSjoerg struct Templates7 {
170806f32e7eSjoerg   typedef TemplateSel<T1> Head;
170906f32e7eSjoerg   typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
171006f32e7eSjoerg };
171106f32e7eSjoerg 
171206f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
171306f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
171406f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
171506f32e7eSjoerg struct Templates8 {
171606f32e7eSjoerg   typedef TemplateSel<T1> Head;
171706f32e7eSjoerg   typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
171806f32e7eSjoerg };
171906f32e7eSjoerg 
172006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
172106f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
172206f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
172306f32e7eSjoerg struct Templates9 {
172406f32e7eSjoerg   typedef TemplateSel<T1> Head;
172506f32e7eSjoerg   typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
172606f32e7eSjoerg };
172706f32e7eSjoerg 
172806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
172906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
173006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
173106f32e7eSjoerg     GTEST_TEMPLATE_ T10>
173206f32e7eSjoerg struct Templates10 {
173306f32e7eSjoerg   typedef TemplateSel<T1> Head;
173406f32e7eSjoerg   typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
173506f32e7eSjoerg };
173606f32e7eSjoerg 
173706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
173806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
173906f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
174006f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
174106f32e7eSjoerg struct Templates11 {
174206f32e7eSjoerg   typedef TemplateSel<T1> Head;
174306f32e7eSjoerg   typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
174406f32e7eSjoerg };
174506f32e7eSjoerg 
174606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
174706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
174806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
174906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
175006f32e7eSjoerg struct Templates12 {
175106f32e7eSjoerg   typedef TemplateSel<T1> Head;
175206f32e7eSjoerg   typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
175306f32e7eSjoerg };
175406f32e7eSjoerg 
175506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
175606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
175706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
175806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
175906f32e7eSjoerg     GTEST_TEMPLATE_ T13>
176006f32e7eSjoerg struct Templates13 {
176106f32e7eSjoerg   typedef TemplateSel<T1> Head;
176206f32e7eSjoerg   typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
176306f32e7eSjoerg };
176406f32e7eSjoerg 
176506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
176606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
176706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
176806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
176906f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
177006f32e7eSjoerg struct Templates14 {
177106f32e7eSjoerg   typedef TemplateSel<T1> Head;
177206f32e7eSjoerg   typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
177306f32e7eSjoerg       T14> Tail;
177406f32e7eSjoerg };
177506f32e7eSjoerg 
177606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
177706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
177806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
177906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
178006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
178106f32e7eSjoerg struct Templates15 {
178206f32e7eSjoerg   typedef TemplateSel<T1> Head;
178306f32e7eSjoerg   typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
178406f32e7eSjoerg       T15> Tail;
178506f32e7eSjoerg };
178606f32e7eSjoerg 
178706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
178806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
178906f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
179006f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
179106f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
179206f32e7eSjoerg     GTEST_TEMPLATE_ T16>
179306f32e7eSjoerg struct Templates16 {
179406f32e7eSjoerg   typedef TemplateSel<T1> Head;
179506f32e7eSjoerg   typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
179606f32e7eSjoerg       T15, T16> Tail;
179706f32e7eSjoerg };
179806f32e7eSjoerg 
179906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
180006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
180106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
180206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
180306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
180406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
180506f32e7eSjoerg struct Templates17 {
180606f32e7eSjoerg   typedef TemplateSel<T1> Head;
180706f32e7eSjoerg   typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
180806f32e7eSjoerg       T15, T16, T17> Tail;
180906f32e7eSjoerg };
181006f32e7eSjoerg 
181106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
181206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
181306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
181406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
181506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
181606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
181706f32e7eSjoerg struct Templates18 {
181806f32e7eSjoerg   typedef TemplateSel<T1> Head;
181906f32e7eSjoerg   typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
182006f32e7eSjoerg       T15, T16, T17, T18> Tail;
182106f32e7eSjoerg };
182206f32e7eSjoerg 
182306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
182406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
182506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
182606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
182706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
182806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
182906f32e7eSjoerg     GTEST_TEMPLATE_ T19>
183006f32e7eSjoerg struct Templates19 {
183106f32e7eSjoerg   typedef TemplateSel<T1> Head;
183206f32e7eSjoerg   typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
183306f32e7eSjoerg       T15, T16, T17, T18, T19> Tail;
183406f32e7eSjoerg };
183506f32e7eSjoerg 
183606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
183706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
183806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
183906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
184006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
184106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
184206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
184306f32e7eSjoerg struct Templates20 {
184406f32e7eSjoerg   typedef TemplateSel<T1> Head;
184506f32e7eSjoerg   typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
184606f32e7eSjoerg       T15, T16, T17, T18, T19, T20> Tail;
184706f32e7eSjoerg };
184806f32e7eSjoerg 
184906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
185006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
185106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
185206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
185306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
185406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
185506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
185606f32e7eSjoerg struct Templates21 {
185706f32e7eSjoerg   typedef TemplateSel<T1> Head;
185806f32e7eSjoerg   typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
185906f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21> Tail;
186006f32e7eSjoerg };
186106f32e7eSjoerg 
186206f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
186306f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
186406f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
186506f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
186606f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
186706f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
186806f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
186906f32e7eSjoerg     GTEST_TEMPLATE_ T22>
187006f32e7eSjoerg struct Templates22 {
187106f32e7eSjoerg   typedef TemplateSel<T1> Head;
187206f32e7eSjoerg   typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
187306f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22> Tail;
187406f32e7eSjoerg };
187506f32e7eSjoerg 
187606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
187706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
187806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
187906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
188006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
188106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
188206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
188306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
188406f32e7eSjoerg struct Templates23 {
188506f32e7eSjoerg   typedef TemplateSel<T1> Head;
188606f32e7eSjoerg   typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
188706f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
188806f32e7eSjoerg };
188906f32e7eSjoerg 
189006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
189106f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
189206f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
189306f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
189406f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
189506f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
189606f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
189706f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
189806f32e7eSjoerg struct Templates24 {
189906f32e7eSjoerg   typedef TemplateSel<T1> Head;
190006f32e7eSjoerg   typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
190106f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
190206f32e7eSjoerg };
190306f32e7eSjoerg 
190406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
190506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
190606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
190706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
190806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
190906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
191006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
191106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
191206f32e7eSjoerg     GTEST_TEMPLATE_ T25>
191306f32e7eSjoerg struct Templates25 {
191406f32e7eSjoerg   typedef TemplateSel<T1> Head;
191506f32e7eSjoerg   typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
191606f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
191706f32e7eSjoerg };
191806f32e7eSjoerg 
191906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
192006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
192106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
192206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
192306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
192406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
192506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
192606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
192706f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
192806f32e7eSjoerg struct Templates26 {
192906f32e7eSjoerg   typedef TemplateSel<T1> Head;
193006f32e7eSjoerg   typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
193106f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
193206f32e7eSjoerg };
193306f32e7eSjoerg 
193406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
193506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
193606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
193706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
193806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
193906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
194006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
194106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
194206f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
194306f32e7eSjoerg struct Templates27 {
194406f32e7eSjoerg   typedef TemplateSel<T1> Head;
194506f32e7eSjoerg   typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
194606f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
194706f32e7eSjoerg };
194806f32e7eSjoerg 
194906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
195006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
195106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
195206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
195306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
195406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
195506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
195606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
195706f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
195806f32e7eSjoerg     GTEST_TEMPLATE_ T28>
195906f32e7eSjoerg struct Templates28 {
196006f32e7eSjoerg   typedef TemplateSel<T1> Head;
196106f32e7eSjoerg   typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
196206f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
196306f32e7eSjoerg       T28> Tail;
196406f32e7eSjoerg };
196506f32e7eSjoerg 
196606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
196706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
196806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
196906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
197006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
197106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
197206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
197306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
197406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
197506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
197606f32e7eSjoerg struct Templates29 {
197706f32e7eSjoerg   typedef TemplateSel<T1> Head;
197806f32e7eSjoerg   typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
197906f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
198006f32e7eSjoerg       T29> Tail;
198106f32e7eSjoerg };
198206f32e7eSjoerg 
198306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
198406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
198506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
198606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
198706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
198806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
198906f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
199006f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
199106f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
199206f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
199306f32e7eSjoerg struct Templates30 {
199406f32e7eSjoerg   typedef TemplateSel<T1> Head;
199506f32e7eSjoerg   typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
199606f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
199706f32e7eSjoerg       T29, T30> Tail;
199806f32e7eSjoerg };
199906f32e7eSjoerg 
200006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
200106f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
200206f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
200306f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
200406f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
200506f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
200606f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
200706f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
200806f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
200906f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
201006f32e7eSjoerg     GTEST_TEMPLATE_ T31>
201106f32e7eSjoerg struct Templates31 {
201206f32e7eSjoerg   typedef TemplateSel<T1> Head;
201306f32e7eSjoerg   typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
201406f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
201506f32e7eSjoerg       T29, T30, T31> Tail;
201606f32e7eSjoerg };
201706f32e7eSjoerg 
201806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
201906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
202006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
202106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
202206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
202306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
202406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
202506f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
202606f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
202706f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
202806f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
202906f32e7eSjoerg struct Templates32 {
203006f32e7eSjoerg   typedef TemplateSel<T1> Head;
203106f32e7eSjoerg   typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
203206f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
203306f32e7eSjoerg       T29, T30, T31, T32> Tail;
203406f32e7eSjoerg };
203506f32e7eSjoerg 
203606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
203706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
203806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
203906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
204006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
204106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
204206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
204306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
204406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
204506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
204606f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
204706f32e7eSjoerg struct Templates33 {
204806f32e7eSjoerg   typedef TemplateSel<T1> Head;
204906f32e7eSjoerg   typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
205006f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
205106f32e7eSjoerg       T29, T30, T31, T32, T33> Tail;
205206f32e7eSjoerg };
205306f32e7eSjoerg 
205406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
205506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
205606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
205706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
205806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
205906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
206006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
206106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
206206f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
206306f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
206406f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
206506f32e7eSjoerg     GTEST_TEMPLATE_ T34>
206606f32e7eSjoerg struct Templates34 {
206706f32e7eSjoerg   typedef TemplateSel<T1> Head;
206806f32e7eSjoerg   typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
206906f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
207006f32e7eSjoerg       T29, T30, T31, T32, T33, T34> Tail;
207106f32e7eSjoerg };
207206f32e7eSjoerg 
207306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
207406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
207506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
207606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
207706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
207806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
207906f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
208006f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
208106f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
208206f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
208306f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
208406f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
208506f32e7eSjoerg struct Templates35 {
208606f32e7eSjoerg   typedef TemplateSel<T1> Head;
208706f32e7eSjoerg   typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
208806f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
208906f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35> Tail;
209006f32e7eSjoerg };
209106f32e7eSjoerg 
209206f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
209306f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
209406f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
209506f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
209606f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
209706f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
209806f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
209906f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
210006f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
210106f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
210206f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
210306f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
210406f32e7eSjoerg struct Templates36 {
210506f32e7eSjoerg   typedef TemplateSel<T1> Head;
210606f32e7eSjoerg   typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
210706f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
210806f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36> Tail;
210906f32e7eSjoerg };
211006f32e7eSjoerg 
211106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
211206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
211306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
211406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
211506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
211606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
211706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
211806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
211906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
212006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
212106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
212206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
212306f32e7eSjoerg     GTEST_TEMPLATE_ T37>
212406f32e7eSjoerg struct Templates37 {
212506f32e7eSjoerg   typedef TemplateSel<T1> Head;
212606f32e7eSjoerg   typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
212706f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
212806f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
212906f32e7eSjoerg };
213006f32e7eSjoerg 
213106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
213206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
213306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
213406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
213506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
213606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
213706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
213806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
213906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
214006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
214106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
214206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
214306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
214406f32e7eSjoerg struct Templates38 {
214506f32e7eSjoerg   typedef TemplateSel<T1> Head;
214606f32e7eSjoerg   typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
214706f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
214806f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
214906f32e7eSjoerg };
215006f32e7eSjoerg 
215106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
215206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
215306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
215406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
215506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
215606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
215706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
215806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
215906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
216006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
216106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
216206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
216306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
216406f32e7eSjoerg struct Templates39 {
216506f32e7eSjoerg   typedef TemplateSel<T1> Head;
216606f32e7eSjoerg   typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
216706f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
216806f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
216906f32e7eSjoerg };
217006f32e7eSjoerg 
217106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
217206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
217306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
217406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
217506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
217606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
217706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
217806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
217906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
218006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
218106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
218206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
218306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
218406f32e7eSjoerg     GTEST_TEMPLATE_ T40>
218506f32e7eSjoerg struct Templates40 {
218606f32e7eSjoerg   typedef TemplateSel<T1> Head;
218706f32e7eSjoerg   typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
218806f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
218906f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
219006f32e7eSjoerg };
219106f32e7eSjoerg 
219206f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
219306f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
219406f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
219506f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
219606f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
219706f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
219806f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
219906f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
220006f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
220106f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
220206f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
220306f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
220406f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
220506f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
220606f32e7eSjoerg struct Templates41 {
220706f32e7eSjoerg   typedef TemplateSel<T1> Head;
220806f32e7eSjoerg   typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
220906f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
221006f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
221106f32e7eSjoerg };
221206f32e7eSjoerg 
221306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
221406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
221506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
221606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
221706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
221806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
221906f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
222006f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
222106f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
222206f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
222306f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
222406f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
222506f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
222606f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
222706f32e7eSjoerg struct Templates42 {
222806f32e7eSjoerg   typedef TemplateSel<T1> Head;
222906f32e7eSjoerg   typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
223006f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
223106f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
223206f32e7eSjoerg       T42> Tail;
223306f32e7eSjoerg };
223406f32e7eSjoerg 
223506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
223606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
223706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
223806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
223906f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
224006f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
224106f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
224206f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
224306f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
224406f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
224506f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
224606f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
224706f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
224806f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
224906f32e7eSjoerg     GTEST_TEMPLATE_ T43>
225006f32e7eSjoerg struct Templates43 {
225106f32e7eSjoerg   typedef TemplateSel<T1> Head;
225206f32e7eSjoerg   typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
225306f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
225406f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
225506f32e7eSjoerg       T43> Tail;
225606f32e7eSjoerg };
225706f32e7eSjoerg 
225806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
225906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
226006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
226106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
226206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
226306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
226406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
226506f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
226606f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
226706f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
226806f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
226906f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
227006f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
227106f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
227206f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
227306f32e7eSjoerg struct Templates44 {
227406f32e7eSjoerg   typedef TemplateSel<T1> Head;
227506f32e7eSjoerg   typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
227606f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
227706f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
227806f32e7eSjoerg       T43, T44> Tail;
227906f32e7eSjoerg };
228006f32e7eSjoerg 
228106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
228206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
228306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
228406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
228506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
228606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
228706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
228806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
228906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
229006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
229106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
229206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
229306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
229406f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
229506f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
229606f32e7eSjoerg struct Templates45 {
229706f32e7eSjoerg   typedef TemplateSel<T1> Head;
229806f32e7eSjoerg   typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
229906f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
230006f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
230106f32e7eSjoerg       T43, T44, T45> Tail;
230206f32e7eSjoerg };
230306f32e7eSjoerg 
230406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
230506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
230606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
230706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
230806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
230906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
231006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
231106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
231206f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
231306f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
231406f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
231506f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
231606f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
231706f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
231806f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
231906f32e7eSjoerg     GTEST_TEMPLATE_ T46>
232006f32e7eSjoerg struct Templates46 {
232106f32e7eSjoerg   typedef TemplateSel<T1> Head;
232206f32e7eSjoerg   typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
232306f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
232406f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
232506f32e7eSjoerg       T43, T44, T45, T46> Tail;
232606f32e7eSjoerg };
232706f32e7eSjoerg 
232806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
232906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
233006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
233106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
233206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
233306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
233406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
233506f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
233606f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
233706f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
233806f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
233906f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
234006f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
234106f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
234206f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
234306f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
234406f32e7eSjoerg struct Templates47 {
234506f32e7eSjoerg   typedef TemplateSel<T1> Head;
234606f32e7eSjoerg   typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
234706f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
234806f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
234906f32e7eSjoerg       T43, T44, T45, T46, T47> Tail;
235006f32e7eSjoerg };
235106f32e7eSjoerg 
235206f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
235306f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
235406f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
235506f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
235606f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
235706f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
235806f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
235906f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
236006f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
236106f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
236206f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
236306f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
236406f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
236506f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
236606f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
236706f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
236806f32e7eSjoerg struct Templates48 {
236906f32e7eSjoerg   typedef TemplateSel<T1> Head;
237006f32e7eSjoerg   typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
237106f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
237206f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
237306f32e7eSjoerg       T43, T44, T45, T46, T47, T48> Tail;
237406f32e7eSjoerg };
237506f32e7eSjoerg 
237606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
237706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
237806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
237906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
238006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
238106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
238206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
238306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
238406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
238506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
238606f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
238706f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
238806f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
238906f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
239006f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
239106f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
239206f32e7eSjoerg     GTEST_TEMPLATE_ T49>
239306f32e7eSjoerg struct Templates49 {
239406f32e7eSjoerg   typedef TemplateSel<T1> Head;
239506f32e7eSjoerg   typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
239606f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
239706f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
239806f32e7eSjoerg       T43, T44, T45, T46, T47, T48, T49> Tail;
239906f32e7eSjoerg };
240006f32e7eSjoerg 
240106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
240206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
240306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
240406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
240506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
240606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
240706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
240806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
240906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
241006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
241106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
241206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
241306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
241406f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
241506f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
241606f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
241706f32e7eSjoerg     GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
241806f32e7eSjoerg struct Templates50 {
241906f32e7eSjoerg   typedef TemplateSel<T1> Head;
242006f32e7eSjoerg   typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
242106f32e7eSjoerg       T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
242206f32e7eSjoerg       T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
242306f32e7eSjoerg       T43, T44, T45, T46, T47, T48, T49, T50> Tail;
242406f32e7eSjoerg };
242506f32e7eSjoerg 
242606f32e7eSjoerg 
242706f32e7eSjoerg // We don't want to require the users to write TemplatesN<...> directly,
242806f32e7eSjoerg // as that would require them to count the length.  Templates<...> is much
242906f32e7eSjoerg // easier to write, but generates horrible messages when there is a
243006f32e7eSjoerg // compiler error, as gcc insists on printing out each template
243106f32e7eSjoerg // argument, even if it has the default value (this means Templates<list>
243206f32e7eSjoerg // will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
243306f32e7eSjoerg // errors).
243406f32e7eSjoerg //
243506f32e7eSjoerg // Our solution is to combine the best part of the two approaches: a
243606f32e7eSjoerg // user would write Templates<T1, ..., TN>, and Google Test will translate
243706f32e7eSjoerg // that to TemplatesN<T1, ..., TN> internally to make error messages
243806f32e7eSjoerg // readable.  The translation is done by the 'type' member of the
243906f32e7eSjoerg // Templates template.
244006f32e7eSjoerg template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
244106f32e7eSjoerg     GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
244206f32e7eSjoerg     GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
244306f32e7eSjoerg     GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
244406f32e7eSjoerg     GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
244506f32e7eSjoerg     GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
244606f32e7eSjoerg     GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
244706f32e7eSjoerg     GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
244806f32e7eSjoerg     GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
244906f32e7eSjoerg     GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
245006f32e7eSjoerg     GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
245106f32e7eSjoerg     GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
245206f32e7eSjoerg     GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
245306f32e7eSjoerg     GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
245406f32e7eSjoerg     GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
245506f32e7eSjoerg     GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
245606f32e7eSjoerg     GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
245706f32e7eSjoerg     GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
245806f32e7eSjoerg     GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
245906f32e7eSjoerg     GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
246006f32e7eSjoerg     GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
246106f32e7eSjoerg     GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
246206f32e7eSjoerg     GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
246306f32e7eSjoerg     GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
246406f32e7eSjoerg     GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
246506f32e7eSjoerg struct Templates {
246606f32e7eSjoerg   typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
246706f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
246806f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
246906f32e7eSjoerg       T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
247006f32e7eSjoerg };
247106f32e7eSjoerg 
247206f32e7eSjoerg template <>
247306f32e7eSjoerg struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
247406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
247506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
247606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
247706f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
247806f32e7eSjoerg     NoneT> {
247906f32e7eSjoerg   typedef Templates0 type;
248006f32e7eSjoerg };
248106f32e7eSjoerg template <GTEST_TEMPLATE_ T1>
248206f32e7eSjoerg struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
248306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
248406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
248506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
248606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
248706f32e7eSjoerg     NoneT> {
248806f32e7eSjoerg   typedef Templates1<T1> type;
248906f32e7eSjoerg };
249006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
249106f32e7eSjoerg struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
249206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
249306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
249406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
249506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
249606f32e7eSjoerg     NoneT> {
249706f32e7eSjoerg   typedef Templates2<T1, T2> type;
249806f32e7eSjoerg };
249906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
250006f32e7eSjoerg struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
250106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
250206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
250306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
250406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
250506f32e7eSjoerg   typedef Templates3<T1, T2, T3> type;
250606f32e7eSjoerg };
250706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
250806f32e7eSjoerg     GTEST_TEMPLATE_ T4>
250906f32e7eSjoerg struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
251006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
251106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
251206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
251306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
251406f32e7eSjoerg   typedef Templates4<T1, T2, T3, T4> type;
251506f32e7eSjoerg };
251606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
251706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
251806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
251906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
252006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
252106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
252206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
252306f32e7eSjoerg   typedef Templates5<T1, T2, T3, T4, T5> type;
252406f32e7eSjoerg };
252506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
252606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
252706f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
252806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
252906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
253006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
253106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
253206f32e7eSjoerg   typedef Templates6<T1, T2, T3, T4, T5, T6> type;
253306f32e7eSjoerg };
253406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
253506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
253606f32e7eSjoerg     GTEST_TEMPLATE_ T7>
253706f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
253806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
253906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
254006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
254106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
254206f32e7eSjoerg   typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
254306f32e7eSjoerg };
254406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
254506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
254606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
254706f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
254806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
254906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
255006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
255106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
255206f32e7eSjoerg   typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
255306f32e7eSjoerg };
255406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
255506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
255606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
255706f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
255806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
255906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
256006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
256106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
256206f32e7eSjoerg   typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
256306f32e7eSjoerg };
256406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
256506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
256606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
256706f32e7eSjoerg     GTEST_TEMPLATE_ T10>
256806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
256906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
257006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
257106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
257206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
257306f32e7eSjoerg   typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
257406f32e7eSjoerg };
257506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
257606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
257706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
257806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
257906f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
258006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
258106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
258206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
258306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
258406f32e7eSjoerg   typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
258506f32e7eSjoerg };
258606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
258706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
258806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
258906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
259006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
259106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
259206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
259306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
259406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
259506f32e7eSjoerg   typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
259606f32e7eSjoerg };
259706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
259806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
259906f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
260006f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
260106f32e7eSjoerg     GTEST_TEMPLATE_ T13>
260206f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
260306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
260406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
260506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
260606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
260706f32e7eSjoerg   typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
260806f32e7eSjoerg       T13> type;
260906f32e7eSjoerg };
261006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
261106f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
261206f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
261306f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
261406f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
261506f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
261606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
261706f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
261806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
261906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
262006f32e7eSjoerg   typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
262106f32e7eSjoerg       T14> type;
262206f32e7eSjoerg };
262306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
262406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
262506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
262606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
262706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
262806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
262906f32e7eSjoerg     T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
263006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
263106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
263206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT> {
263306f32e7eSjoerg   typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
263406f32e7eSjoerg       T14, T15> type;
263506f32e7eSjoerg };
263606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
263706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
263806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
263906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
264006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
264106f32e7eSjoerg     GTEST_TEMPLATE_ T16>
264206f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
264306f32e7eSjoerg     T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
264406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
264506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
264606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT> {
264706f32e7eSjoerg   typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
264806f32e7eSjoerg       T14, T15, T16> type;
264906f32e7eSjoerg };
265006f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
265106f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
265206f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
265306f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
265406f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
265506f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
265606f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
265706f32e7eSjoerg     T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
265806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
265906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
266006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT> {
266106f32e7eSjoerg   typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
266206f32e7eSjoerg       T14, T15, T16, T17> type;
266306f32e7eSjoerg };
266406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
266506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
266606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
266706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
266806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
266906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
267006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
267106f32e7eSjoerg     T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
267206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
267306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
267406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT> {
267506f32e7eSjoerg   typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
267606f32e7eSjoerg       T14, T15, T16, T17, T18> type;
267706f32e7eSjoerg };
267806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
267906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
268006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
268106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
268206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
268306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
268406f32e7eSjoerg     GTEST_TEMPLATE_ T19>
268506f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
268606f32e7eSjoerg     T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
268706f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
268806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
268906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT> {
269006f32e7eSjoerg   typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
269106f32e7eSjoerg       T14, T15, T16, T17, T18, T19> type;
269206f32e7eSjoerg };
269306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
269406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
269506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
269606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
269706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
269806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
269906f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
270006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
270106f32e7eSjoerg     T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
270206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
270306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
270406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT> {
270506f32e7eSjoerg   typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
270606f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20> type;
270706f32e7eSjoerg };
270806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
270906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
271006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
271106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
271206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
271306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
271406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
271506f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
271606f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
271706f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
271806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
271906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT> {
272006f32e7eSjoerg   typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
272106f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21> type;
272206f32e7eSjoerg };
272306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
272406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
272506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
272606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
272706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
272806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
272906f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
273006f32e7eSjoerg     GTEST_TEMPLATE_ T22>
273106f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
273206f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
273306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
273406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
273506f32e7eSjoerg     NoneT, NoneT, NoneT> {
273606f32e7eSjoerg   typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
273706f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
273806f32e7eSjoerg };
273906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
274006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
274106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
274206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
274306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
274406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
274506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
274606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
274706f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
274806f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
274906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
275006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
275106f32e7eSjoerg     NoneT, NoneT, NoneT> {
275206f32e7eSjoerg   typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
275306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
275406f32e7eSjoerg };
275506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
275606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
275706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
275806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
275906f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
276006f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
276106f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
276206f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
276306f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
276406f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
276506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
276606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
276706f32e7eSjoerg     NoneT, NoneT, NoneT> {
276806f32e7eSjoerg   typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
276906f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
277006f32e7eSjoerg };
277106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
277206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
277306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
277406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
277506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
277606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
277706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
277806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
277906f32e7eSjoerg     GTEST_TEMPLATE_ T25>
278006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
278106f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
278206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
278306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
278406f32e7eSjoerg     NoneT, NoneT> {
278506f32e7eSjoerg   typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
278606f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
278706f32e7eSjoerg };
278806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
278906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
279006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
279106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
279206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
279306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
279406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
279506f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
279606f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
279706f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
279806f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
279906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
280006f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
280106f32e7eSjoerg     NoneT, NoneT> {
280206f32e7eSjoerg   typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
280306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
280406f32e7eSjoerg };
280506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
280606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
280706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
280806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
280906f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
281006f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
281106f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
281206f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
281306f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
281406f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
281506f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
281606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
281706f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
281806f32e7eSjoerg     NoneT, NoneT> {
281906f32e7eSjoerg   typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
282006f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
282106f32e7eSjoerg       T27> type;
282206f32e7eSjoerg };
282306f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
282406f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
282506f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
282606f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
282706f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
282806f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
282906f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
283006f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
283106f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
283206f32e7eSjoerg     GTEST_TEMPLATE_ T28>
283306f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
283406f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
283506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
283606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
283706f32e7eSjoerg     NoneT, NoneT> {
283806f32e7eSjoerg   typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
283906f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
284006f32e7eSjoerg       T28> type;
284106f32e7eSjoerg };
284206f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
284306f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
284406f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
284506f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
284606f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
284706f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
284806f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
284906f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
285006f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
285106f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
285206f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
285306f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
285406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
285506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
285606f32e7eSjoerg     NoneT> {
285706f32e7eSjoerg   typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
285806f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
285906f32e7eSjoerg       T28, T29> type;
286006f32e7eSjoerg };
286106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
286206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
286306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
286406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
286506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
286606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
286706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
286806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
286906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
287006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
287106f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
287206f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
287306f32e7eSjoerg     T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
287406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
287506f32e7eSjoerg   typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
287606f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
287706f32e7eSjoerg       T28, T29, T30> type;
287806f32e7eSjoerg };
287906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
288006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
288106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
288206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
288306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
288406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
288506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
288606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
288706f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
288806f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
288906f32e7eSjoerg     GTEST_TEMPLATE_ T31>
289006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
289106f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
289206f32e7eSjoerg     T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
289306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
289406f32e7eSjoerg   typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
289506f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
289606f32e7eSjoerg       T28, T29, T30, T31> type;
289706f32e7eSjoerg };
289806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
289906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
290006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
290106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
290206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
290306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
290406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
290506f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
290606f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
290706f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
290806f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
290906f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
291006f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
291106f32e7eSjoerg     T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
291206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
291306f32e7eSjoerg   typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
291406f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
291506f32e7eSjoerg       T28, T29, T30, T31, T32> type;
291606f32e7eSjoerg };
291706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
291806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
291906f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
292006f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
292106f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
292206f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
292306f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
292406f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
292506f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
292606f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
292706f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
292806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
292906f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
293006f32e7eSjoerg     T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
293106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
293206f32e7eSjoerg   typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
293306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
293406f32e7eSjoerg       T28, T29, T30, T31, T32, T33> type;
293506f32e7eSjoerg };
293606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
293706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
293806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
293906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
294006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
294106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
294206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
294306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
294406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
294506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
294606f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
294706f32e7eSjoerg     GTEST_TEMPLATE_ T34>
294806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
294906f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
295006f32e7eSjoerg     T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
295106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
295206f32e7eSjoerg   typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
295306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
295406f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34> type;
295506f32e7eSjoerg };
295606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
295706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
295806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
295906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
296006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
296106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
296206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
296306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
296406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
296506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
296606f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
296706f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
296806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
296906f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
297006f32e7eSjoerg     T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
297106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
297206f32e7eSjoerg   typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
297306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
297406f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35> type;
297506f32e7eSjoerg };
297606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
297706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
297806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
297906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
298006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
298106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
298206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
298306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
298406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
298506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
298606f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
298706f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
298806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
298906f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
299006f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
299106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
299206f32e7eSjoerg   typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
299306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
299406f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
299506f32e7eSjoerg };
299606f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
299706f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
299806f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
299906f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
300006f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
300106f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
300206f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
300306f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
300406f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
300506f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
300606f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
300706f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
300806f32e7eSjoerg     GTEST_TEMPLATE_ T37>
300906f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
301006f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
301106f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
301206f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
301306f32e7eSjoerg   typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
301406f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
301506f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
301606f32e7eSjoerg };
301706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
301806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
301906f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
302006f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
302106f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
302206f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
302306f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
302406f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
302506f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
302606f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
302706f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
302806f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
302906f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
303006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
303106f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
303206f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
303306f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
303406f32e7eSjoerg   typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
303506f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
303606f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
303706f32e7eSjoerg };
303806f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
303906f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
304006f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
304106f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
304206f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
304306f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
304406f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
304506f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
304606f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
304706f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
304806f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
304906f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
305006f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
305106f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
305206f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
305306f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
305406f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
305506f32e7eSjoerg   typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
305606f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
305706f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
305806f32e7eSjoerg };
305906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
306006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
306106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
306206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
306306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
306406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
306506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
306606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
306706f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
306806f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
306906f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
307006f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
307106f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
307206f32e7eSjoerg     GTEST_TEMPLATE_ T40>
307306f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
307406f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
307506f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
307606f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
307706f32e7eSjoerg   typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
307806f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
307906f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
308006f32e7eSjoerg };
308106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
308206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
308306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
308406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
308506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
308606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
308706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
308806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
308906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
309006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
309106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
309206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
309306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
309406f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
309506f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
309606f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
309706f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
309806f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
309906f32e7eSjoerg   typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
310006f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
310106f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
310206f32e7eSjoerg       T41> type;
310306f32e7eSjoerg };
310406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
310506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
310606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
310706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
310806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
310906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
311006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
311106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
311206f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
311306f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
311406f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
311506f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
311606f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
311706f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
311806f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
311906f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
312006f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
312106f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
312206f32e7eSjoerg   typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
312306f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
312406f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
312506f32e7eSjoerg       T42> type;
312606f32e7eSjoerg };
312706f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
312806f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
312906f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
313006f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
313106f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
313206f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
313306f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
313406f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
313506f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
313606f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
313706f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
313806f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
313906f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
314006f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
314106f32e7eSjoerg     GTEST_TEMPLATE_ T43>
314206f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
314306f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
314406f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
314506f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
314606f32e7eSjoerg   typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
314706f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
314806f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
314906f32e7eSjoerg       T42, T43> type;
315006f32e7eSjoerg };
315106f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
315206f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
315306f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
315406f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
315506f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
315606f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
315706f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
315806f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
315906f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
316006f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
316106f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
316206f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
316306f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
316406f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
316506f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
316606f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
316706f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
316806f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
316906f32e7eSjoerg     NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
317006f32e7eSjoerg   typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
317106f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
317206f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
317306f32e7eSjoerg       T42, T43, T44> type;
317406f32e7eSjoerg };
317506f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
317606f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
317706f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
317806f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
317906f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
318006f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
318106f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
318206f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
318306f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
318406f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
318506f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
318606f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
318706f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
318806f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
318906f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
319006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
319106f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
319206f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
319306f32e7eSjoerg     T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
319406f32e7eSjoerg   typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
319506f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
319606f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
319706f32e7eSjoerg       T42, T43, T44, T45> type;
319806f32e7eSjoerg };
319906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
320006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
320106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
320206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
320306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
320406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
320506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
320606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
320706f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
320806f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
320906f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
321006f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
321106f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
321206f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
321306f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
321406f32e7eSjoerg     GTEST_TEMPLATE_ T46>
321506f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
321606f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
321706f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
321806f32e7eSjoerg     T45, T46, NoneT, NoneT, NoneT, NoneT> {
321906f32e7eSjoerg   typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
322006f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
322106f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
322206f32e7eSjoerg       T42, T43, T44, T45, T46> type;
322306f32e7eSjoerg };
322406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
322506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
322606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
322706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
322806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
322906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
323006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
323106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
323206f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
323306f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
323406f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
323506f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
323606f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
323706f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
323806f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
323906f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
324006f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
324106f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
324206f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
324306f32e7eSjoerg     T45, T46, T47, NoneT, NoneT, NoneT> {
324406f32e7eSjoerg   typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
324506f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
324606f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
324706f32e7eSjoerg       T42, T43, T44, T45, T46, T47> type;
324806f32e7eSjoerg };
324906f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
325006f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
325106f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
325206f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
325306f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
325406f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
325506f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
325606f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
325706f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
325806f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
325906f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
326006f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
326106f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
326206f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
326306f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
326406f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
326506f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
326606f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
326706f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
326806f32e7eSjoerg     T45, T46, T47, T48, NoneT, NoneT> {
326906f32e7eSjoerg   typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
327006f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
327106f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
327206f32e7eSjoerg       T42, T43, T44, T45, T46, T47, T48> type;
327306f32e7eSjoerg };
327406f32e7eSjoerg template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
327506f32e7eSjoerg     GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
327606f32e7eSjoerg     GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
327706f32e7eSjoerg     GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
327806f32e7eSjoerg     GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
327906f32e7eSjoerg     GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
328006f32e7eSjoerg     GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
328106f32e7eSjoerg     GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
328206f32e7eSjoerg     GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
328306f32e7eSjoerg     GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
328406f32e7eSjoerg     GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
328506f32e7eSjoerg     GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
328606f32e7eSjoerg     GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
328706f32e7eSjoerg     GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
328806f32e7eSjoerg     GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
328906f32e7eSjoerg     GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
329006f32e7eSjoerg     GTEST_TEMPLATE_ T49>
329106f32e7eSjoerg struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
329206f32e7eSjoerg     T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
329306f32e7eSjoerg     T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
329406f32e7eSjoerg     T45, T46, T47, T48, T49, NoneT> {
329506f32e7eSjoerg   typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
329606f32e7eSjoerg       T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
329706f32e7eSjoerg       T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
329806f32e7eSjoerg       T42, T43, T44, T45, T46, T47, T48, T49> type;
329906f32e7eSjoerg };
330006f32e7eSjoerg 
330106f32e7eSjoerg // The TypeList template makes it possible to use either a single type
3302*da58b97aSjoerg // or a Types<...> list in TYPED_TEST_SUITE() and
3303*da58b97aSjoerg // INSTANTIATE_TYPED_TEST_SUITE_P().
330406f32e7eSjoerg 
330506f32e7eSjoerg template <typename T>
330606f32e7eSjoerg struct TypeList {
330706f32e7eSjoerg   typedef Types1<T> type;
330806f32e7eSjoerg };
330906f32e7eSjoerg 
331006f32e7eSjoerg template <typename T1, typename T2, typename T3, typename T4, typename T5,
331106f32e7eSjoerg     typename T6, typename T7, typename T8, typename T9, typename T10,
331206f32e7eSjoerg     typename T11, typename T12, typename T13, typename T14, typename T15,
331306f32e7eSjoerg     typename T16, typename T17, typename T18, typename T19, typename T20,
331406f32e7eSjoerg     typename T21, typename T22, typename T23, typename T24, typename T25,
331506f32e7eSjoerg     typename T26, typename T27, typename T28, typename T29, typename T30,
331606f32e7eSjoerg     typename T31, typename T32, typename T33, typename T34, typename T35,
331706f32e7eSjoerg     typename T36, typename T37, typename T38, typename T39, typename T40,
331806f32e7eSjoerg     typename T41, typename T42, typename T43, typename T44, typename T45,
331906f32e7eSjoerg     typename T46, typename T47, typename T48, typename T49, typename T50>
332006f32e7eSjoerg struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
332106f32e7eSjoerg     T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
332206f32e7eSjoerg     T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
332306f32e7eSjoerg     T44, T45, T46, T47, T48, T49, T50> > {
332406f32e7eSjoerg   typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
332506f32e7eSjoerg       T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
332606f32e7eSjoerg       T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
332706f32e7eSjoerg       T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
332806f32e7eSjoerg };
332906f32e7eSjoerg 
333006f32e7eSjoerg #endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
333106f32e7eSjoerg 
333206f32e7eSjoerg }  // namespace internal
333306f32e7eSjoerg }  // namespace testing
333406f32e7eSjoerg 
333506f32e7eSjoerg #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
3336