1 // This file was GENERATED by command:
   2 //     pump.py gtest-tuple.h.pump
   3 // DO NOT EDIT BY HAND!!!
   4 
   5 // Copyright 2009 Google Inc.
   6 // All Rights Reserved.
   7 //
   8 // Redistribution and use in source and binary forms, with or without
   9 // modification, are permitted provided that the following conditions are
  10 // met:
  11 //
  12 //     * Redistributions of source code must retain the above copyright
  13 // notice, this list of conditions and the following disclaimer.
  14 //     * Redistributions in binary form must reproduce the above
  15 // copyright notice, this list of conditions and the following disclaimer
  16 // in the documentation and/or other materials provided with the
  17 // distribution.
  18 //     * Neither the name of Google Inc. nor the names of its
  19 // contributors may be used to endorse or promote products derived from
  20 // this software without specific prior written permission.
  21 //
  22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  26 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  27 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  28 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33 //
  34 // Author: wan@google.com (Zhanyong Wan)
  35 
  36 // Implements a subset of TR1 tuple needed by Google Test and Google Mock.
  37 
  38 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
  39 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
  40 
  41 #include <utility>  // For ::std::pair.
  42 
  43 // The compiler used in Symbian has a bug that prevents us from declaring the
  44 // tuple template as a friend (it complains that tuple is redefined).  This
  45 // hack bypasses the bug by declaring the members that should otherwise be
  46 // private as public.
  47 // Sun Studio versions < 12 also have the above bug.
  48 #if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
  49 # define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
  50 #else
  51 # define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
  52     template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
  53    private:
  54 #endif
  55 
  56 // GTEST_n_TUPLE_(T) is the type of an n-tuple.
  57 #define GTEST_0_TUPLE_(T) tuple<>
  58 #define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
  59     void, void, void>
  60 #define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
  61     void, void, void>
  62 #define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
  63     void, void, void>
  64 #define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
  65     void, void, void>
  66 #define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
  67     void, void, void>
  68 #define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
  69     void, void, void>
  70 #define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
  71     void, void, void>
  72 #define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
  73     T##7, void, void>
  74 #define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
  75     T##7, T##8, void>
  76 #define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
  77     T##7, T##8, T##9>
  78 
  79 // GTEST_n_TYPENAMES_(T) declares a list of n typenames.
  80 #define GTEST_0_TYPENAMES_(T)
  81 #define GTEST_1_TYPENAMES_(T) typename T##0
  82 #define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
  83 #define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
  84 #define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  85     typename T##3
  86 #define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  87     typename T##3, typename T##4
  88 #define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  89     typename T##3, typename T##4, typename T##5
  90 #define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  91     typename T##3, typename T##4, typename T##5, typename T##6
  92 #define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  93     typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
  94 #define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  95     typename T##3, typename T##4, typename T##5, typename T##6, \
  96     typename T##7, typename T##8
  97 #define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
  98     typename T##3, typename T##4, typename T##5, typename T##6, \
  99     typename T##7, typename T##8, typename T##9
 100 
 101 // In theory, defining stuff in the ::std namespace is undefined
 102 // behavior.  We can do this as we are playing the role of a standard
 103 // library vendor.
 104 namespace std {
 105 namespace tr1 {
 106 
 107 template <typename T0 = void, typename T1 = void, typename T2 = void,
 108     typename T3 = void, typename T4 = void, typename T5 = void,
 109     typename T6 = void, typename T7 = void, typename T8 = void,
 110     typename T9 = void>
 111 class tuple;
 112 
 113 // Anything in namespace gtest_internal is Google Test's INTERNAL
 114 // IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
 115 namespace gtest_internal {
 116 
 117 // ByRef<T>::type is T if T is a reference; otherwise it's const T&.
 118 template <typename T>
 119 struct ByRef { typedef const T& type; };  // NOLINT
 120 template <typename T>
 121 struct ByRef<T&> { typedef T& type; };  // NOLINT
 122 
 123 // A handy wrapper for ByRef.
 124 #define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
 125 
 126 // AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
 127 // is the same as tr1::add_reference<T>::type.
 128 template <typename T>
 129 struct AddRef { typedef T& type; };  // NOLINT
 130 template <typename T>
 131 struct AddRef<T&> { typedef T& type; };  // NOLINT
 132 
 133 // A handy wrapper for AddRef.
 134 #define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
 135 
 136 // A helper for implementing get<k>().
 137 template <int k> class Get;
 138 
 139 // A helper for implementing tuple_element<k, T>.  kIndexValid is true
 140 // iff k < the number of fields in tuple type T.
 141 template <bool kIndexValid, int kIndex, class Tuple>
 142 struct TupleElement;
 143 
 144 template <GTEST_10_TYPENAMES_(T)>
 145 struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
 146   typedef T0 type;
 147 };
 148 
 149 template <GTEST_10_TYPENAMES_(T)>
 150 struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
 151   typedef T1 type;
 152 };
 153 
 154 template <GTEST_10_TYPENAMES_(T)>
 155 struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
 156   typedef T2 type;
 157 };
 158 
 159 template <GTEST_10_TYPENAMES_(T)>
 160 struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
 161   typedef T3 type;
 162 };
 163 
 164 template <GTEST_10_TYPENAMES_(T)>
 165 struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
 166   typedef T4 type;
 167 };
 168 
 169 template <GTEST_10_TYPENAMES_(T)>
 170 struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
 171   typedef T5 type;
 172 };
 173 
 174 template <GTEST_10_TYPENAMES_(T)>
 175 struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
 176   typedef T6 type;
 177 };
 178 
 179 template <GTEST_10_TYPENAMES_(T)>
 180 struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
 181   typedef T7 type;
 182 };
 183 
 184 template <GTEST_10_TYPENAMES_(T)>
 185 struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
 186   typedef T8 type;
 187 };
 188 
 189 template <GTEST_10_TYPENAMES_(T)>
 190 struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
 191   typedef T9 type;
 192 };
 193 
 194 }  // namespace gtest_internal
 195 
 196 template <>
 197 class tuple<> {
 198  public:
 199   tuple() {}
 200   tuple(const tuple& /* t */)  {}
 201   tuple& operator=(const tuple& /* t */) { return *this; }
 202 };
 203 
 204 template <GTEST_1_TYPENAMES_(T)>
 205 class GTEST_1_TUPLE_(T) {
 206  public:
 207   template <int k> friend class gtest_internal::Get;
 208 
 209   tuple() : f0_() {}
 210 
 211   explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
 212 
 213   tuple(const tuple& t) : f0_(t.f0_) {}
 214 
 215   template <GTEST_1_TYPENAMES_(U)>
 216   tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
 217 
 218   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 219 
 220   template <GTEST_1_TYPENAMES_(U)>
 221   tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
 222     return CopyFrom(t);
 223   }
 224 
 225   GTEST_DECLARE_TUPLE_AS_FRIEND_
 226 
 227   template <GTEST_1_TYPENAMES_(U)>
 228   tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
 229     f0_ = t.f0_;
 230     return *this;
 231   }
 232 
 233   T0 f0_;
 234 };
 235 
 236 template <GTEST_2_TYPENAMES_(T)>
 237 class GTEST_2_TUPLE_(T) {
 238  public:
 239   template <int k> friend class gtest_internal::Get;
 240 
 241   tuple() : f0_(), f1_() {}
 242 
 243   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
 244       f1_(f1) {}
 245 
 246   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
 247 
 248   template <GTEST_2_TYPENAMES_(U)>
 249   tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
 250   template <typename U0, typename U1>
 251   tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
 252 
 253   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 254 
 255   template <GTEST_2_TYPENAMES_(U)>
 256   tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
 257     return CopyFrom(t);
 258   }
 259   template <typename U0, typename U1>
 260   tuple& operator=(const ::std::pair<U0, U1>& p) {
 261     f0_ = p.first;
 262     f1_ = p.second;
 263     return *this;
 264   }
 265 
 266   GTEST_DECLARE_TUPLE_AS_FRIEND_
 267 
 268   template <GTEST_2_TYPENAMES_(U)>
 269   tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
 270     f0_ = t.f0_;
 271     f1_ = t.f1_;
 272     return *this;
 273   }
 274 
 275   T0 f0_;
 276   T1 f1_;
 277 };
 278 
 279 template <GTEST_3_TYPENAMES_(T)>
 280 class GTEST_3_TUPLE_(T) {
 281  public:
 282   template <int k> friend class gtest_internal::Get;
 283 
 284   tuple() : f0_(), f1_(), f2_() {}
 285 
 286   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 287       GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
 288 
 289   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
 290 
 291   template <GTEST_3_TYPENAMES_(U)>
 292   tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
 293 
 294   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 295 
 296   template <GTEST_3_TYPENAMES_(U)>
 297   tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
 298     return CopyFrom(t);
 299   }
 300 
 301   GTEST_DECLARE_TUPLE_AS_FRIEND_
 302 
 303   template <GTEST_3_TYPENAMES_(U)>
 304   tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
 305     f0_ = t.f0_;
 306     f1_ = t.f1_;
 307     f2_ = t.f2_;
 308     return *this;
 309   }
 310 
 311   T0 f0_;
 312   T1 f1_;
 313   T2 f2_;
 314 };
 315 
 316 template <GTEST_4_TYPENAMES_(T)>
 317 class GTEST_4_TUPLE_(T) {
 318  public:
 319   template <int k> friend class gtest_internal::Get;
 320 
 321   tuple() : f0_(), f1_(), f2_(), f3_() {}
 322 
 323   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 324       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
 325       f3_(f3) {}
 326 
 327   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
 328 
 329   template <GTEST_4_TYPENAMES_(U)>
 330   tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 331       f3_(t.f3_) {}
 332 
 333   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 334 
 335   template <GTEST_4_TYPENAMES_(U)>
 336   tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
 337     return CopyFrom(t);
 338   }
 339 
 340   GTEST_DECLARE_TUPLE_AS_FRIEND_
 341 
 342   template <GTEST_4_TYPENAMES_(U)>
 343   tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
 344     f0_ = t.f0_;
 345     f1_ = t.f1_;
 346     f2_ = t.f2_;
 347     f3_ = t.f3_;
 348     return *this;
 349   }
 350 
 351   T0 f0_;
 352   T1 f1_;
 353   T2 f2_;
 354   T3 f3_;
 355 };
 356 
 357 template <GTEST_5_TYPENAMES_(T)>
 358 class GTEST_5_TUPLE_(T) {
 359  public:
 360   template <int k> friend class gtest_internal::Get;
 361 
 362   tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
 363 
 364   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 365       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
 366       GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
 367 
 368   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
 369       f4_(t.f4_) {}
 370 
 371   template <GTEST_5_TYPENAMES_(U)>
 372   tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 373       f3_(t.f3_), f4_(t.f4_) {}
 374 
 375   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 376 
 377   template <GTEST_5_TYPENAMES_(U)>
 378   tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
 379     return CopyFrom(t);
 380   }
 381 
 382   GTEST_DECLARE_TUPLE_AS_FRIEND_
 383 
 384   template <GTEST_5_TYPENAMES_(U)>
 385   tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
 386     f0_ = t.f0_;
 387     f1_ = t.f1_;
 388     f2_ = t.f2_;
 389     f3_ = t.f3_;
 390     f4_ = t.f4_;
 391     return *this;
 392   }
 393 
 394   T0 f0_;
 395   T1 f1_;
 396   T2 f2_;
 397   T3 f3_;
 398   T4 f4_;
 399 };
 400 
 401 template <GTEST_6_TYPENAMES_(T)>
 402 class GTEST_6_TUPLE_(T) {
 403  public:
 404   template <int k> friend class gtest_internal::Get;
 405 
 406   tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
 407 
 408   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 409       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
 410       GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
 411       f5_(f5) {}
 412 
 413   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
 414       f4_(t.f4_), f5_(t.f5_) {}
 415 
 416   template <GTEST_6_TYPENAMES_(U)>
 417   tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 418       f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
 419 
 420   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 421 
 422   template <GTEST_6_TYPENAMES_(U)>
 423   tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
 424     return CopyFrom(t);
 425   }
 426 
 427   GTEST_DECLARE_TUPLE_AS_FRIEND_
 428 
 429   template <GTEST_6_TYPENAMES_(U)>
 430   tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
 431     f0_ = t.f0_;
 432     f1_ = t.f1_;
 433     f2_ = t.f2_;
 434     f3_ = t.f3_;
 435     f4_ = t.f4_;
 436     f5_ = t.f5_;
 437     return *this;
 438   }
 439 
 440   T0 f0_;
 441   T1 f1_;
 442   T2 f2_;
 443   T3 f3_;
 444   T4 f4_;
 445   T5 f5_;
 446 };
 447 
 448 template <GTEST_7_TYPENAMES_(T)>
 449 class GTEST_7_TUPLE_(T) {
 450  public:
 451   template <int k> friend class gtest_internal::Get;
 452 
 453   tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
 454 
 455   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 456       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
 457       GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
 458       f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
 459 
 460   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
 461       f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
 462 
 463   template <GTEST_7_TYPENAMES_(U)>
 464   tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 465       f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
 466 
 467   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 468 
 469   template <GTEST_7_TYPENAMES_(U)>
 470   tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
 471     return CopyFrom(t);
 472   }
 473 
 474   GTEST_DECLARE_TUPLE_AS_FRIEND_
 475 
 476   template <GTEST_7_TYPENAMES_(U)>
 477   tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
 478     f0_ = t.f0_;
 479     f1_ = t.f1_;
 480     f2_ = t.f2_;
 481     f3_ = t.f3_;
 482     f4_ = t.f4_;
 483     f5_ = t.f5_;
 484     f6_ = t.f6_;
 485     return *this;
 486   }
 487 
 488   T0 f0_;
 489   T1 f1_;
 490   T2 f2_;
 491   T3 f3_;
 492   T4 f4_;
 493   T5 f5_;
 494   T6 f6_;
 495 };
 496 
 497 template <GTEST_8_TYPENAMES_(T)>
 498 class GTEST_8_TUPLE_(T) {
 499  public:
 500   template <int k> friend class gtest_internal::Get;
 501 
 502   tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
 503 
 504   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 505       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
 506       GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
 507       GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
 508       f5_(f5), f6_(f6), f7_(f7) {}
 509 
 510   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
 511       f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
 512 
 513   template <GTEST_8_TYPENAMES_(U)>
 514   tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 515       f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
 516 
 517   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 518 
 519   template <GTEST_8_TYPENAMES_(U)>
 520   tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
 521     return CopyFrom(t);
 522   }
 523 
 524   GTEST_DECLARE_TUPLE_AS_FRIEND_
 525 
 526   template <GTEST_8_TYPENAMES_(U)>
 527   tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
 528     f0_ = t.f0_;
 529     f1_ = t.f1_;
 530     f2_ = t.f2_;
 531     f3_ = t.f3_;
 532     f4_ = t.f4_;
 533     f5_ = t.f5_;
 534     f6_ = t.f6_;
 535     f7_ = t.f7_;
 536     return *this;
 537   }
 538 
 539   T0 f0_;
 540   T1 f1_;
 541   T2 f2_;
 542   T3 f3_;
 543   T4 f4_;
 544   T5 f5_;
 545   T6 f6_;
 546   T7 f7_;
 547 };
 548 
 549 template <GTEST_9_TYPENAMES_(T)>
 550 class GTEST_9_TUPLE_(T) {
 551  public:
 552   template <int k> friend class gtest_internal::Get;
 553 
 554   tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
 555 
 556   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 557       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
 558       GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
 559       GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
 560       f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
 561 
 562   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
 563       f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
 564 
 565   template <GTEST_9_TYPENAMES_(U)>
 566   tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 567       f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
 568 
 569   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 570 
 571   template <GTEST_9_TYPENAMES_(U)>
 572   tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
 573     return CopyFrom(t);
 574   }
 575 
 576   GTEST_DECLARE_TUPLE_AS_FRIEND_
 577 
 578   template <GTEST_9_TYPENAMES_(U)>
 579   tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
 580     f0_ = t.f0_;
 581     f1_ = t.f1_;
 582     f2_ = t.f2_;
 583     f3_ = t.f3_;
 584     f4_ = t.f4_;
 585     f5_ = t.f5_;
 586     f6_ = t.f6_;
 587     f7_ = t.f7_;
 588     f8_ = t.f8_;
 589     return *this;
 590   }
 591 
 592   T0 f0_;
 593   T1 f1_;
 594   T2 f2_;
 595   T3 f3_;
 596   T4 f4_;
 597   T5 f5_;
 598   T6 f6_;
 599   T7 f7_;
 600   T8 f8_;
 601 };
 602 
 603 template <GTEST_10_TYPENAMES_(T)>
 604 class tuple {
 605  public:
 606   template <int k> friend class gtest_internal::Get;
 607 
 608   tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
 609       f9_() {}
 610 
 611   explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
 612       GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
 613       GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
 614       GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
 615       f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
 616 
 617   tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
 618       f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
 619 
 620   template <GTEST_10_TYPENAMES_(U)>
 621   tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
 622       f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
 623       f9_(t.f9_) {}
 624 
 625   tuple& operator=(const tuple& t) { return CopyFrom(t); }
 626 
 627   template <GTEST_10_TYPENAMES_(U)>
 628   tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
 629     return CopyFrom(t);
 630   }
 631 
 632   GTEST_DECLARE_TUPLE_AS_FRIEND_
 633 
 634   template <GTEST_10_TYPENAMES_(U)>
 635   tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
 636     f0_ = t.f0_;
 637     f1_ = t.f1_;
 638     f2_ = t.f2_;
 639     f3_ = t.f3_;
 640     f4_ = t.f4_;
 641     f5_ = t.f5_;
 642     f6_ = t.f6_;
 643     f7_ = t.f7_;
 644     f8_ = t.f8_;
 645     f9_ = t.f9_;
 646     return *this;
 647   }
 648 
 649   T0 f0_;
 650   T1 f1_;
 651   T2 f2_;
 652   T3 f3_;
 653   T4 f4_;
 654   T5 f5_;
 655   T6 f6_;
 656   T7 f7_;
 657   T8 f8_;
 658   T9 f9_;
 659 };
 660 
 661 // 6.1.3.2 Tuple creation functions.
 662 
 663 // Known limitations: we don't support passing an
 664 // std::tr1::reference_wrapper<T> to make_tuple().  And we don't
 665 // implement tie().
 666 
 667 inline tuple<> make_tuple() { return tuple<>(); }
 668 
 669 template <GTEST_1_TYPENAMES_(T)>
 670 inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
 671   return GTEST_1_TUPLE_(T)(f0);
 672 }
 673 
 674 template <GTEST_2_TYPENAMES_(T)>
 675 inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
 676   return GTEST_2_TUPLE_(T)(f0, f1);
 677 }
 678 
 679 template <GTEST_3_TYPENAMES_(T)>
 680 inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
 681   return GTEST_3_TUPLE_(T)(f0, f1, f2);
 682 }
 683 
 684 template <GTEST_4_TYPENAMES_(T)>
 685 inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 686     const T3& f3) {
 687   return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
 688 }
 689 
 690 template <GTEST_5_TYPENAMES_(T)>
 691 inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 692     const T3& f3, const T4& f4) {
 693   return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
 694 }
 695 
 696 template <GTEST_6_TYPENAMES_(T)>
 697 inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 698     const T3& f3, const T4& f4, const T5& f5) {
 699   return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
 700 }
 701 
 702 template <GTEST_7_TYPENAMES_(T)>
 703 inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 704     const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
 705   return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
 706 }
 707 
 708 template <GTEST_8_TYPENAMES_(T)>
 709 inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 710     const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
 711   return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
 712 }
 713 
 714 template <GTEST_9_TYPENAMES_(T)>
 715 inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 716     const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
 717     const T8& f8) {
 718   return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
 719 }
 720 
 721 template <GTEST_10_TYPENAMES_(T)>
 722 inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
 723     const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
 724     const T8& f8, const T9& f9) {
 725   return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
 726 }
 727 
 728 // 6.1.3.3 Tuple helper classes.
 729 
 730 template <typename Tuple> struct tuple_size;
 731 
 732 template <GTEST_0_TYPENAMES_(T)>
 733 struct tuple_size<GTEST_0_TUPLE_(T) > {
 734   static const int value = 0;
 735 };
 736 
 737 template <GTEST_1_TYPENAMES_(T)>
 738 struct tuple_size<GTEST_1_TUPLE_(T) > {
 739   static const int value = 1;
 740 };
 741 
 742 template <GTEST_2_TYPENAMES_(T)>
 743 struct tuple_size<GTEST_2_TUPLE_(T) > {
 744   static const int value = 2;
 745 };
 746 
 747 template <GTEST_3_TYPENAMES_(T)>
 748 struct tuple_size<GTEST_3_TUPLE_(T) > {
 749   static const int value = 3;
 750 };
 751 
 752 template <GTEST_4_TYPENAMES_(T)>
 753 struct tuple_size<GTEST_4_TUPLE_(T) > {
 754   static const int value = 4;
 755 };
 756 
 757 template <GTEST_5_TYPENAMES_(T)>
 758 struct tuple_size<GTEST_5_TUPLE_(T) > {
 759   static const int value = 5;
 760 };
 761 
 762 template <GTEST_6_TYPENAMES_(T)>
 763 struct tuple_size<GTEST_6_TUPLE_(T) > {
 764   static const int value = 6;
 765 };
 766 
 767 template <GTEST_7_TYPENAMES_(T)>
 768 struct tuple_size<GTEST_7_TUPLE_(T) > {
 769   static const int value = 7;
 770 };
 771 
 772 template <GTEST_8_TYPENAMES_(T)>
 773 struct tuple_size<GTEST_8_TUPLE_(T) > {
 774   static const int value = 8;
 775 };
 776 
 777 template <GTEST_9_TYPENAMES_(T)>
 778 struct tuple_size<GTEST_9_TUPLE_(T) > {
 779   static const int value = 9;
 780 };
 781 
 782 template <GTEST_10_TYPENAMES_(T)>
 783 struct tuple_size<GTEST_10_TUPLE_(T) > {
 784   static const int value = 10;
 785 };
 786 
 787 template <int k, class Tuple>
 788 struct tuple_element {
 789   typedef typename gtest_internal::TupleElement<
 790       k < (tuple_size<Tuple>::value), k, Tuple>::type type;
 791 };
 792 
 793 #define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
 794 
 795 // 6.1.3.4 Element access.
 796 
 797 namespace gtest_internal {
 798 
 799 template <>
 800 class Get<0> {
 801  public:
 802   template <class Tuple>
 803   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
 804   Field(Tuple& t) { return t.f0_; }  // NOLINT
 805 
 806   template <class Tuple>
 807   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
 808   ConstField(const Tuple& t) { return t.f0_; }
 809 };
 810 
 811 template <>
 812 class Get<1> {
 813  public:
 814   template <class Tuple>
 815   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
 816   Field(Tuple& t) { return t.f1_; }  // NOLINT
 817 
 818   template <class Tuple>
 819   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
 820   ConstField(const Tuple& t) { return t.f1_; }
 821 };
 822 
 823 template <>
 824 class Get<2> {
 825  public:
 826   template <class Tuple>
 827   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
 828   Field(Tuple& t) { return t.f2_; }  // NOLINT
 829 
 830   template <class Tuple>
 831   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
 832   ConstField(const Tuple& t) { return t.f2_; }
 833 };
 834 
 835 template <>
 836 class Get<3> {
 837  public:
 838   template <class Tuple>
 839   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
 840   Field(Tuple& t) { return t.f3_; }  // NOLINT
 841 
 842   template <class Tuple>
 843   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
 844   ConstField(const Tuple& t) { return t.f3_; }
 845 };
 846 
 847 template <>
 848 class Get<4> {
 849  public:
 850   template <class Tuple>
 851   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
 852   Field(Tuple& t) { return t.f4_; }  // NOLINT
 853 
 854   template <class Tuple>
 855   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
 856   ConstField(const Tuple& t) { return t.f4_; }
 857 };
 858 
 859 template <>
 860 class Get<5> {
 861  public:
 862   template <class Tuple>
 863   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
 864   Field(Tuple& t) { return t.f5_; }  // NOLINT
 865 
 866   template <class Tuple>
 867   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
 868   ConstField(const Tuple& t) { return t.f5_; }
 869 };
 870 
 871 template <>
 872 class Get<6> {
 873  public:
 874   template <class Tuple>
 875   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
 876   Field(Tuple& t) { return t.f6_; }  // NOLINT
 877 
 878   template <class Tuple>
 879   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
 880   ConstField(const Tuple& t) { return t.f6_; }
 881 };
 882 
 883 template <>
 884 class Get<7> {
 885  public:
 886   template <class Tuple>
 887   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
 888   Field(Tuple& t) { return t.f7_; }  // NOLINT
 889 
 890   template <class Tuple>
 891   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
 892   ConstField(const Tuple& t) { return t.f7_; }
 893 };
 894 
 895 template <>
 896 class Get<8> {
 897  public:
 898   template <class Tuple>
 899   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
 900   Field(Tuple& t) { return t.f8_; }  // NOLINT
 901 
 902   template <class Tuple>
 903   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
 904   ConstField(const Tuple& t) { return t.f8_; }
 905 };
 906 
 907 template <>
 908 class Get<9> {
 909  public:
 910   template <class Tuple>
 911   static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
 912   Field(Tuple& t) { return t.f9_; }  // NOLINT
 913 
 914   template <class Tuple>
 915   static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
 916   ConstField(const Tuple& t) { return t.f9_; }
 917 };
 918 
 919 }  // namespace gtest_internal
 920 
 921 template <int k, GTEST_10_TYPENAMES_(T)>
 922 GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
 923 get(GTEST_10_TUPLE_(T)& t) {
 924   return gtest_internal::Get<k>::Field(t);
 925 }
 926 
 927 template <int k, GTEST_10_TYPENAMES_(T)>
 928 GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
 929 get(const GTEST_10_TUPLE_(T)& t) {
 930   return gtest_internal::Get<k>::ConstField(t);
 931 }
 932 
 933 // 6.1.3.5 Relational operators
 934 
 935 // We only implement == and !=, as we don't have a need for the rest yet.
 936 
 937 namespace gtest_internal {
 938 
 939 // SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
 940 // first k fields of t1 equals the first k fields of t2.
 941 // SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
 942 // k1 != k2.
 943 template <int kSize1, int kSize2>
 944 struct SameSizeTuplePrefixComparator;
 945 
 946 template <>
 947 struct SameSizeTuplePrefixComparator<0, 0> {
 948   template <class Tuple1, class Tuple2>
 949   static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
 950     return true;
 951   }
 952 };
 953 
 954 template <int k>
 955 struct SameSizeTuplePrefixComparator<k, k> {
 956   template <class Tuple1, class Tuple2>
 957   static bool Eq(const Tuple1& t1, const Tuple2& t2) {
 958     return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
 959         ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
 960   }
 961 };
 962 
 963 }  // namespace gtest_internal
 964 
 965 template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
 966 inline bool operator==(const GTEST_10_TUPLE_(T)& t,
 967                        const GTEST_10_TUPLE_(U)& u) {
 968   return gtest_internal::SameSizeTuplePrefixComparator<
 969       tuple_size<GTEST_10_TUPLE_(T) >::value,
 970       tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
 971 }
 972 
 973 template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
 974 inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
 975                        const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
 976 
 977 // 6.1.4 Pairs.
 978 // Unimplemented.
 979 
 980 }  // namespace tr1
 981 }  // namespace std
 982 
 983 #undef GTEST_0_TUPLE_
 984 #undef GTEST_1_TUPLE_
 985 #undef GTEST_2_TUPLE_
 986 #undef GTEST_3_TUPLE_
 987 #undef GTEST_4_TUPLE_
 988 #undef GTEST_5_TUPLE_
 989 #undef GTEST_6_TUPLE_
 990 #undef GTEST_7_TUPLE_
 991 #undef GTEST_8_TUPLE_
 992 #undef GTEST_9_TUPLE_
 993 #undef GTEST_10_TUPLE_
 994 
 995 #undef GTEST_0_TYPENAMES_
 996 #undef GTEST_1_TYPENAMES_
 997 #undef GTEST_2_TYPENAMES_
 998 #undef GTEST_3_TYPENAMES_
 999 #undef GTEST_4_TYPENAMES_
1000 #undef GTEST_5_TYPENAMES_
1001 #undef GTEST_6_TYPENAMES_
1002 #undef GTEST_7_TYPENAMES_
1003 #undef GTEST_8_TYPENAMES_
1004 #undef GTEST_9_TYPENAMES_
1005 #undef GTEST_10_TYPENAMES_
1006 
1007 #undef GTEST_DECLARE_TUPLE_AS_FRIEND_
1008 #undef GTEST_BY_REF_
1009 #undef GTEST_ADD_REF_
1010 #undef GTEST_TUPLE_ELEMENT_
1011 
1012 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_