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