113481Sgiacomo.travaglini@arm.com$$ -*- mode: c++; -*- 213481Sgiacomo.travaglini@arm.com$var n = 10 $$ Maximum number of tuple fields we want to support. 313481Sgiacomo.travaglini@arm.com$$ This meta comment fixes auto-indentation in Emacs. }} 413481Sgiacomo.travaglini@arm.com// Copyright 2009 Google Inc. 513481Sgiacomo.travaglini@arm.com// All Rights Reserved. 613481Sgiacomo.travaglini@arm.com// 713481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without 813481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are 913481Sgiacomo.travaglini@arm.com// met: 1013481Sgiacomo.travaglini@arm.com// 1113481Sgiacomo.travaglini@arm.com// * Redistributions of source code must retain the above copyright 1213481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer. 1313481Sgiacomo.travaglini@arm.com// * Redistributions in binary form must reproduce the above 1413481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer 1513481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the 1613481Sgiacomo.travaglini@arm.com// distribution. 1713481Sgiacomo.travaglini@arm.com// * Neither the name of Google Inc. nor the names of its 1813481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from 1913481Sgiacomo.travaglini@arm.com// this software without specific prior written permission. 2013481Sgiacomo.travaglini@arm.com// 2113481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2213481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2313481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2413481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2513481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2613481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2713481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2813481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2913481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3013481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3113481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3213481Sgiacomo.travaglini@arm.com// 3313481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan) 3413481Sgiacomo.travaglini@arm.com 3513481Sgiacomo.travaglini@arm.com// Implements a subset of TR1 tuple needed by Google Test and Google Mock. 3613481Sgiacomo.travaglini@arm.com 3713481Sgiacomo.travaglini@arm.com#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ 3813481Sgiacomo.travaglini@arm.com#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ 3913481Sgiacomo.travaglini@arm.com 4013481Sgiacomo.travaglini@arm.com#include <utility> // For ::std::pair. 4113481Sgiacomo.travaglini@arm.com 4213481Sgiacomo.travaglini@arm.com// The compiler used in Symbian has a bug that prevents us from declaring the 4313481Sgiacomo.travaglini@arm.com// tuple template as a friend (it complains that tuple is redefined). This 4413481Sgiacomo.travaglini@arm.com// hack bypasses the bug by declaring the members that should otherwise be 4513481Sgiacomo.travaglini@arm.com// private as public. 4613481Sgiacomo.travaglini@arm.com// Sun Studio versions < 12 also have the above bug. 4713481Sgiacomo.travaglini@arm.com#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) 4813481Sgiacomo.travaglini@arm.com# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: 4913481Sgiacomo.travaglini@arm.com#else 5013481Sgiacomo.travaglini@arm.com# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ 5113481Sgiacomo.travaglini@arm.com template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \ 5213481Sgiacomo.travaglini@arm.com private: 5313481Sgiacomo.travaglini@arm.com#endif 5413481Sgiacomo.travaglini@arm.com 5513481Sgiacomo.travaglini@arm.com// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict 5613481Sgiacomo.travaglini@arm.com// with our own definitions. Therefore using our own tuple does not work on 5713481Sgiacomo.travaglini@arm.com// those compilers. 5813481Sgiacomo.travaglini@arm.com#if defined(_MSC_VER) && _MSC_VER >= 1600 /* 1600 is Visual Studio 2010 */ 5913481Sgiacomo.travaglini@arm.com# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \ 6013481Sgiacomo.travaglini@arm.comGTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers." 6113481Sgiacomo.travaglini@arm.com#endif 6213481Sgiacomo.travaglini@arm.com 6313481Sgiacomo.travaglini@arm.com 6413481Sgiacomo.travaglini@arm.com$range i 0..n-1 6513481Sgiacomo.travaglini@arm.com$range j 0..n 6613481Sgiacomo.travaglini@arm.com$range k 1..n 6713481Sgiacomo.travaglini@arm.com// GTEST_n_TUPLE_(T) is the type of an n-tuple. 6813481Sgiacomo.travaglini@arm.com#define GTEST_0_TUPLE_(T) tuple<> 6913481Sgiacomo.travaglini@arm.com 7013481Sgiacomo.travaglini@arm.com$for k [[ 7113481Sgiacomo.travaglini@arm.com$range m 0..k-1 7213481Sgiacomo.travaglini@arm.com$range m2 k..n-1 7313481Sgiacomo.travaglini@arm.com#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]> 7413481Sgiacomo.travaglini@arm.com 7513481Sgiacomo.travaglini@arm.com]] 7613481Sgiacomo.travaglini@arm.com 7713481Sgiacomo.travaglini@arm.com// GTEST_n_TYPENAMES_(T) declares a list of n typenames. 7813481Sgiacomo.travaglini@arm.com 7913481Sgiacomo.travaglini@arm.com$for j [[ 8013481Sgiacomo.travaglini@arm.com$range m 0..j-1 8113481Sgiacomo.travaglini@arm.com#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]] 8213481Sgiacomo.travaglini@arm.com 8313481Sgiacomo.travaglini@arm.com 8413481Sgiacomo.travaglini@arm.com]] 8513481Sgiacomo.travaglini@arm.com 8613481Sgiacomo.travaglini@arm.com// In theory, defining stuff in the ::std namespace is undefined 8713481Sgiacomo.travaglini@arm.com// behavior. We can do this as we are playing the role of a standard 8813481Sgiacomo.travaglini@arm.com// library vendor. 8913481Sgiacomo.travaglini@arm.comnamespace std { 9013481Sgiacomo.travaglini@arm.comnamespace tr1 { 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.comtemplate <$for i, [[typename T$i = void]]> 9313481Sgiacomo.travaglini@arm.comclass tuple; 9413481Sgiacomo.travaglini@arm.com 9513481Sgiacomo.travaglini@arm.com// Anything in namespace gtest_internal is Google Test's INTERNAL 9613481Sgiacomo.travaglini@arm.com// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. 9713481Sgiacomo.travaglini@arm.comnamespace gtest_internal { 9813481Sgiacomo.travaglini@arm.com 9913481Sgiacomo.travaglini@arm.com// ByRef<T>::type is T if T is a reference; otherwise it's const T&. 10013481Sgiacomo.travaglini@arm.comtemplate <typename T> 10113481Sgiacomo.travaglini@arm.comstruct ByRef { typedef const T& type; }; // NOLINT 10213481Sgiacomo.travaglini@arm.comtemplate <typename T> 10313481Sgiacomo.travaglini@arm.comstruct ByRef<T&> { typedef T& type; }; // NOLINT 10413481Sgiacomo.travaglini@arm.com 10513481Sgiacomo.travaglini@arm.com// A handy wrapper for ByRef. 10613481Sgiacomo.travaglini@arm.com#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type 10713481Sgiacomo.travaglini@arm.com 10813481Sgiacomo.travaglini@arm.com// AddRef<T>::type is T if T is a reference; otherwise it's T&. This 10913481Sgiacomo.travaglini@arm.com// is the same as tr1::add_reference<T>::type. 11013481Sgiacomo.travaglini@arm.comtemplate <typename T> 11113481Sgiacomo.travaglini@arm.comstruct AddRef { typedef T& type; }; // NOLINT 11213481Sgiacomo.travaglini@arm.comtemplate <typename T> 11313481Sgiacomo.travaglini@arm.comstruct AddRef<T&> { typedef T& type; }; // NOLINT 11413481Sgiacomo.travaglini@arm.com 11513481Sgiacomo.travaglini@arm.com// A handy wrapper for AddRef. 11613481Sgiacomo.travaglini@arm.com#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type 11713481Sgiacomo.travaglini@arm.com 11813481Sgiacomo.travaglini@arm.com// A helper for implementing get<k>(). 11913481Sgiacomo.travaglini@arm.comtemplate <int k> class Get; 12013481Sgiacomo.travaglini@arm.com 12113481Sgiacomo.travaglini@arm.com// A helper for implementing tuple_element<k, T>. kIndexValid is true 12213481Sgiacomo.travaglini@arm.com// iff k < the number of fields in tuple type T. 12313481Sgiacomo.travaglini@arm.comtemplate <bool kIndexValid, int kIndex, class Tuple> 12413481Sgiacomo.travaglini@arm.comstruct TupleElement; 12513481Sgiacomo.travaglini@arm.com 12613481Sgiacomo.travaglini@arm.com 12713481Sgiacomo.travaglini@arm.com$for i [[ 12813481Sgiacomo.travaglini@arm.comtemplate <GTEST_$(n)_TYPENAMES_(T)> 12913481Sgiacomo.travaglini@arm.comstruct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > { 13013481Sgiacomo.travaglini@arm.com typedef T$i type; 13113481Sgiacomo.travaglini@arm.com}; 13213481Sgiacomo.travaglini@arm.com 13313481Sgiacomo.travaglini@arm.com 13413481Sgiacomo.travaglini@arm.com]] 13513481Sgiacomo.travaglini@arm.com} // namespace gtest_internal 13613481Sgiacomo.travaglini@arm.com 13713481Sgiacomo.travaglini@arm.comtemplate <> 13813481Sgiacomo.travaglini@arm.comclass tuple<> { 13913481Sgiacomo.travaglini@arm.com public: 14013481Sgiacomo.travaglini@arm.com tuple() {} 14113481Sgiacomo.travaglini@arm.com tuple(const tuple& /* t */) {} 14213481Sgiacomo.travaglini@arm.com tuple& operator=(const tuple& /* t */) { return *this; } 14313481Sgiacomo.travaglini@arm.com}; 14413481Sgiacomo.travaglini@arm.com 14513481Sgiacomo.travaglini@arm.com 14613481Sgiacomo.travaglini@arm.com$for k [[ 14713481Sgiacomo.travaglini@arm.com$range m 0..k-1 14813481Sgiacomo.travaglini@arm.comtemplate <GTEST_$(k)_TYPENAMES_(T)> 14913481Sgiacomo.travaglini@arm.comclass $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] { 15013481Sgiacomo.travaglini@arm.com public: 15113481Sgiacomo.travaglini@arm.com template <int k> friend class gtest_internal::Get; 15213481Sgiacomo.travaglini@arm.com 15313481Sgiacomo.travaglini@arm.com tuple() : $for m, [[f$(m)_()]] {} 15413481Sgiacomo.travaglini@arm.com 15513481Sgiacomo.travaglini@arm.com explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]] 15613481Sgiacomo.travaglini@arm.com$for m, [[f$(m)_(f$m)]] {} 15713481Sgiacomo.travaglini@arm.com 15813481Sgiacomo.travaglini@arm.com tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} 15913481Sgiacomo.travaglini@arm.com 16013481Sgiacomo.travaglini@arm.com template <GTEST_$(k)_TYPENAMES_(U)> 16113481Sgiacomo.travaglini@arm.com tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} 16213481Sgiacomo.travaglini@arm.com 16313481Sgiacomo.travaglini@arm.com$if k == 2 [[ 16413481Sgiacomo.travaglini@arm.com template <typename U0, typename U1> 16513481Sgiacomo.travaglini@arm.com tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {} 16613481Sgiacomo.travaglini@arm.com 16713481Sgiacomo.travaglini@arm.com]] 16813481Sgiacomo.travaglini@arm.com 16913481Sgiacomo.travaglini@arm.com tuple& operator=(const tuple& t) { return CopyFrom(t); } 17013481Sgiacomo.travaglini@arm.com 17113481Sgiacomo.travaglini@arm.com template <GTEST_$(k)_TYPENAMES_(U)> 17213481Sgiacomo.travaglini@arm.com tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) { 17313481Sgiacomo.travaglini@arm.com return CopyFrom(t); 17413481Sgiacomo.travaglini@arm.com } 17513481Sgiacomo.travaglini@arm.com 17613481Sgiacomo.travaglini@arm.com$if k == 2 [[ 17713481Sgiacomo.travaglini@arm.com template <typename U0, typename U1> 17813481Sgiacomo.travaglini@arm.com tuple& operator=(const ::std::pair<U0, U1>& p) { 17913481Sgiacomo.travaglini@arm.com f0_ = p.first; 18013481Sgiacomo.travaglini@arm.com f1_ = p.second; 18113481Sgiacomo.travaglini@arm.com return *this; 18213481Sgiacomo.travaglini@arm.com } 18313481Sgiacomo.travaglini@arm.com 18413481Sgiacomo.travaglini@arm.com]] 18513481Sgiacomo.travaglini@arm.com 18613481Sgiacomo.travaglini@arm.com GTEST_DECLARE_TUPLE_AS_FRIEND_ 18713481Sgiacomo.travaglini@arm.com 18813481Sgiacomo.travaglini@arm.com template <GTEST_$(k)_TYPENAMES_(U)> 18913481Sgiacomo.travaglini@arm.com tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) { 19013481Sgiacomo.travaglini@arm.com 19113481Sgiacomo.travaglini@arm.com$for m [[ 19213481Sgiacomo.travaglini@arm.com f$(m)_ = t.f$(m)_; 19313481Sgiacomo.travaglini@arm.com 19413481Sgiacomo.travaglini@arm.com]] 19513481Sgiacomo.travaglini@arm.com return *this; 19613481Sgiacomo.travaglini@arm.com } 19713481Sgiacomo.travaglini@arm.com 19813481Sgiacomo.travaglini@arm.com 19913481Sgiacomo.travaglini@arm.com$for m [[ 20013481Sgiacomo.travaglini@arm.com T$m f$(m)_; 20113481Sgiacomo.travaglini@arm.com 20213481Sgiacomo.travaglini@arm.com]] 20313481Sgiacomo.travaglini@arm.com}; 20413481Sgiacomo.travaglini@arm.com 20513481Sgiacomo.travaglini@arm.com 20613481Sgiacomo.travaglini@arm.com]] 20713481Sgiacomo.travaglini@arm.com// 6.1.3.2 Tuple creation functions. 20813481Sgiacomo.travaglini@arm.com 20913481Sgiacomo.travaglini@arm.com// Known limitations: we don't support passing an 21013481Sgiacomo.travaglini@arm.com// std::tr1::reference_wrapper<T> to make_tuple(). And we don't 21113481Sgiacomo.travaglini@arm.com// implement tie(). 21213481Sgiacomo.travaglini@arm.com 21313481Sgiacomo.travaglini@arm.cominline tuple<> make_tuple() { return tuple<>(); } 21413481Sgiacomo.travaglini@arm.com 21513481Sgiacomo.travaglini@arm.com$for k [[ 21613481Sgiacomo.travaglini@arm.com$range m 0..k-1 21713481Sgiacomo.travaglini@arm.com 21813481Sgiacomo.travaglini@arm.comtemplate <GTEST_$(k)_TYPENAMES_(T)> 21913481Sgiacomo.travaglini@arm.cominline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) { 22013481Sgiacomo.travaglini@arm.com return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]); 22113481Sgiacomo.travaglini@arm.com} 22213481Sgiacomo.travaglini@arm.com 22313481Sgiacomo.travaglini@arm.com]] 22413481Sgiacomo.travaglini@arm.com 22513481Sgiacomo.travaglini@arm.com// 6.1.3.3 Tuple helper classes. 22613481Sgiacomo.travaglini@arm.com 22713481Sgiacomo.travaglini@arm.comtemplate <typename Tuple> struct tuple_size; 22813481Sgiacomo.travaglini@arm.com 22913481Sgiacomo.travaglini@arm.com 23013481Sgiacomo.travaglini@arm.com$for j [[ 23113481Sgiacomo.travaglini@arm.comtemplate <GTEST_$(j)_TYPENAMES_(T)> 23213481Sgiacomo.travaglini@arm.comstruct tuple_size<GTEST_$(j)_TUPLE_(T) > { 23313481Sgiacomo.travaglini@arm.com static const int value = $j; 23413481Sgiacomo.travaglini@arm.com}; 23513481Sgiacomo.travaglini@arm.com 23613481Sgiacomo.travaglini@arm.com 23713481Sgiacomo.travaglini@arm.com]] 23813481Sgiacomo.travaglini@arm.comtemplate <int k, class Tuple> 23913481Sgiacomo.travaglini@arm.comstruct tuple_element { 24013481Sgiacomo.travaglini@arm.com typedef typename gtest_internal::TupleElement< 24113481Sgiacomo.travaglini@arm.com k < (tuple_size<Tuple>::value), k, Tuple>::type type; 24213481Sgiacomo.travaglini@arm.com}; 24313481Sgiacomo.travaglini@arm.com 24413481Sgiacomo.travaglini@arm.com#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type 24513481Sgiacomo.travaglini@arm.com 24613481Sgiacomo.travaglini@arm.com// 6.1.3.4 Element access. 24713481Sgiacomo.travaglini@arm.com 24813481Sgiacomo.travaglini@arm.comnamespace gtest_internal { 24913481Sgiacomo.travaglini@arm.com 25013481Sgiacomo.travaglini@arm.com 25113481Sgiacomo.travaglini@arm.com$for i [[ 25213481Sgiacomo.travaglini@arm.comtemplate <> 25313481Sgiacomo.travaglini@arm.comclass Get<$i> { 25413481Sgiacomo.travaglini@arm.com public: 25513481Sgiacomo.travaglini@arm.com template <class Tuple> 25613481Sgiacomo.travaglini@arm.com static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) 25713481Sgiacomo.travaglini@arm.com Field(Tuple& t) { return t.f$(i)_; } // NOLINT 25813481Sgiacomo.travaglini@arm.com 25913481Sgiacomo.travaglini@arm.com template <class Tuple> 26013481Sgiacomo.travaglini@arm.com static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) 26113481Sgiacomo.travaglini@arm.com ConstField(const Tuple& t) { return t.f$(i)_; } 26213481Sgiacomo.travaglini@arm.com}; 26313481Sgiacomo.travaglini@arm.com 26413481Sgiacomo.travaglini@arm.com 26513481Sgiacomo.travaglini@arm.com]] 26613481Sgiacomo.travaglini@arm.com} // namespace gtest_internal 26713481Sgiacomo.travaglini@arm.com 26813481Sgiacomo.travaglini@arm.comtemplate <int k, GTEST_$(n)_TYPENAMES_(T)> 26913481Sgiacomo.travaglini@arm.comGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) 27013481Sgiacomo.travaglini@arm.comget(GTEST_$(n)_TUPLE_(T)& t) { 27113481Sgiacomo.travaglini@arm.com return gtest_internal::Get<k>::Field(t); 27213481Sgiacomo.travaglini@arm.com} 27313481Sgiacomo.travaglini@arm.com 27413481Sgiacomo.travaglini@arm.comtemplate <int k, GTEST_$(n)_TYPENAMES_(T)> 27513481Sgiacomo.travaglini@arm.comGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) 27613481Sgiacomo.travaglini@arm.comget(const GTEST_$(n)_TUPLE_(T)& t) { 27713481Sgiacomo.travaglini@arm.com return gtest_internal::Get<k>::ConstField(t); 27813481Sgiacomo.travaglini@arm.com} 27913481Sgiacomo.travaglini@arm.com 28013481Sgiacomo.travaglini@arm.com// 6.1.3.5 Relational operators 28113481Sgiacomo.travaglini@arm.com 28213481Sgiacomo.travaglini@arm.com// We only implement == and !=, as we don't have a need for the rest yet. 28313481Sgiacomo.travaglini@arm.com 28413481Sgiacomo.travaglini@arm.comnamespace gtest_internal { 28513481Sgiacomo.travaglini@arm.com 28613481Sgiacomo.travaglini@arm.com// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the 28713481Sgiacomo.travaglini@arm.com// first k fields of t1 equals the first k fields of t2. 28813481Sgiacomo.travaglini@arm.com// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if 28913481Sgiacomo.travaglini@arm.com// k1 != k2. 29013481Sgiacomo.travaglini@arm.comtemplate <int kSize1, int kSize2> 29113481Sgiacomo.travaglini@arm.comstruct SameSizeTuplePrefixComparator; 29213481Sgiacomo.travaglini@arm.com 29313481Sgiacomo.travaglini@arm.comtemplate <> 29413481Sgiacomo.travaglini@arm.comstruct SameSizeTuplePrefixComparator<0, 0> { 29513481Sgiacomo.travaglini@arm.com template <class Tuple1, class Tuple2> 29613481Sgiacomo.travaglini@arm.com static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { 29713481Sgiacomo.travaglini@arm.com return true; 29813481Sgiacomo.travaglini@arm.com } 29913481Sgiacomo.travaglini@arm.com}; 30013481Sgiacomo.travaglini@arm.com 30113481Sgiacomo.travaglini@arm.comtemplate <int k> 30213481Sgiacomo.travaglini@arm.comstruct SameSizeTuplePrefixComparator<k, k> { 30313481Sgiacomo.travaglini@arm.com template <class Tuple1, class Tuple2> 30413481Sgiacomo.travaglini@arm.com static bool Eq(const Tuple1& t1, const Tuple2& t2) { 30513481Sgiacomo.travaglini@arm.com return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) && 30613481Sgiacomo.travaglini@arm.com ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2); 30713481Sgiacomo.travaglini@arm.com } 30813481Sgiacomo.travaglini@arm.com}; 30913481Sgiacomo.travaglini@arm.com 31013481Sgiacomo.travaglini@arm.com} // namespace gtest_internal 31113481Sgiacomo.travaglini@arm.com 31213481Sgiacomo.travaglini@arm.comtemplate <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)> 31313481Sgiacomo.travaglini@arm.cominline bool operator==(const GTEST_$(n)_TUPLE_(T)& t, 31413481Sgiacomo.travaglini@arm.com const GTEST_$(n)_TUPLE_(U)& u) { 31513481Sgiacomo.travaglini@arm.com return gtest_internal::SameSizeTuplePrefixComparator< 31613481Sgiacomo.travaglini@arm.com tuple_size<GTEST_$(n)_TUPLE_(T) >::value, 31713481Sgiacomo.travaglini@arm.com tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u); 31813481Sgiacomo.travaglini@arm.com} 31913481Sgiacomo.travaglini@arm.com 32013481Sgiacomo.travaglini@arm.comtemplate <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)> 32113481Sgiacomo.travaglini@arm.cominline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t, 32213481Sgiacomo.travaglini@arm.com const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); } 32313481Sgiacomo.travaglini@arm.com 32413481Sgiacomo.travaglini@arm.com// 6.1.4 Pairs. 32513481Sgiacomo.travaglini@arm.com// Unimplemented. 32613481Sgiacomo.travaglini@arm.com 32713481Sgiacomo.travaglini@arm.com} // namespace tr1 32813481Sgiacomo.travaglini@arm.com} // namespace std 32913481Sgiacomo.travaglini@arm.com 33013481Sgiacomo.travaglini@arm.com 33113481Sgiacomo.travaglini@arm.com$for j [[ 33213481Sgiacomo.travaglini@arm.com#undef GTEST_$(j)_TUPLE_ 33313481Sgiacomo.travaglini@arm.com 33413481Sgiacomo.travaglini@arm.com]] 33513481Sgiacomo.travaglini@arm.com 33613481Sgiacomo.travaglini@arm.com 33713481Sgiacomo.travaglini@arm.com$for j [[ 33813481Sgiacomo.travaglini@arm.com#undef GTEST_$(j)_TYPENAMES_ 33913481Sgiacomo.travaglini@arm.com 34013481Sgiacomo.travaglini@arm.com]] 34113481Sgiacomo.travaglini@arm.com 34213481Sgiacomo.travaglini@arm.com#undef GTEST_DECLARE_TUPLE_AS_FRIEND_ 34313481Sgiacomo.travaglini@arm.com#undef GTEST_BY_REF_ 34413481Sgiacomo.travaglini@arm.com#undef GTEST_ADD_REF_ 34513481Sgiacomo.travaglini@arm.com#undef GTEST_TUPLE_ELEMENT_ 34613481Sgiacomo.travaglini@arm.com 34713481Sgiacomo.travaglini@arm.com#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ 348