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