PageRenderTime 53ms CodeModel.GetById 101ms app.highlight 1642ms RepoModel.GetById 58ms app.codeStats 3ms

/Unittests/googletest/include/gtest/internal/gtest-type-util.h

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