1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Copyright 2009 Google Inc.
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// All Rights Reserved.
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Redistribution and use in source and binary forms, with or without
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// modification, are permitted provided that the following conditions are
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// met:
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Redistributions of source code must retain the above copyright
11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// notice, this list of conditions and the following disclaimer.
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Redistributions in binary form must reproduce the above
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// copyright notice, this list of conditions and the following disclaimer
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// in the documentation and/or other materials provided with the
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// distribution.
16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//     * Neither the name of Google Inc. nor the names of its
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// contributors may be used to endorse or promote products derived from
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// this software without specific prior written permission.
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Author: wan@google.com (Zhanyong Wan)
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <utility>  // For ::std::pair.
40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The compiler used in Symbian has a bug that prevents us from declaring the
42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// tuple template as a friend (it complains that tuple is redefined).  This
43894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// hack bypasses the bug by declaring the members that should otherwise be
44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// private as public.
45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Sun Studio versions < 12 also have the above bug.
46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#else
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman   private:
52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif
53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// GTEST_n_TUPLE_(T) is the type of an n-tuple.
55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_0_TUPLE_(T) tuple<>
56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    void, void, void>
70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T##7, void, void>
72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T##7, T##8, void>
74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    T##7, T##8, T##9>
76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_0_TYPENAMES_(T)
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_1_TYPENAMES_(T) typename T##0
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3
84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3, typename T##4
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3, typename T##4, typename T##5
88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3, typename T##4, typename T##5, typename T##6
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3, typename T##4, typename T##5, typename T##6, \
94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##7, typename T##8
95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
96894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##3, typename T##4, typename T##5, typename T##6, \
97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T##7, typename T##8, typename T##9
98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// In theory, defining stuff in the ::std namespace is undefined
100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// behavior.  We can do this as we are playing the role of a standard
101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// library vendor.
102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace std {
103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace tr1 {
104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T0 = void, typename T1 = void, typename T2 = void,
106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T3 = void, typename T4 = void, typename T5 = void,
107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T6 = void, typename T7 = void, typename T8 = void,
108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    typename T9 = void>
109894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass tuple;
110894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
111894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Anything in namespace gtest_internal is Google Test's INTERNAL
112894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
113894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace gtest_internal {
114894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
115894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
116894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T>
117894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct ByRef { typedef const T& type; };  // NOLINT
118894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T>
119894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct ByRef<T&> { typedef T& type; };  // NOLINT
120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A handy wrapper for ByRef.
122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// is the same as tr1::add_reference<T>::type.
126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T>
127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct AddRef { typedef T& type; };  // NOLINT
128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename T>
129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct AddRef<T&> { typedef T& type; };  // NOLINT
130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A handy wrapper for AddRef.
132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A helper for implementing get<k>().
135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <int k> class Get;
136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// A helper for implementing tuple_element<k, T>.  kIndexValid is true
138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// iff k < the number of fields in tuple type T.
139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <bool kIndexValid, int kIndex, class Tuple>
140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement;
141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
161894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
162894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace gtest_internal
173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
174894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass tuple<> {
176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() {}
178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& /* t */)  {}
179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& /* t */) { return *this; }
180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_1_TYPENAMES_(T)>
183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_1_TUPLE_(T) {
184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_() {}
188894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_) {}
192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_1_TYPENAMES_(U)>
194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_1_TYPENAMES_(U)>
199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_1_TYPENAMES_(U)>
206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
214894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_2_TYPENAMES_(T)>
215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_2_TUPLE_(T) {
216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_() {}
220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f1_(f1) {}
223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_2_TYPENAMES_(U)>
227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename U0, typename U1>
229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_2_TYPENAMES_(U)>
234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <typename U0, typename U1>
238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const ::std::pair<U0, U1>& p) {
239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = p.first;
240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = p.second;
241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_2_TYPENAMES_(U)>
247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_3_TYPENAMES_(T)>
258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_3_TUPLE_(T) {
259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_() {}
263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_3_TYPENAMES_(U)>
270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_3_TYPENAMES_(U)>
275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
277894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_3_TYPENAMES_(U)>
282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
287894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
288894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_4_TYPENAMES_(T)>
295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_4_TUPLE_(T) {
296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_() {}
300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(f3) {}
304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_4_TYPENAMES_(U)>
308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_) {}
310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_4_TYPENAMES_(U)>
314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_4_TYPENAMES_(U)>
321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
327894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_5_TYPENAMES_(T)>
336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_5_TUPLE_(T) {
337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f4_(t.f4_) {}
348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_5_TYPENAMES_(U)>
350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_), f4_(t.f4_) {}
352894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
353894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_5_TYPENAMES_(U)>
356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_5_TYPENAMES_(U)>
363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f4_ = t.f4_;
369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T4 f4_;
377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_6_TYPENAMES_(T)>
380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_6_TUPLE_(T) {
381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f5_(f5) {}
390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
391894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
392894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f4_(t.f4_), f5_(t.f5_) {}
393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_6_TYPENAMES_(U)>
395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_6_TYPENAMES_(U)>
401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_6_TYPENAMES_(U)>
408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f4_ = t.f4_;
414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f5_ = t.f5_;
415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
420894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
421894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T4 f4_;
423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T5 f5_;
424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_7_TYPENAMES_(T)>
427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_7_TUPLE_(T) {
428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_7_TYPENAMES_(U)>
442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_7_TYPENAMES_(U)>
448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_7_TYPENAMES_(U)>
455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
456894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
457894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
458894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
459894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
460894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f4_ = t.f4_;
461894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f5_ = t.f5_;
462894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f6_ = t.f6_;
463894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
464894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
465894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
466894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
467894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
468894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
469894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
470894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T4 f4_;
471894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T5 f5_;
472894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T6 f6_;
473894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
474894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
475894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_8_TYPENAMES_(T)>
476894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_8_TUPLE_(T) {
477894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
478894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f5_(f5), f6_(f6), f7_(f7) {}
487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_8_TYPENAMES_(U)>
492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_8_TYPENAMES_(U)>
498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_8_TYPENAMES_(U)>
505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f4_ = t.f4_;
511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f5_ = t.f5_;
512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f6_ = t.f6_;
513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f7_ = t.f7_;
514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T4 f4_;
522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T5 f5_;
523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T6 f6_;
524894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T7 f7_;
525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
526894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_9_TYPENAMES_(T)>
528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass GTEST_9_TUPLE_(T) {
529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_9_TYPENAMES_(U)>
544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
546894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_9_TYPENAMES_(U)>
550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_9_TYPENAMES_(U)>
557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f4_ = t.f4_;
563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f5_ = t.f5_;
564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f6_ = t.f6_;
565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f7_ = t.f7_;
566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f8_ = t.f8_;
567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T4 f4_;
575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T5 f5_;
576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T6 f6_;
577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T7 f7_;
578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T8 f8_;
579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass tuple {
583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <int k> friend class gtest_internal::Get;
585894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
586894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f9_() {}
588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_10_TYPENAMES_(U)>
599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      f9_(t.f9_) {}
602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const tuple& t) { return CopyFrom(t); }
604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_10_TYPENAMES_(U)>
606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return CopyFrom(t);
608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  GTEST_DECLARE_TUPLE_AS_FRIEND_
611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <GTEST_10_TYPENAMES_(U)>
613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f0_ = t.f0_;
615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f1_ = t.f1_;
616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f2_ = t.f2_;
617894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f3_ = t.f3_;
618894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f4_ = t.f4_;
619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f5_ = t.f5_;
620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f6_ = t.f6_;
621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f7_ = t.f7_;
622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f8_ = t.f8_;
623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    f9_ = t.f9_;
624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return *this;
625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T0 f0_;
628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T1 f1_;
629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T2 f2_;
630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T3 f3_;
631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T4 f4_;
632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T5 f5_;
633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T6 f6_;
634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T7 f7_;
635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T8 f8_;
636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  T9 f9_;
637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 6.1.3.2 Tuple creation functions.
640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Known limitations: we don't support passing an
642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// implement tie().
644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline tuple<> make_tuple() { return tuple<>(); }
646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_1_TYPENAMES_(T)>
648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_1_TUPLE_(T)(f0);
650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
651894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_2_TYPENAMES_(T)>
653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_2_TUPLE_(T)(f0, f1);
655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_3_TYPENAMES_(T)>
658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_3_TUPLE_(T)(f0, f1, f2);
660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_4_TYPENAMES_(T)>
663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3) {
665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
666894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
667894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_5_TYPENAMES_(T)>
669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3, const T4& f4) {
671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_6_TYPENAMES_(T)>
675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3, const T4& f4, const T5& f5) {
677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_7_TYPENAMES_(T)>
681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_8_TYPENAMES_(T)>
687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_9_TYPENAMES_(T)>
693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T8& f8) {
696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
698894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    const T8& f8, const T9& f9) {
703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 6.1.3.3 Tuple helper classes.
707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <typename Tuple> struct tuple_size;
709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_0_TYPENAMES_(T)>
711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_1_TYPENAMES_(T)>
714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
716894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_2_TYPENAMES_(T)>
717894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
718894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
719894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_3_TYPENAMES_(T)>
720894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
721894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
722894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_4_TYPENAMES_(T)>
723894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
724894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
725894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_5_TYPENAMES_(T)>
726894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
727894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
728894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_6_TYPENAMES_(T)>
729894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
730894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
731894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_7_TYPENAMES_(T)>
732894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
734894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_8_TYPENAMES_(T)>
735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
737894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_9_TYPENAMES_(T)>
738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
740894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T)>
741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <int k, class Tuple>
744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct tuple_element {
745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  typedef typename gtest_internal::TupleElement<
746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 6.1.3.4 Element access.
752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace gtest_internal {
754894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<0> {
757894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
760894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f0_; }  // NOLINT
761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f0_; }
765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<1> {
769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
770894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
771894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f1_; }  // NOLINT
773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
776894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f1_; }
777894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
778894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
779894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<2> {
781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f2_; }  // NOLINT
785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
787894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
788894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f2_; }
789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<3> {
793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f3_; }  // NOLINT
797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f3_; }
801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
803894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
804894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<4> {
805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f4_; }  // NOLINT
809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f4_; }
813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<5> {
817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f5_; }  // NOLINT
821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f5_; }
825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<6> {
829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
831894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f6_; }  // NOLINT
833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f6_; }
837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<7> {
841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f7_; }  // NOLINT
845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f7_; }
849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<8> {
853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f8_; }  // NOLINT
857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f8_; }
861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass Get<9> {
865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman public:
866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
868894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  Field(Tuple& t) { return t.f9_; }  // NOLINT
869894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
870894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple>
871894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
872894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  ConstField(const Tuple& t) { return t.f9_; }
873894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace gtest_internal
876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
877894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <int k, GTEST_10_TYPENAMES_(T)>
878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanget(GTEST_10_TUPLE_(T)& t) {
880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return gtest_internal::Get<k>::Field(t);
881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <int k, GTEST_10_TYPENAMES_(T)>
884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanget(const GTEST_10_TUPLE_(T)& t) {
886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return gtest_internal::Get<k>::ConstField(t);
887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 6.1.3.5 Relational operators
890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// We only implement == and !=, as we don't have a need for the rest yet.
892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumannamespace gtest_internal {
894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// first k fields of t1 equals the first k fields of t2.
897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
898894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// k1 != k2.
899894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <int kSize1, int kSize2>
900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct SameSizeTuplePrefixComparator;
901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <>
903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct SameSizeTuplePrefixComparator<0, 0> {
904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple1, class Tuple2>
905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return true;
907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <int k>
911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanstruct SameSizeTuplePrefixComparator<k, k> {
912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  template <class Tuple1, class Tuple2>
913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
914894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
915894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  }
917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
919894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace gtest_internal
920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline bool operator==(const GTEST_10_TUPLE_(T)& t,
923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                       const GTEST_10_TUPLE_(U)& u) {
924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return gtest_internal::SameSizeTuplePrefixComparator<
925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      tuple_size<GTEST_10_TUPLE_(T)>::value,
926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumantemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumaninline bool operator!=(const GTEST_10_TUPLE_(T)& t,
931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 6.1.4 Pairs.
934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Unimplemented.
935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace tr1
937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}  // namespace std
938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_0_TUPLE_
940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_1_TUPLE_
941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_2_TUPLE_
942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_3_TUPLE_
943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_4_TUPLE_
944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_5_TUPLE_
945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_6_TUPLE_
946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_7_TUPLE_
947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_8_TUPLE_
948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_9_TUPLE_
949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_10_TUPLE_
950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
951894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_0_TYPENAMES_
952894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_1_TYPENAMES_
953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_2_TYPENAMES_
954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_3_TYPENAMES_
955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_4_TYPENAMES_
956894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_5_TYPENAMES_
957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_6_TYPENAMES_
958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_7_TYPENAMES_
959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_8_TYPENAMES_
960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_9_TYPENAMES_
961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_10_TYPENAMES_
962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_BY_REF_
965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_ADD_REF_
966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#undef GTEST_TUPLE_ELEMENT_
967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
968894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
969