Home | History | Annotate | Download | only in internal
      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 (at) 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_
   1013