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