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