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