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