1
// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
3
// Copyright 2009 Google Inc.
4
// All Rights Reserved.
6
// Redistribution and use in source and binary forms, with or without
7
// modification, are permitted provided that the following conditions are
10
// * Redistributions of source code must retain the above copyright
11
// notice, this list of conditions and the following disclaimer.
12
// * Redistributions in binary form must reproduce the above
13
// copyright notice, this list of conditions and the following disclaimer
14
// in the documentation and/or other materials provided with the
16
// * Neither the name of Google Inc. nor the names of its
17
// contributors may be used to endorse or promote products derived from
18
// this software without specific prior written permission.
20
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
// Author: wan@google.com (Zhanyong Wan)
34
// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
36
#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
37
#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
39
#include <utility> // For ::std::pair.
41
// The compiler used in Symbian has a bug that prevents us from declaring the
42
// tuple template as a friend (it complains that tuple is redefined). This
43
// hack bypasses the bug by declaring the members that should otherwise be
45
#if defined(__SYMBIAN32__)
46
#define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
48
#define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
49
template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
53
// GTEST_n_TUPLE_(T) is the type of an n-tuple.
54
#define GTEST_0_TUPLE_(T) tuple<>
55
#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
57
#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
59
#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
61
#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
63
#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
65
#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
67
#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
69
#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
71
#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
73
#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
76
// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
77
#define GTEST_0_TYPENAMES_(T)
78
#define GTEST_1_TYPENAMES_(T) typename T##0
79
#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
80
#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
81
#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
83
#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
84
typename T##3, typename T##4
85
#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
86
typename T##3, typename T##4, typename T##5
87
#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
88
typename T##3, typename T##4, typename T##5, typename T##6
89
#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
90
typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
91
#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
92
typename T##3, typename T##4, typename T##5, typename T##6, \
93
typename T##7, typename T##8
94
#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
95
typename T##3, typename T##4, typename T##5, typename T##6, \
96
typename T##7, typename T##8, typename T##9
98
// In theory, defining stuff in the ::std namespace is undefined
99
// behavior. We can do this as we are playing the role of a standard
104
template <typename T0 = void, typename T1 = void, typename T2 = void,
105
typename T3 = void, typename T4 = void, typename T5 = void,
106
typename T6 = void, typename T7 = void, typename T8 = void,
110
// Anything in namespace gtest_internal is Google Test's INTERNAL
111
// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
112
namespace gtest_internal {
114
// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
115
template <typename T>
116
struct ByRef { typedef const T& type; }; // NOLINT
117
template <typename T>
118
struct ByRef<T&> { typedef T& type; }; // NOLINT
120
// A handy wrapper for ByRef.
121
#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
123
// AddRef<T>::type is T if T is a reference; otherwise it's T&. This
124
// is the same as tr1::add_reference<T>::type.
125
template <typename T>
126
struct AddRef { typedef T& type; }; // NOLINT
127
template <typename T>
128
struct AddRef<T&> { typedef T& type; }; // NOLINT
130
// A handy wrapper for AddRef.
131
#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
133
// A helper for implementing get<k>().
134
template <int k> class Get;
136
// A helper for implementing tuple_element<k, T>. kIndexValid is true
137
// iff k < the number of fields in tuple type T.
138
template <bool kIndexValid, int kIndex, class Tuple>
141
template <GTEST_10_TYPENAMES_(T)>
142
struct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };
144
template <GTEST_10_TYPENAMES_(T)>
145
struct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };
147
template <GTEST_10_TYPENAMES_(T)>
148
struct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };
150
template <GTEST_10_TYPENAMES_(T)>
151
struct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };
153
template <GTEST_10_TYPENAMES_(T)>
154
struct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };
156
template <GTEST_10_TYPENAMES_(T)>
157
struct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };
159
template <GTEST_10_TYPENAMES_(T)>
160
struct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };
162
template <GTEST_10_TYPENAMES_(T)>
163
struct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };
165
template <GTEST_10_TYPENAMES_(T)>
166
struct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };
168
template <GTEST_10_TYPENAMES_(T)>
169
struct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };
171
} // namespace gtest_internal
177
tuple(const tuple& /* t */) {}
178
tuple& operator=(const tuple& /* t */) { return *this; }
181
template <GTEST_1_TYPENAMES_(T)>
182
class GTEST_1_TUPLE_(T) {
184
template <int k> friend class gtest_internal::Get;
188
explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
190
tuple(const tuple& t) : f0_(t.f0_) {}
192
template <GTEST_1_TYPENAMES_(U)>
193
tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
195
tuple& operator=(const tuple& t) { return CopyFrom(t); }
197
template <GTEST_1_TYPENAMES_(U)>
198
tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
202
GTEST_DECLARE_TUPLE_AS_FRIEND_
204
template <GTEST_1_TYPENAMES_(U)>
205
tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
213
template <GTEST_2_TYPENAMES_(T)>
214
class GTEST_2_TUPLE_(T) {
216
template <int k> friend class gtest_internal::Get;
220
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
223
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
225
template <GTEST_2_TYPENAMES_(U)>
226
tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
227
template <typename U0, typename U1>
228
tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
230
tuple& operator=(const tuple& t) { return CopyFrom(t); }
232
template <GTEST_2_TYPENAMES_(U)>
233
tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
236
template <typename U0, typename U1>
237
tuple& operator=(const ::std::pair<U0, U1>& p) {
243
GTEST_DECLARE_TUPLE_AS_FRIEND_
245
template <GTEST_2_TYPENAMES_(U)>
246
tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
256
template <GTEST_3_TYPENAMES_(T)>
257
class GTEST_3_TUPLE_(T) {
259
template <int k> friend class gtest_internal::Get;
263
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
264
GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
266
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
268
template <GTEST_3_TYPENAMES_(U)>
269
tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
271
tuple& operator=(const tuple& t) { return CopyFrom(t); }
273
template <GTEST_3_TYPENAMES_(U)>
274
tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
278
GTEST_DECLARE_TUPLE_AS_FRIEND_
280
template <GTEST_3_TYPENAMES_(U)>
281
tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
293
template <GTEST_4_TYPENAMES_(T)>
294
class GTEST_4_TUPLE_(T) {
296
template <int k> friend class gtest_internal::Get;
300
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
301
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
304
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
306
template <GTEST_4_TYPENAMES_(U)>
307
tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
310
tuple& operator=(const tuple& t) { return CopyFrom(t); }
312
template <GTEST_4_TYPENAMES_(U)>
313
tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
317
GTEST_DECLARE_TUPLE_AS_FRIEND_
319
template <GTEST_4_TYPENAMES_(U)>
320
tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
334
template <GTEST_5_TYPENAMES_(T)>
335
class GTEST_5_TUPLE_(T) {
337
template <int k> friend class gtest_internal::Get;
341
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
342
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
343
GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
345
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
348
template <GTEST_5_TYPENAMES_(U)>
349
tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
350
f3_(t.f3_), f4_(t.f4_) {}
352
tuple& operator=(const tuple& t) { return CopyFrom(t); }
354
template <GTEST_5_TYPENAMES_(U)>
355
tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
359
GTEST_DECLARE_TUPLE_AS_FRIEND_
361
template <GTEST_5_TYPENAMES_(U)>
362
tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
378
template <GTEST_6_TYPENAMES_(T)>
379
class GTEST_6_TUPLE_(T) {
381
template <int k> friend class gtest_internal::Get;
385
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
386
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
387
GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
390
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
391
f4_(t.f4_), f5_(t.f5_) {}
393
template <GTEST_6_TYPENAMES_(U)>
394
tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
395
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
397
tuple& operator=(const tuple& t) { return CopyFrom(t); }
399
template <GTEST_6_TYPENAMES_(U)>
400
tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
404
GTEST_DECLARE_TUPLE_AS_FRIEND_
406
template <GTEST_6_TYPENAMES_(U)>
407
tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
425
template <GTEST_7_TYPENAMES_(T)>
426
class GTEST_7_TUPLE_(T) {
428
template <int k> friend class gtest_internal::Get;
432
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
433
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
434
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
435
f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
437
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
438
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
440
template <GTEST_7_TYPENAMES_(U)>
441
tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
442
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
444
tuple& operator=(const tuple& t) { return CopyFrom(t); }
446
template <GTEST_7_TYPENAMES_(U)>
447
tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
451
GTEST_DECLARE_TUPLE_AS_FRIEND_
453
template <GTEST_7_TYPENAMES_(U)>
454
tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
474
template <GTEST_8_TYPENAMES_(T)>
475
class GTEST_8_TUPLE_(T) {
477
template <int k> friend class gtest_internal::Get;
481
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
482
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
483
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
484
GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
485
f5_(f5), f6_(f6), f7_(f7) {}
487
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
488
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
490
template <GTEST_8_TYPENAMES_(U)>
491
tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
492
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
494
tuple& operator=(const tuple& t) { return CopyFrom(t); }
496
template <GTEST_8_TYPENAMES_(U)>
497
tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
501
GTEST_DECLARE_TUPLE_AS_FRIEND_
503
template <GTEST_8_TYPENAMES_(U)>
504
tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
526
template <GTEST_9_TYPENAMES_(T)>
527
class GTEST_9_TUPLE_(T) {
529
template <int k> friend class gtest_internal::Get;
533
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
534
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
535
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
536
GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
537
f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
539
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
540
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
542
template <GTEST_9_TYPENAMES_(U)>
543
tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
544
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
546
tuple& operator=(const tuple& t) { return CopyFrom(t); }
548
template <GTEST_9_TYPENAMES_(U)>
549
tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
553
GTEST_DECLARE_TUPLE_AS_FRIEND_
555
template <GTEST_9_TYPENAMES_(U)>
556
tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
580
template <GTEST_10_TYPENAMES_(T)>
583
template <int k> friend class gtest_internal::Get;
587
explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
588
GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
589
GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
590
GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
591
f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
593
tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
594
f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
596
template <GTEST_10_TYPENAMES_(U)>
597
tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
598
f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
601
tuple& operator=(const tuple& t) { return CopyFrom(t); }
603
template <GTEST_10_TYPENAMES_(U)>
604
tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
608
GTEST_DECLARE_TUPLE_AS_FRIEND_
610
template <GTEST_10_TYPENAMES_(U)>
611
tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
637
// 6.1.3.2 Tuple creation functions.
639
// Known limitations: we don't support passing an
640
// std::tr1::reference_wrapper<T> to make_tuple(). And we don't
643
inline tuple<> make_tuple() { return tuple<>(); }
645
template <GTEST_1_TYPENAMES_(T)>
646
inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
647
return GTEST_1_TUPLE_(T)(f0);
650
template <GTEST_2_TYPENAMES_(T)>
651
inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
652
return GTEST_2_TUPLE_(T)(f0, f1);
655
template <GTEST_3_TYPENAMES_(T)>
656
inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
657
return GTEST_3_TUPLE_(T)(f0, f1, f2);
660
template <GTEST_4_TYPENAMES_(T)>
661
inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
663
return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
666
template <GTEST_5_TYPENAMES_(T)>
667
inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
668
const T3& f3, const T4& f4) {
669
return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
672
template <GTEST_6_TYPENAMES_(T)>
673
inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
674
const T3& f3, const T4& f4, const T5& f5) {
675
return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
678
template <GTEST_7_TYPENAMES_(T)>
679
inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
680
const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
681
return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
684
template <GTEST_8_TYPENAMES_(T)>
685
inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
686
const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
687
return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
690
template <GTEST_9_TYPENAMES_(T)>
691
inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
692
const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
694
return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
697
template <GTEST_10_TYPENAMES_(T)>
698
inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
699
const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
700
const T8& f8, const T9& f9) {
701
return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
704
// 6.1.3.3 Tuple helper classes.
706
template <typename Tuple> struct tuple_size;
708
template <GTEST_0_TYPENAMES_(T)>
709
struct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };
711
template <GTEST_1_TYPENAMES_(T)>
712
struct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };
714
template <GTEST_2_TYPENAMES_(T)>
715
struct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };
717
template <GTEST_3_TYPENAMES_(T)>
718
struct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };
720
template <GTEST_4_TYPENAMES_(T)>
721
struct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };
723
template <GTEST_5_TYPENAMES_(T)>
724
struct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };
726
template <GTEST_6_TYPENAMES_(T)>
727
struct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };
729
template <GTEST_7_TYPENAMES_(T)>
730
struct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };
732
template <GTEST_8_TYPENAMES_(T)>
733
struct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };
735
template <GTEST_9_TYPENAMES_(T)>
736
struct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };
738
template <GTEST_10_TYPENAMES_(T)>
739
struct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };
741
template <int k, class Tuple>
742
struct tuple_element {
743
typedef typename gtest_internal::TupleElement<
744
k < (tuple_size<Tuple>::value), k, Tuple>::type type;
747
#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
749
// 6.1.3.4 Element access.
751
namespace gtest_internal {
756
template <class Tuple>
757
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
758
Field(Tuple& t) { return t.f0_; } // NOLINT
760
template <class Tuple>
761
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
762
ConstField(const Tuple& t) { return t.f0_; }
768
template <class Tuple>
769
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
770
Field(Tuple& t) { return t.f1_; } // NOLINT
772
template <class Tuple>
773
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
774
ConstField(const Tuple& t) { return t.f1_; }
780
template <class Tuple>
781
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
782
Field(Tuple& t) { return t.f2_; } // NOLINT
784
template <class Tuple>
785
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
786
ConstField(const Tuple& t) { return t.f2_; }
792
template <class Tuple>
793
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
794
Field(Tuple& t) { return t.f3_; } // NOLINT
796
template <class Tuple>
797
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
798
ConstField(const Tuple& t) { return t.f3_; }
804
template <class Tuple>
805
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
806
Field(Tuple& t) { return t.f4_; } // NOLINT
808
template <class Tuple>
809
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
810
ConstField(const Tuple& t) { return t.f4_; }
816
template <class Tuple>
817
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
818
Field(Tuple& t) { return t.f5_; } // NOLINT
820
template <class Tuple>
821
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
822
ConstField(const Tuple& t) { return t.f5_; }
828
template <class Tuple>
829
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
830
Field(Tuple& t) { return t.f6_; } // NOLINT
832
template <class Tuple>
833
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
834
ConstField(const Tuple& t) { return t.f6_; }
840
template <class Tuple>
841
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
842
Field(Tuple& t) { return t.f7_; } // NOLINT
844
template <class Tuple>
845
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
846
ConstField(const Tuple& t) { return t.f7_; }
852
template <class Tuple>
853
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
854
Field(Tuple& t) { return t.f8_; } // NOLINT
856
template <class Tuple>
857
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
858
ConstField(const Tuple& t) { return t.f8_; }
864
template <class Tuple>
865
static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
866
Field(Tuple& t) { return t.f9_; } // NOLINT
868
template <class Tuple>
869
static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
870
ConstField(const Tuple& t) { return t.f9_; }
873
} // namespace gtest_internal
875
template <int k, GTEST_10_TYPENAMES_(T)>
876
GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
877
get(GTEST_10_TUPLE_(T)& t) {
878
return gtest_internal::Get<k>::Field(t);
881
template <int k, GTEST_10_TYPENAMES_(T)>
882
GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
883
get(const GTEST_10_TUPLE_(T)& t) {
884
return gtest_internal::Get<k>::ConstField(t);
887
// 6.1.3.5 Relational operators
889
// We only implement == and !=, as we don't have a need for the rest yet.
891
namespace gtest_internal {
893
// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
894
// first k fields of t1 equals the first k fields of t2.
895
// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
897
template <int kSize1, int kSize2>
898
struct SameSizeTuplePrefixComparator;
901
struct SameSizeTuplePrefixComparator<0, 0> {
902
template <class Tuple1, class Tuple2>
903
static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
909
struct SameSizeTuplePrefixComparator<k, k> {
910
template <class Tuple1, class Tuple2>
911
static bool Eq(const Tuple1& t1, const Tuple2& t2) {
912
return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
913
::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
917
} // namespace gtest_internal
919
template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
920
inline bool operator==(const GTEST_10_TUPLE_(T)& t,
921
const GTEST_10_TUPLE_(U)& u) {
922
return gtest_internal::SameSizeTuplePrefixComparator<
923
tuple_size<GTEST_10_TUPLE_(T)>::value,
924
tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);
927
template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
928
inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
929
const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
937
#undef GTEST_0_TUPLE_
938
#undef GTEST_1_TUPLE_
939
#undef GTEST_2_TUPLE_
940
#undef GTEST_3_TUPLE_
941
#undef GTEST_4_TUPLE_
942
#undef GTEST_5_TUPLE_
943
#undef GTEST_6_TUPLE_
944
#undef GTEST_7_TUPLE_
945
#undef GTEST_8_TUPLE_
946
#undef GTEST_9_TUPLE_
947
#undef GTEST_10_TUPLE_
949
#undef GTEST_0_TYPENAMES_
950
#undef GTEST_1_TYPENAMES_
951
#undef GTEST_2_TYPENAMES_
952
#undef GTEST_3_TYPENAMES_
953
#undef GTEST_4_TYPENAMES_
954
#undef GTEST_5_TYPENAMES_
955
#undef GTEST_6_TYPENAMES_
956
#undef GTEST_7_TYPENAMES_
957
#undef GTEST_8_TYPENAMES_
958
#undef GTEST_9_TYPENAMES_
959
#undef GTEST_10_TYPENAMES_
961
#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
963
#undef GTEST_ADD_REF_
964
#undef GTEST_TUPLE_ELEMENT_
966
#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_