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