13d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
23d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
33d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Copyright 2009 Google Inc.
43d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// All Rights Reserved.
53d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
63d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Redistribution and use in source and binary forms, with or without
73d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// modification, are permitted provided that the following conditions are
83d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// met:
93d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions of source code must retain the above copyright
113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// notice, this list of conditions and the following disclaimer.
123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Redistributions in binary form must reproduce the above
133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// copyright notice, this list of conditions and the following disclaimer
143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// in the documentation and/or other materials provided with the
153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// distribution.
163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//     * Neither the name of Google Inc. nor the names of its
173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// contributors may be used to endorse or promote products derived from
183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// this software without specific prior written permission.
193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick//
323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Author: wan@google.com (Zhanyong Wan)
333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#include <utility>  // For ::std::pair.
403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// The compiler used in Symbian has a bug that prevents us from declaring the
423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// tuple template as a friend (it complains that tuple is redefined).  This
433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// hack bypasses the bug by declaring the members that should otherwise be
443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// private as public.
453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Sun Studio versions < 12 also have the above bug.
463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#else
493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick   private:
523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif
533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// GTEST_n_TUPLE_(T) is the type of an n-tuple.
553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_0_TUPLE_(T) tuple<>
563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    void, void, void>
703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T##7, void, void>
723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T##7, T##8, void>
743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    T##7, T##8, T##9>
763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_0_TYPENAMES_(T)
793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_1_TYPENAMES_(T) typename T##0
803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3
843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3, typename T##4
863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3, typename T##4, typename T##5
883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3, typename T##4, typename T##5, typename T##6
903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3, typename T##4, typename T##5, typename T##6, \
943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##7, typename T##8
953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##3, typename T##4, typename T##5, typename T##6, \
973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T##7, typename T##8, typename T##9
983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// In theory, defining stuff in the ::std namespace is undefined
1003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// behavior.  We can do this as we are playing the role of a standard
1013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// library vendor.
1023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace std {
1033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace tr1 {
1043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T0 = void, typename T1 = void, typename T2 = void,
1063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T3 = void, typename T4 = void, typename T5 = void,
1073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T6 = void, typename T7 = void, typename T8 = void,
1083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    typename T9 = void>
1093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass tuple;
1103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Anything in namespace gtest_internal is Google Test's INTERNAL
1123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
1133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace gtest_internal {
1143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
1163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T>
1173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct ByRef { typedef const T& type; };  // NOLINT
1183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T>
1193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct ByRef<T&> { typedef T& type; };  // NOLINT
1203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A handy wrapper for ByRef.
1223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
1233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
1253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// is the same as tr1::add_reference<T>::type.
1263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T>
1273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct AddRef { typedef T& type; };  // NOLINT
1283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename T>
1293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct AddRef<T&> { typedef T& type; };  // NOLINT
1303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A handy wrapper for AddRef.
1323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
1333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A helper for implementing get<k>().
1353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <int k> class Get;
1363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// A helper for implementing tuple_element<k, T>.  kIndexValid is true
1383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// iff k < the number of fields in tuple type T.
1393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <bool kIndexValid, int kIndex, class Tuple>
1403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement;
1413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
1443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
1473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
1503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
1533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
1563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
1593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
1623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
1653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
1683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
1703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
1713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace gtest_internal
1733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
1753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass tuple<> {
1763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() {}
1783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& /* t */)  {}
1793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& /* t */) { return *this; }
1803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
1813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_1_TYPENAMES_(T)>
1833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_1_TUPLE_(T) {
1843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
1853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
1863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_() {}
1883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
1903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_) {}
1923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_1_TYPENAMES_(U)>
1943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
1953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
1973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
1983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_1_TYPENAMES_(U)>
1993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
2003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
2013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
2043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_1_TYPENAMES_(U)>
2063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
2073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
2083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
2093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
2123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
2133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_2_TYPENAMES_(T)>
2153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_2_TUPLE_(T) {
2163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
2183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_() {}
2203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
2223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f1_(f1) {}
2233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
2253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_2_TYPENAMES_(U)>
2273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
2283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename U0, typename U1>
2293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
2303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
2323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_2_TYPENAMES_(U)>
2343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
2353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
2363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <typename U0, typename U1>
2383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const ::std::pair<U0, U1>& p) {
2393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = p.first;
2403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = p.second;
2413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
2423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
2453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_2_TYPENAMES_(U)>
2473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
2483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
2493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
2503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
2513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
2543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
2553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
2563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_3_TYPENAMES_(T)>
2583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_3_TUPLE_(T) {
2593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
2613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_() {}
2633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
2653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
2663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
2683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_3_TYPENAMES_(U)>
2703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
2713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
2733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_3_TYPENAMES_(U)>
2753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
2763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
2773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
2803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_3_TYPENAMES_(U)>
2823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
2833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
2843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
2853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
2863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
2873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
2883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
2903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
2913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
2923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
2933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_4_TYPENAMES_(T)>
2953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_4_TUPLE_(T) {
2963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
2973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
2983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
2993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_() {}
3003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
3023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
3033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(f3) {}
3043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
3063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_4_TYPENAMES_(U)>
3083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
3093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_) {}
3103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
3123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_4_TYPENAMES_(U)>
3143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
3153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
3163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
3193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_4_TYPENAMES_(U)>
3213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
3223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
3233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
3243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
3253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
3263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
3273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
3303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
3313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
3323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
3333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
3343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_5_TYPENAMES_(T)>
3363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_5_TUPLE_(T) {
3373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
3383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
3393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
3413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
3433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
3443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
3453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
3473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f4_(t.f4_) {}
3483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_5_TYPENAMES_(U)>
3503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
3513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_), f4_(t.f4_) {}
3523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
3543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_5_TYPENAMES_(U)>
3563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
3573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
3583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
3613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_5_TYPENAMES_(U)>
3633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
3643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
3653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
3663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
3673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
3683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f4_ = t.f4_;
3693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
3703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
3713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
3733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
3743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
3753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
3763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T4 f4_;
3773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
3783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_6_TYPENAMES_(T)>
3803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_6_TUPLE_(T) {
3813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
3823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
3833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
3853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
3873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
3883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
3893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f5_(f5) {}
3903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
3923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f4_(t.f4_), f5_(t.f5_) {}
3933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_6_TYPENAMES_(U)>
3953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
3963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
3973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
3983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
3993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_6_TYPENAMES_(U)>
4013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
4023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
4033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
4043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
4063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_6_TYPENAMES_(U)>
4083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
4093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
4103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
4113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
4123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
4133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f4_ = t.f4_;
4143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f5_ = t.f5_;
4153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
4163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
4173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
4193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
4203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
4213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
4223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T4 f4_;
4233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T5 f5_;
4243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
4253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_7_TYPENAMES_(T)>
4273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_7_TUPLE_(T) {
4283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
4293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
4303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
4323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
4343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
4353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
4363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
4373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
4393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
4403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_7_TYPENAMES_(U)>
4423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
4433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
4443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
4463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_7_TYPENAMES_(U)>
4483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
4493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
4503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
4513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
4533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_7_TYPENAMES_(U)>
4553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
4563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
4573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
4583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
4593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
4603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f4_ = t.f4_;
4613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f5_ = t.f5_;
4623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f6_ = t.f6_;
4633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
4643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
4653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
4673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
4683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
4693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
4703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T4 f4_;
4713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T5 f5_;
4723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T6 f6_;
4733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
4743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_8_TYPENAMES_(T)>
4763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_8_TUPLE_(T) {
4773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
4783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
4793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
4813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
4833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
4843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
4853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
4863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f5_(f5), f6_(f6), f7_(f7) {}
4873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
4893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
4903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_8_TYPENAMES_(U)>
4923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
4933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
4943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
4963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
4973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_8_TYPENAMES_(U)>
4983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
4993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
5003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
5033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_8_TYPENAMES_(U)>
5053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
5063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
5073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
5083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
5093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
5103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f4_ = t.f4_;
5113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f5_ = t.f5_;
5123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f6_ = t.f6_;
5133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f7_ = t.f7_;
5143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
5153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
5183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
5193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
5203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
5213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T4 f4_;
5223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T5 f5_;
5233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T6 f6_;
5243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T7 f7_;
5253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
5263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_9_TYPENAMES_(T)>
5283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass GTEST_9_TUPLE_(T) {
5293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
5303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
5313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
5333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
5353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
5363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
5373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
5383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
5393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
5413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
5423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_9_TYPENAMES_(U)>
5443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
5453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
5463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
5483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_9_TYPENAMES_(U)>
5503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
5513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
5523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
5553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_9_TYPENAMES_(U)>
5573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
5583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
5593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
5603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
5613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
5623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f4_ = t.f4_;
5633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f5_ = t.f5_;
5643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f6_ = t.f6_;
5653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f7_ = t.f7_;
5663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f8_ = t.f8_;
5673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
5683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
5693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
5713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
5723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
5733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
5743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T4 f4_;
5753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T5 f5_;
5763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T6 f6_;
5773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T7 f7_;
5783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T8 f8_;
5793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
5803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
5823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass tuple {
5833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
5843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <int k> friend class gtest_internal::Get;
5853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
5873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f9_() {}
5883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
5903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
5913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
5923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
5933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
5943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
5963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
5973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
5983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_10_TYPENAMES_(U)>
5993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
6003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
6013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      f9_(t.f9_) {}
6023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const tuple& t) { return CopyFrom(t); }
6043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_10_TYPENAMES_(U)>
6063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
6073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return CopyFrom(t);
6083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
6093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  GTEST_DECLARE_TUPLE_AS_FRIEND_
6113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <GTEST_10_TYPENAMES_(U)>
6133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
6143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f0_ = t.f0_;
6153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f1_ = t.f1_;
6163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f2_ = t.f2_;
6173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f3_ = t.f3_;
6183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f4_ = t.f4_;
6193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f5_ = t.f5_;
6203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f6_ = t.f6_;
6213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f7_ = t.f7_;
6223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f8_ = t.f8_;
6233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    f9_ = t.f9_;
6243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return *this;
6253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
6263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T0 f0_;
6283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T1 f1_;
6293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T2 f2_;
6303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T3 f3_;
6313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T4 f4_;
6323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T5 f5_;
6333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T6 f6_;
6343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T7 f7_;
6353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T8 f8_;
6363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  T9 f9_;
6373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
6383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 6.1.3.2 Tuple creation functions.
6403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Known limitations: we don't support passing an
6423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
6433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// implement tie().
6443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline tuple<> make_tuple() { return tuple<>(); }
6463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_1_TYPENAMES_(T)>
6483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
6493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_1_TUPLE_(T)(f0);
6503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_2_TYPENAMES_(T)>
6533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
6543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_2_TUPLE_(T)(f0, f1);
6553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_3_TYPENAMES_(T)>
6583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
6593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_3_TUPLE_(T)(f0, f1, f2);
6603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_4_TYPENAMES_(T)>
6633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
6643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3) {
6653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
6663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_5_TYPENAMES_(T)>
6693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
6703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3, const T4& f4) {
6713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
6723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_6_TYPENAMES_(T)>
6753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
6763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3, const T4& f4, const T5& f5) {
6773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
6783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_7_TYPENAMES_(T)>
6813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
6823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
6833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
6843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_8_TYPENAMES_(T)>
6873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
6883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
6893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
6903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_9_TYPENAMES_(T)>
6933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
6943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
6953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T8& f8) {
6963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
6973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
6983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
6993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
7003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
7013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
7023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    const T8& f8, const T9& f9) {
7033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
7043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
7053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 6.1.3.3 Tuple helper classes.
7073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <typename Tuple> struct tuple_size;
7093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_0_TYPENAMES_(T)>
7113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
7123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_1_TYPENAMES_(T)>
7143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
7153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_2_TYPENAMES_(T)>
7173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
7183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_3_TYPENAMES_(T)>
7203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
7213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_4_TYPENAMES_(T)>
7233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
7243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_5_TYPENAMES_(T)>
7263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
7273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_6_TYPENAMES_(T)>
7293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
7303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_7_TYPENAMES_(T)>
7323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
7333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_8_TYPENAMES_(T)>
7353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
7363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_9_TYPENAMES_(T)>
7383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
7393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T)>
7413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
7423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <int k, class Tuple>
7443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct tuple_element {
7453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  typedef typename gtest_internal::TupleElement<
7463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
7473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
7483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
7503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 6.1.3.4 Element access.
7523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace gtest_internal {
7543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
7563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<0> {
7573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
7583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
7603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f0_; }  // NOLINT
7613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
7643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f0_; }
7653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
7663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
7683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<1> {
7693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
7703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
7723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f1_; }  // NOLINT
7733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
7763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f1_; }
7773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
7783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
7803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<2> {
7813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
7823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
7843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f2_; }  // NOLINT
7853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
7883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f2_; }
7893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
7903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
7923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<3> {
7933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
7943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
7963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f3_; }  // NOLINT
7973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
7983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
7993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
8003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f3_; }
8013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
8043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<4> {
8053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
8083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f4_; }  // NOLINT
8093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
8123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f4_; }
8133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
8163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<5> {
8173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
8203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f5_; }  // NOLINT
8213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
8243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f5_; }
8253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
8283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<6> {
8293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
8323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f6_; }  // NOLINT
8333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
8363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f6_; }
8373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
8403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<7> {
8413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
8443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f7_; }  // NOLINT
8453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
8483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f7_; }
8493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
8523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<8> {
8533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
8563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f8_; }  // NOLINT
8573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
8603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f8_; }
8613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
8643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickclass Get<9> {
8653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick public:
8663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
8683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  Field(Tuple& t) { return t.f9_; }  // NOLINT
8693d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8703d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple>
8713d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
8723d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  ConstField(const Tuple& t) { return t.f9_; }
8733d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
8743d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8753d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace gtest_internal
8763d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8773d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <int k, GTEST_10_TYPENAMES_(T)>
8783d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
8793d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickget(GTEST_10_TUPLE_(T)& t) {
8803d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return gtest_internal::Get<k>::Field(t);
8813d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8823d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8833d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <int k, GTEST_10_TYPENAMES_(T)>
8843d000e7dd14c3185b9e27a6c38a67288b4d10431Ian RomanickGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
8853d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickget(const GTEST_10_TUPLE_(T)& t) {
8863d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return gtest_internal::Get<k>::ConstField(t);
8873d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
8883d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8893d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 6.1.3.5 Relational operators
8903d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8913d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// We only implement == and !=, as we don't have a need for the rest yet.
8923d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8933d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicknamespace gtest_internal {
8943d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
8953d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
8963d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// first k fields of t1 equals the first k fields of t2.
8973d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
8983d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// k1 != k2.
8993d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <int kSize1, int kSize2>
9003d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct SameSizeTuplePrefixComparator;
9013d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9023d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <>
9033d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct SameSizeTuplePrefixComparator<0, 0> {
9043d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple1, class Tuple2>
9053d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
9063d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return true;
9073d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
9083d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
9093d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9103d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <int k>
9113d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickstruct SameSizeTuplePrefixComparator<k, k> {
9123d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  template <class Tuple1, class Tuple2>
9133d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
9143d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
9153d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
9163d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  }
9173d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick};
9183d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9193d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace gtest_internal
9203d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9213d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
9223d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline bool operator==(const GTEST_10_TUPLE_(T)& t,
9233d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                       const GTEST_10_TUPLE_(U)& u) {
9243d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick  return gtest_internal::SameSizeTuplePrefixComparator<
9253d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      tuple_size<GTEST_10_TUPLE_(T)>::value,
9263d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
9273d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}
9283d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9293d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanicktemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
9303d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanickinline bool operator!=(const GTEST_10_TUPLE_(T)& t,
9313d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
9323d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9333d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// 6.1.4 Pairs.
9343d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick// Unimplemented.
9353d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9363d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace tr1
9373d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick}  // namespace std
9383d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9393d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_0_TUPLE_
9403d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_1_TUPLE_
9413d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_2_TUPLE_
9423d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_3_TUPLE_
9433d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_4_TUPLE_
9443d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_5_TUPLE_
9453d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_6_TUPLE_
9463d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_7_TUPLE_
9473d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_8_TUPLE_
9483d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_9_TUPLE_
9493d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_10_TUPLE_
9503d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9513d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_0_TYPENAMES_
9523d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_1_TYPENAMES_
9533d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_2_TYPENAMES_
9543d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_3_TYPENAMES_
9553d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_4_TYPENAMES_
9563d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_5_TYPENAMES_
9573d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_6_TYPENAMES_
9583d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_7_TYPENAMES_
9593d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_8_TYPENAMES_
9603d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_9_TYPENAMES_
9613d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_10_TYPENAMES_
9623d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9633d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
9643d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_BY_REF_
9653d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_ADD_REF_
9663d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#undef GTEST_TUPLE_ELEMENT_
9673d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick
9683d000e7dd14c3185b9e27a6c38a67288b4d10431Ian Romanick#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
969