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