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