1 // This file was GENERATED by command: 2 // pump.py gmock-generated-matchers.h.pump 3 // DO NOT EDIT BY HAND!!! 4 5 // Copyright 2008, 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 // Google Mock - a framework for writing C++ mock classes. 35 // 36 // This file implements some commonly used variadic matchers. 37 38 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 39 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 40 41 #include <iterator> 42 #include <sstream> 43 #include <string> 44 #include <vector> 45 #include "gmock/gmock-matchers.h" 46 47 namespace testing { 48 namespace internal { 49 50 // The type of the i-th (0-based) field of Tuple. 51 #define GMOCK_FIELD_TYPE_(Tuple, i) \ 52 typename ::std::tr1::tuple_element<i, Tuple>::type 53 54 // TupleFields<Tuple, k0, ..., kn> is for selecting fields from a 55 // tuple of type Tuple. It has two members: 56 // 57 // type: a tuple type whose i-th field is the ki-th field of Tuple. 58 // GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple. 59 // 60 // For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have: 61 // 62 // type is tuple<int, bool>, and 63 // GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true). 64 65 template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, 66 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 67 int k9 = -1> 68 class TupleFields; 69 70 // This generic version is used when there are 10 selectors. 71 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 72 int k7, int k8, int k9> 73 class TupleFields { 74 public: 75 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 76 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 77 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 78 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 79 GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8), 80 GMOCK_FIELD_TYPE_(Tuple, k9)> type; 81 static type GetSelectedFields(const Tuple& t) { 82 using ::std::tr1::get; 83 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 84 get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t)); 85 } 86 }; 87 88 // The following specialization is used for 0 ~ 9 selectors. 89 90 template <class Tuple> 91 class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 92 public: 93 typedef ::std::tr1::tuple<> type; 94 static type GetSelectedFields(const Tuple& /* t */) { 95 using ::std::tr1::get; 96 return type(); 97 } 98 }; 99 100 template <class Tuple, int k0> 101 class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> { 102 public: 103 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type; 104 static type GetSelectedFields(const Tuple& t) { 105 using ::std::tr1::get; 106 return type(get<k0>(t)); 107 } 108 }; 109 110 template <class Tuple, int k0, int k1> 111 class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> { 112 public: 113 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 114 GMOCK_FIELD_TYPE_(Tuple, k1)> type; 115 static type GetSelectedFields(const Tuple& t) { 116 using ::std::tr1::get; 117 return type(get<k0>(t), get<k1>(t)); 118 } 119 }; 120 121 template <class Tuple, int k0, int k1, int k2> 122 class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> { 123 public: 124 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 125 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type; 126 static type GetSelectedFields(const Tuple& t) { 127 using ::std::tr1::get; 128 return type(get<k0>(t), get<k1>(t), get<k2>(t)); 129 } 130 }; 131 132 template <class Tuple, int k0, int k1, int k2, int k3> 133 class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> { 134 public: 135 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 136 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 137 GMOCK_FIELD_TYPE_(Tuple, k3)> type; 138 static type GetSelectedFields(const Tuple& t) { 139 using ::std::tr1::get; 140 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t)); 141 } 142 }; 143 144 template <class Tuple, int k0, int k1, int k2, int k3, int k4> 145 class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> { 146 public: 147 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 148 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 149 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type; 150 static type GetSelectedFields(const Tuple& t) { 151 using ::std::tr1::get; 152 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t)); 153 } 154 }; 155 156 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5> 157 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> { 158 public: 159 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 160 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 161 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 162 GMOCK_FIELD_TYPE_(Tuple, k5)> type; 163 static type GetSelectedFields(const Tuple& t) { 164 using ::std::tr1::get; 165 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 166 get<k5>(t)); 167 } 168 }; 169 170 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6> 171 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> { 172 public: 173 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 174 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 175 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 176 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type; 177 static type GetSelectedFields(const Tuple& t) { 178 using ::std::tr1::get; 179 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 180 get<k5>(t), get<k6>(t)); 181 } 182 }; 183 184 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 185 int k7> 186 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> { 187 public: 188 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 189 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 190 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 191 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 192 GMOCK_FIELD_TYPE_(Tuple, k7)> type; 193 static type GetSelectedFields(const Tuple& t) { 194 using ::std::tr1::get; 195 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 196 get<k5>(t), get<k6>(t), get<k7>(t)); 197 } 198 }; 199 200 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6, 201 int k7, int k8> 202 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> { 203 public: 204 typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0), 205 GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2), 206 GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4), 207 GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6), 208 GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type; 209 static type GetSelectedFields(const Tuple& t) { 210 using ::std::tr1::get; 211 return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t), 212 get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t)); 213 } 214 }; 215 216 #undef GMOCK_FIELD_TYPE_ 217 218 // Implements the Args() matcher. 219 template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1, 220 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1, 221 int k9 = -1> 222 class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> { 223 public: 224 // ArgsTuple may have top-level const or reference modifiers. 225 typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple; 226 typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, 227 k6, k7, k8, k9>::type SelectedArgs; 228 typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher; 229 230 template <typename InnerMatcher> 231 explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher) 232 : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {} 233 234 virtual bool MatchAndExplain(ArgsTuple args, 235 MatchResultListener* listener) const { 236 const SelectedArgs& selected_args = GetSelectedArgs(args); 237 if (!listener->IsInterested()) 238 return inner_matcher_.Matches(selected_args); 239 240 PrintIndices(listener->stream()); 241 *listener << "are " << PrintToString(selected_args); 242 243 StringMatchResultListener inner_listener; 244 const bool match = inner_matcher_.MatchAndExplain(selected_args, 245 &inner_listener); 246 PrintIfNotEmpty(inner_listener.str(), listener->stream()); 247 return match; 248 } 249 250 virtual void DescribeTo(::std::ostream* os) const { 251 *os << "are a tuple "; 252 PrintIndices(os); 253 inner_matcher_.DescribeTo(os); 254 } 255 256 virtual void DescribeNegationTo(::std::ostream* os) const { 257 *os << "are a tuple "; 258 PrintIndices(os); 259 inner_matcher_.DescribeNegationTo(os); 260 } 261 262 private: 263 static SelectedArgs GetSelectedArgs(ArgsTuple args) { 264 return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, 265 k9>::GetSelectedFields(args); 266 } 267 268 // Prints the indices of the selected fields. 269 static void PrintIndices(::std::ostream* os) { 270 *os << "whose fields ("; 271 const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 }; 272 for (int i = 0; i < 10; i++) { 273 if (indices[i] < 0) 274 break; 275 276 if (i >= 1) 277 *os << ", "; 278 279 *os << "#" << indices[i]; 280 } 281 *os << ") "; 282 } 283 284 const MonomorphicInnerMatcher inner_matcher_; 285 286 GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl); 287 }; 288 289 template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1, 290 int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, 291 int k8 = -1, int k9 = -1> 292 class ArgsMatcher { 293 public: 294 explicit ArgsMatcher(const InnerMatcher& inner_matcher) 295 : inner_matcher_(inner_matcher) {} 296 297 template <typename ArgsTuple> 298 operator Matcher<ArgsTuple>() const { 299 return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5, 300 k6, k7, k8, k9>(inner_matcher_)); 301 } 302 303 private: 304 const InnerMatcher inner_matcher_; 305 306 GTEST_DISALLOW_ASSIGN_(ArgsMatcher); 307 }; 308 309 // A set of metafunctions for computing the result type of AllOf. 310 // AllOf(m1, ..., mN) returns 311 // AllOfResultN<decltype(m1), ..., decltype(mN)>::type. 312 313 // Although AllOf isn't defined for one argument, AllOfResult1 is defined 314 // to simplify the implementation. 315 template <typename M1> 316 struct AllOfResult1 { 317 typedef M1 type; 318 }; 319 320 template <typename M1, typename M2> 321 struct AllOfResult2 { 322 typedef BothOfMatcher< 323 typename AllOfResult1<M1>::type, 324 typename AllOfResult1<M2>::type 325 > type; 326 }; 327 328 template <typename M1, typename M2, typename M3> 329 struct AllOfResult3 { 330 typedef BothOfMatcher< 331 typename AllOfResult1<M1>::type, 332 typename AllOfResult2<M2, M3>::type 333 > type; 334 }; 335 336 template <typename M1, typename M2, typename M3, typename M4> 337 struct AllOfResult4 { 338 typedef BothOfMatcher< 339 typename AllOfResult2<M1, M2>::type, 340 typename AllOfResult2<M3, M4>::type 341 > type; 342 }; 343 344 template <typename M1, typename M2, typename M3, typename M4, typename M5> 345 struct AllOfResult5 { 346 typedef BothOfMatcher< 347 typename AllOfResult2<M1, M2>::type, 348 typename AllOfResult3<M3, M4, M5>::type 349 > type; 350 }; 351 352 template <typename M1, typename M2, typename M3, typename M4, typename M5, 353 typename M6> 354 struct AllOfResult6 { 355 typedef BothOfMatcher< 356 typename AllOfResult3<M1, M2, M3>::type, 357 typename AllOfResult3<M4, M5, M6>::type 358 > type; 359 }; 360 361 template <typename M1, typename M2, typename M3, typename M4, typename M5, 362 typename M6, typename M7> 363 struct AllOfResult7 { 364 typedef BothOfMatcher< 365 typename AllOfResult3<M1, M2, M3>::type, 366 typename AllOfResult4<M4, M5, M6, M7>::type 367 > type; 368 }; 369 370 template <typename M1, typename M2, typename M3, typename M4, typename M5, 371 typename M6, typename M7, typename M8> 372 struct AllOfResult8 { 373 typedef BothOfMatcher< 374 typename AllOfResult4<M1, M2, M3, M4>::type, 375 typename AllOfResult4<M5, M6, M7, M8>::type 376 > type; 377 }; 378 379 template <typename M1, typename M2, typename M3, typename M4, typename M5, 380 typename M6, typename M7, typename M8, typename M9> 381 struct AllOfResult9 { 382 typedef BothOfMatcher< 383 typename AllOfResult4<M1, M2, M3, M4>::type, 384 typename AllOfResult5<M5, M6, M7, M8, M9>::type 385 > type; 386 }; 387 388 template <typename M1, typename M2, typename M3, typename M4, typename M5, 389 typename M6, typename M7, typename M8, typename M9, typename M10> 390 struct AllOfResult10 { 391 typedef BothOfMatcher< 392 typename AllOfResult5<M1, M2, M3, M4, M5>::type, 393 typename AllOfResult5<M6, M7, M8, M9, M10>::type 394 > type; 395 }; 396 397 // A set of metafunctions for computing the result type of AnyOf. 398 // AnyOf(m1, ..., mN) returns 399 // AnyOfResultN<decltype(m1), ..., decltype(mN)>::type. 400 401 // Although AnyOf isn't defined for one argument, AnyOfResult1 is defined 402 // to simplify the implementation. 403 template <typename M1> 404 struct AnyOfResult1 { 405 typedef M1 type; 406 }; 407 408 template <typename M1, typename M2> 409 struct AnyOfResult2 { 410 typedef EitherOfMatcher< 411 typename AnyOfResult1<M1>::type, 412 typename AnyOfResult1<M2>::type 413 > type; 414 }; 415 416 template <typename M1, typename M2, typename M3> 417 struct AnyOfResult3 { 418 typedef EitherOfMatcher< 419 typename AnyOfResult1<M1>::type, 420 typename AnyOfResult2<M2, M3>::type 421 > type; 422 }; 423 424 template <typename M1, typename M2, typename M3, typename M4> 425 struct AnyOfResult4 { 426 typedef EitherOfMatcher< 427 typename AnyOfResult2<M1, M2>::type, 428 typename AnyOfResult2<M3, M4>::type 429 > type; 430 }; 431 432 template <typename M1, typename M2, typename M3, typename M4, typename M5> 433 struct AnyOfResult5 { 434 typedef EitherOfMatcher< 435 typename AnyOfResult2<M1, M2>::type, 436 typename AnyOfResult3<M3, M4, M5>::type 437 > type; 438 }; 439 440 template <typename M1, typename M2, typename M3, typename M4, typename M5, 441 typename M6> 442 struct AnyOfResult6 { 443 typedef EitherOfMatcher< 444 typename AnyOfResult3<M1, M2, M3>::type, 445 typename AnyOfResult3<M4, M5, M6>::type 446 > type; 447 }; 448 449 template <typename M1, typename M2, typename M3, typename M4, typename M5, 450 typename M6, typename M7> 451 struct AnyOfResult7 { 452 typedef EitherOfMatcher< 453 typename AnyOfResult3<M1, M2, M3>::type, 454 typename AnyOfResult4<M4, M5, M6, M7>::type 455 > type; 456 }; 457 458 template <typename M1, typename M2, typename M3, typename M4, typename M5, 459 typename M6, typename M7, typename M8> 460 struct AnyOfResult8 { 461 typedef EitherOfMatcher< 462 typename AnyOfResult4<M1, M2, M3, M4>::type, 463 typename AnyOfResult4<M5, M6, M7, M8>::type 464 > type; 465 }; 466 467 template <typename M1, typename M2, typename M3, typename M4, typename M5, 468 typename M6, typename M7, typename M8, typename M9> 469 struct AnyOfResult9 { 470 typedef EitherOfMatcher< 471 typename AnyOfResult4<M1, M2, M3, M4>::type, 472 typename AnyOfResult5<M5, M6, M7, M8, M9>::type 473 > type; 474 }; 475 476 template <typename M1, typename M2, typename M3, typename M4, typename M5, 477 typename M6, typename M7, typename M8, typename M9, typename M10> 478 struct AnyOfResult10 { 479 typedef EitherOfMatcher< 480 typename AnyOfResult5<M1, M2, M3, M4, M5>::type, 481 typename AnyOfResult5<M6, M7, M8, M9, M10>::type 482 > type; 483 }; 484 485 } // namespace internal 486 487 // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected 488 // fields of it matches a_matcher. C++ doesn't support default 489 // arguments for function templates, so we have to overload it. 490 template <typename InnerMatcher> 491 inline internal::ArgsMatcher<InnerMatcher> 492 Args(const InnerMatcher& matcher) { 493 return internal::ArgsMatcher<InnerMatcher>(matcher); 494 } 495 496 template <int k1, typename InnerMatcher> 497 inline internal::ArgsMatcher<InnerMatcher, k1> 498 Args(const InnerMatcher& matcher) { 499 return internal::ArgsMatcher<InnerMatcher, k1>(matcher); 500 } 501 502 template <int k1, int k2, typename InnerMatcher> 503 inline internal::ArgsMatcher<InnerMatcher, k1, k2> 504 Args(const InnerMatcher& matcher) { 505 return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher); 506 } 507 508 template <int k1, int k2, int k3, typename InnerMatcher> 509 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3> 510 Args(const InnerMatcher& matcher) { 511 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher); 512 } 513 514 template <int k1, int k2, int k3, int k4, typename InnerMatcher> 515 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4> 516 Args(const InnerMatcher& matcher) { 517 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher); 518 } 519 520 template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher> 521 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5> 522 Args(const InnerMatcher& matcher) { 523 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher); 524 } 525 526 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher> 527 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6> 528 Args(const InnerMatcher& matcher) { 529 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher); 530 } 531 532 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, 533 typename InnerMatcher> 534 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7> 535 Args(const InnerMatcher& matcher) { 536 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, 537 k7>(matcher); 538 } 539 540 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 541 typename InnerMatcher> 542 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8> 543 Args(const InnerMatcher& matcher) { 544 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, 545 k8>(matcher); 546 } 547 548 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 549 int k9, typename InnerMatcher> 550 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9> 551 Args(const InnerMatcher& matcher) { 552 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, 553 k9>(matcher); 554 } 555 556 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8, 557 int k9, int k10, typename InnerMatcher> 558 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9, 559 k10> 560 Args(const InnerMatcher& matcher) { 561 return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, 562 k9, k10>(matcher); 563 } 564 565 // ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with 566 // n elements, where the i-th element in the container must 567 // match the i-th argument in the list. Each argument of 568 // ElementsAre() can be either a value or a matcher. We support up to 569 // 10 arguments. 570 // 571 // The use of DecayArray in the implementation allows ElementsAre() 572 // to accept string literals, whose type is const char[N], but we 573 // want to treat them as const char*. 574 // 575 // NOTE: Since ElementsAre() cares about the order of the elements, it 576 // must not be used with containers whose elements's order is 577 // undefined (e.g. hash_map). 578 579 inline internal::ElementsAreMatcher< 580 std::tr1::tuple<> > 581 ElementsAre() { 582 typedef std::tr1::tuple<> Args; 583 return internal::ElementsAreMatcher<Args>(Args()); 584 } 585 586 template <typename T1> 587 inline internal::ElementsAreMatcher< 588 std::tr1::tuple< 589 typename internal::DecayArray<T1>::type> > 590 ElementsAre(const T1& e1) { 591 typedef std::tr1::tuple< 592 typename internal::DecayArray<T1>::type> Args; 593 return internal::ElementsAreMatcher<Args>(Args(e1)); 594 } 595 596 template <typename T1, typename T2> 597 inline internal::ElementsAreMatcher< 598 std::tr1::tuple< 599 typename internal::DecayArray<T1>::type, 600 typename internal::DecayArray<T2>::type> > 601 ElementsAre(const T1& e1, const T2& e2) { 602 typedef std::tr1::tuple< 603 typename internal::DecayArray<T1>::type, 604 typename internal::DecayArray<T2>::type> Args; 605 return internal::ElementsAreMatcher<Args>(Args(e1, e2)); 606 } 607 608 template <typename T1, typename T2, typename T3> 609 inline internal::ElementsAreMatcher< 610 std::tr1::tuple< 611 typename internal::DecayArray<T1>::type, 612 typename internal::DecayArray<T2>::type, 613 typename internal::DecayArray<T3>::type> > 614 ElementsAre(const T1& e1, const T2& e2, const T3& e3) { 615 typedef std::tr1::tuple< 616 typename internal::DecayArray<T1>::type, 617 typename internal::DecayArray<T2>::type, 618 typename internal::DecayArray<T3>::type> Args; 619 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3)); 620 } 621 622 template <typename T1, typename T2, typename T3, typename T4> 623 inline internal::ElementsAreMatcher< 624 std::tr1::tuple< 625 typename internal::DecayArray<T1>::type, 626 typename internal::DecayArray<T2>::type, 627 typename internal::DecayArray<T3>::type, 628 typename internal::DecayArray<T4>::type> > 629 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) { 630 typedef std::tr1::tuple< 631 typename internal::DecayArray<T1>::type, 632 typename internal::DecayArray<T2>::type, 633 typename internal::DecayArray<T3>::type, 634 typename internal::DecayArray<T4>::type> Args; 635 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4)); 636 } 637 638 template <typename T1, typename T2, typename T3, typename T4, typename T5> 639 inline internal::ElementsAreMatcher< 640 std::tr1::tuple< 641 typename internal::DecayArray<T1>::type, 642 typename internal::DecayArray<T2>::type, 643 typename internal::DecayArray<T3>::type, 644 typename internal::DecayArray<T4>::type, 645 typename internal::DecayArray<T5>::type> > 646 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 647 const T5& e5) { 648 typedef std::tr1::tuple< 649 typename internal::DecayArray<T1>::type, 650 typename internal::DecayArray<T2>::type, 651 typename internal::DecayArray<T3>::type, 652 typename internal::DecayArray<T4>::type, 653 typename internal::DecayArray<T5>::type> Args; 654 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5)); 655 } 656 657 template <typename T1, typename T2, typename T3, typename T4, typename T5, 658 typename T6> 659 inline internal::ElementsAreMatcher< 660 std::tr1::tuple< 661 typename internal::DecayArray<T1>::type, 662 typename internal::DecayArray<T2>::type, 663 typename internal::DecayArray<T3>::type, 664 typename internal::DecayArray<T4>::type, 665 typename internal::DecayArray<T5>::type, 666 typename internal::DecayArray<T6>::type> > 667 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 668 const T5& e5, const T6& e6) { 669 typedef std::tr1::tuple< 670 typename internal::DecayArray<T1>::type, 671 typename internal::DecayArray<T2>::type, 672 typename internal::DecayArray<T3>::type, 673 typename internal::DecayArray<T4>::type, 674 typename internal::DecayArray<T5>::type, 675 typename internal::DecayArray<T6>::type> Args; 676 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6)); 677 } 678 679 template <typename T1, typename T2, typename T3, typename T4, typename T5, 680 typename T6, typename T7> 681 inline internal::ElementsAreMatcher< 682 std::tr1::tuple< 683 typename internal::DecayArray<T1>::type, 684 typename internal::DecayArray<T2>::type, 685 typename internal::DecayArray<T3>::type, 686 typename internal::DecayArray<T4>::type, 687 typename internal::DecayArray<T5>::type, 688 typename internal::DecayArray<T6>::type, 689 typename internal::DecayArray<T7>::type> > 690 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 691 const T5& e5, const T6& e6, const T7& e7) { 692 typedef std::tr1::tuple< 693 typename internal::DecayArray<T1>::type, 694 typename internal::DecayArray<T2>::type, 695 typename internal::DecayArray<T3>::type, 696 typename internal::DecayArray<T4>::type, 697 typename internal::DecayArray<T5>::type, 698 typename internal::DecayArray<T6>::type, 699 typename internal::DecayArray<T7>::type> Args; 700 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7)); 701 } 702 703 template <typename T1, typename T2, typename T3, typename T4, typename T5, 704 typename T6, typename T7, typename T8> 705 inline internal::ElementsAreMatcher< 706 std::tr1::tuple< 707 typename internal::DecayArray<T1>::type, 708 typename internal::DecayArray<T2>::type, 709 typename internal::DecayArray<T3>::type, 710 typename internal::DecayArray<T4>::type, 711 typename internal::DecayArray<T5>::type, 712 typename internal::DecayArray<T6>::type, 713 typename internal::DecayArray<T7>::type, 714 typename internal::DecayArray<T8>::type> > 715 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 716 const T5& e5, const T6& e6, const T7& e7, const T8& e8) { 717 typedef std::tr1::tuple< 718 typename internal::DecayArray<T1>::type, 719 typename internal::DecayArray<T2>::type, 720 typename internal::DecayArray<T3>::type, 721 typename internal::DecayArray<T4>::type, 722 typename internal::DecayArray<T5>::type, 723 typename internal::DecayArray<T6>::type, 724 typename internal::DecayArray<T7>::type, 725 typename internal::DecayArray<T8>::type> Args; 726 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7, 727 e8)); 728 } 729 730 template <typename T1, typename T2, typename T3, typename T4, typename T5, 731 typename T6, typename T7, typename T8, typename T9> 732 inline internal::ElementsAreMatcher< 733 std::tr1::tuple< 734 typename internal::DecayArray<T1>::type, 735 typename internal::DecayArray<T2>::type, 736 typename internal::DecayArray<T3>::type, 737 typename internal::DecayArray<T4>::type, 738 typename internal::DecayArray<T5>::type, 739 typename internal::DecayArray<T6>::type, 740 typename internal::DecayArray<T7>::type, 741 typename internal::DecayArray<T8>::type, 742 typename internal::DecayArray<T9>::type> > 743 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 744 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { 745 typedef std::tr1::tuple< 746 typename internal::DecayArray<T1>::type, 747 typename internal::DecayArray<T2>::type, 748 typename internal::DecayArray<T3>::type, 749 typename internal::DecayArray<T4>::type, 750 typename internal::DecayArray<T5>::type, 751 typename internal::DecayArray<T6>::type, 752 typename internal::DecayArray<T7>::type, 753 typename internal::DecayArray<T8>::type, 754 typename internal::DecayArray<T9>::type> Args; 755 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7, 756 e8, e9)); 757 } 758 759 template <typename T1, typename T2, typename T3, typename T4, typename T5, 760 typename T6, typename T7, typename T8, typename T9, typename T10> 761 inline internal::ElementsAreMatcher< 762 std::tr1::tuple< 763 typename internal::DecayArray<T1>::type, 764 typename internal::DecayArray<T2>::type, 765 typename internal::DecayArray<T3>::type, 766 typename internal::DecayArray<T4>::type, 767 typename internal::DecayArray<T5>::type, 768 typename internal::DecayArray<T6>::type, 769 typename internal::DecayArray<T7>::type, 770 typename internal::DecayArray<T8>::type, 771 typename internal::DecayArray<T9>::type, 772 typename internal::DecayArray<T10>::type> > 773 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 774 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, 775 const T10& e10) { 776 typedef std::tr1::tuple< 777 typename internal::DecayArray<T1>::type, 778 typename internal::DecayArray<T2>::type, 779 typename internal::DecayArray<T3>::type, 780 typename internal::DecayArray<T4>::type, 781 typename internal::DecayArray<T5>::type, 782 typename internal::DecayArray<T6>::type, 783 typename internal::DecayArray<T7>::type, 784 typename internal::DecayArray<T8>::type, 785 typename internal::DecayArray<T9>::type, 786 typename internal::DecayArray<T10>::type> Args; 787 return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7, 788 e8, e9, e10)); 789 } 790 791 // UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension 792 // that matches n elements in any order. We support up to n=10 arguments. 793 794 inline internal::UnorderedElementsAreMatcher< 795 std::tr1::tuple<> > 796 UnorderedElementsAre() { 797 typedef std::tr1::tuple<> Args; 798 return internal::UnorderedElementsAreMatcher<Args>(Args()); 799 } 800 801 template <typename T1> 802 inline internal::UnorderedElementsAreMatcher< 803 std::tr1::tuple< 804 typename internal::DecayArray<T1>::type> > 805 UnorderedElementsAre(const T1& e1) { 806 typedef std::tr1::tuple< 807 typename internal::DecayArray<T1>::type> Args; 808 return internal::UnorderedElementsAreMatcher<Args>(Args(e1)); 809 } 810 811 template <typename T1, typename T2> 812 inline internal::UnorderedElementsAreMatcher< 813 std::tr1::tuple< 814 typename internal::DecayArray<T1>::type, 815 typename internal::DecayArray<T2>::type> > 816 UnorderedElementsAre(const T1& e1, const T2& e2) { 817 typedef std::tr1::tuple< 818 typename internal::DecayArray<T1>::type, 819 typename internal::DecayArray<T2>::type> Args; 820 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2)); 821 } 822 823 template <typename T1, typename T2, typename T3> 824 inline internal::UnorderedElementsAreMatcher< 825 std::tr1::tuple< 826 typename internal::DecayArray<T1>::type, 827 typename internal::DecayArray<T2>::type, 828 typename internal::DecayArray<T3>::type> > 829 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) { 830 typedef std::tr1::tuple< 831 typename internal::DecayArray<T1>::type, 832 typename internal::DecayArray<T2>::type, 833 typename internal::DecayArray<T3>::type> Args; 834 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3)); 835 } 836 837 template <typename T1, typename T2, typename T3, typename T4> 838 inline internal::UnorderedElementsAreMatcher< 839 std::tr1::tuple< 840 typename internal::DecayArray<T1>::type, 841 typename internal::DecayArray<T2>::type, 842 typename internal::DecayArray<T3>::type, 843 typename internal::DecayArray<T4>::type> > 844 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) { 845 typedef std::tr1::tuple< 846 typename internal::DecayArray<T1>::type, 847 typename internal::DecayArray<T2>::type, 848 typename internal::DecayArray<T3>::type, 849 typename internal::DecayArray<T4>::type> Args; 850 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4)); 851 } 852 853 template <typename T1, typename T2, typename T3, typename T4, typename T5> 854 inline internal::UnorderedElementsAreMatcher< 855 std::tr1::tuple< 856 typename internal::DecayArray<T1>::type, 857 typename internal::DecayArray<T2>::type, 858 typename internal::DecayArray<T3>::type, 859 typename internal::DecayArray<T4>::type, 860 typename internal::DecayArray<T5>::type> > 861 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 862 const T5& e5) { 863 typedef std::tr1::tuple< 864 typename internal::DecayArray<T1>::type, 865 typename internal::DecayArray<T2>::type, 866 typename internal::DecayArray<T3>::type, 867 typename internal::DecayArray<T4>::type, 868 typename internal::DecayArray<T5>::type> Args; 869 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5)); 870 } 871 872 template <typename T1, typename T2, typename T3, typename T4, typename T5, 873 typename T6> 874 inline internal::UnorderedElementsAreMatcher< 875 std::tr1::tuple< 876 typename internal::DecayArray<T1>::type, 877 typename internal::DecayArray<T2>::type, 878 typename internal::DecayArray<T3>::type, 879 typename internal::DecayArray<T4>::type, 880 typename internal::DecayArray<T5>::type, 881 typename internal::DecayArray<T6>::type> > 882 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 883 const T5& e5, const T6& e6) { 884 typedef std::tr1::tuple< 885 typename internal::DecayArray<T1>::type, 886 typename internal::DecayArray<T2>::type, 887 typename internal::DecayArray<T3>::type, 888 typename internal::DecayArray<T4>::type, 889 typename internal::DecayArray<T5>::type, 890 typename internal::DecayArray<T6>::type> Args; 891 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, 892 e6)); 893 } 894 895 template <typename T1, typename T2, typename T3, typename T4, typename T5, 896 typename T6, typename T7> 897 inline internal::UnorderedElementsAreMatcher< 898 std::tr1::tuple< 899 typename internal::DecayArray<T1>::type, 900 typename internal::DecayArray<T2>::type, 901 typename internal::DecayArray<T3>::type, 902 typename internal::DecayArray<T4>::type, 903 typename internal::DecayArray<T5>::type, 904 typename internal::DecayArray<T6>::type, 905 typename internal::DecayArray<T7>::type> > 906 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 907 const T5& e5, const T6& e6, const T7& e7) { 908 typedef std::tr1::tuple< 909 typename internal::DecayArray<T1>::type, 910 typename internal::DecayArray<T2>::type, 911 typename internal::DecayArray<T3>::type, 912 typename internal::DecayArray<T4>::type, 913 typename internal::DecayArray<T5>::type, 914 typename internal::DecayArray<T6>::type, 915 typename internal::DecayArray<T7>::type> Args; 916 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, 917 e6, e7)); 918 } 919 920 template <typename T1, typename T2, typename T3, typename T4, typename T5, 921 typename T6, typename T7, typename T8> 922 inline internal::UnorderedElementsAreMatcher< 923 std::tr1::tuple< 924 typename internal::DecayArray<T1>::type, 925 typename internal::DecayArray<T2>::type, 926 typename internal::DecayArray<T3>::type, 927 typename internal::DecayArray<T4>::type, 928 typename internal::DecayArray<T5>::type, 929 typename internal::DecayArray<T6>::type, 930 typename internal::DecayArray<T7>::type, 931 typename internal::DecayArray<T8>::type> > 932 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 933 const T5& e5, const T6& e6, const T7& e7, const T8& e8) { 934 typedef std::tr1::tuple< 935 typename internal::DecayArray<T1>::type, 936 typename internal::DecayArray<T2>::type, 937 typename internal::DecayArray<T3>::type, 938 typename internal::DecayArray<T4>::type, 939 typename internal::DecayArray<T5>::type, 940 typename internal::DecayArray<T6>::type, 941 typename internal::DecayArray<T7>::type, 942 typename internal::DecayArray<T8>::type> Args; 943 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, 944 e6, e7, e8)); 945 } 946 947 template <typename T1, typename T2, typename T3, typename T4, typename T5, 948 typename T6, typename T7, typename T8, typename T9> 949 inline internal::UnorderedElementsAreMatcher< 950 std::tr1::tuple< 951 typename internal::DecayArray<T1>::type, 952 typename internal::DecayArray<T2>::type, 953 typename internal::DecayArray<T3>::type, 954 typename internal::DecayArray<T4>::type, 955 typename internal::DecayArray<T5>::type, 956 typename internal::DecayArray<T6>::type, 957 typename internal::DecayArray<T7>::type, 958 typename internal::DecayArray<T8>::type, 959 typename internal::DecayArray<T9>::type> > 960 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 961 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) { 962 typedef std::tr1::tuple< 963 typename internal::DecayArray<T1>::type, 964 typename internal::DecayArray<T2>::type, 965 typename internal::DecayArray<T3>::type, 966 typename internal::DecayArray<T4>::type, 967 typename internal::DecayArray<T5>::type, 968 typename internal::DecayArray<T6>::type, 969 typename internal::DecayArray<T7>::type, 970 typename internal::DecayArray<T8>::type, 971 typename internal::DecayArray<T9>::type> Args; 972 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, 973 e6, e7, e8, e9)); 974 } 975 976 template <typename T1, typename T2, typename T3, typename T4, typename T5, 977 typename T6, typename T7, typename T8, typename T9, typename T10> 978 inline internal::UnorderedElementsAreMatcher< 979 std::tr1::tuple< 980 typename internal::DecayArray<T1>::type, 981 typename internal::DecayArray<T2>::type, 982 typename internal::DecayArray<T3>::type, 983 typename internal::DecayArray<T4>::type, 984 typename internal::DecayArray<T5>::type, 985 typename internal::DecayArray<T6>::type, 986 typename internal::DecayArray<T7>::type, 987 typename internal::DecayArray<T8>::type, 988 typename internal::DecayArray<T9>::type, 989 typename internal::DecayArray<T10>::type> > 990 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4, 991 const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9, 992 const T10& e10) { 993 typedef std::tr1::tuple< 994 typename internal::DecayArray<T1>::type, 995 typename internal::DecayArray<T2>::type, 996 typename internal::DecayArray<T3>::type, 997 typename internal::DecayArray<T4>::type, 998 typename internal::DecayArray<T5>::type, 999 typename internal::DecayArray<T6>::type, 1000 typename internal::DecayArray<T7>::type, 1001 typename internal::DecayArray<T8>::type, 1002 typename internal::DecayArray<T9>::type, 1003 typename internal::DecayArray<T10>::type> Args; 1004 return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, 1005 e6, e7, e8, e9, e10)); 1006 } 1007 1008 // AllOf(m1, m2, ..., mk) matches any value that matches all of the given 1009 // sub-matchers. AllOf is called fully qualified to prevent ADL from firing. 1010 1011 template <typename M1, typename M2> 1012 inline typename internal::AllOfResult2<M1, M2>::type 1013 AllOf(M1 m1, M2 m2) { 1014 return typename internal::AllOfResult2<M1, M2>::type( 1015 m1, 1016 m2); 1017 } 1018 1019 template <typename M1, typename M2, typename M3> 1020 inline typename internal::AllOfResult3<M1, M2, M3>::type 1021 AllOf(M1 m1, M2 m2, M3 m3) { 1022 return typename internal::AllOfResult3<M1, M2, M3>::type( 1023 m1, 1024 ::testing::AllOf(m2, m3)); 1025 } 1026 1027 template <typename M1, typename M2, typename M3, typename M4> 1028 inline typename internal::AllOfResult4<M1, M2, M3, M4>::type 1029 AllOf(M1 m1, M2 m2, M3 m3, M4 m4) { 1030 return typename internal::AllOfResult4<M1, M2, M3, M4>::type( 1031 ::testing::AllOf(m1, m2), 1032 ::testing::AllOf(m3, m4)); 1033 } 1034 1035 template <typename M1, typename M2, typename M3, typename M4, typename M5> 1036 inline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type 1037 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) { 1038 return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type( 1039 ::testing::AllOf(m1, m2), 1040 ::testing::AllOf(m3, m4, m5)); 1041 } 1042 1043 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1044 typename M6> 1045 inline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type 1046 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) { 1047 return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type( 1048 ::testing::AllOf(m1, m2, m3), 1049 ::testing::AllOf(m4, m5, m6)); 1050 } 1051 1052 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1053 typename M6, typename M7> 1054 inline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type 1055 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) { 1056 return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type( 1057 ::testing::AllOf(m1, m2, m3), 1058 ::testing::AllOf(m4, m5, m6, m7)); 1059 } 1060 1061 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1062 typename M6, typename M7, typename M8> 1063 inline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type 1064 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) { 1065 return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type( 1066 ::testing::AllOf(m1, m2, m3, m4), 1067 ::testing::AllOf(m5, m6, m7, m8)); 1068 } 1069 1070 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1071 typename M6, typename M7, typename M8, typename M9> 1072 inline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type 1073 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) { 1074 return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, 1075 M9>::type( 1076 ::testing::AllOf(m1, m2, m3, m4), 1077 ::testing::AllOf(m5, m6, m7, m8, m9)); 1078 } 1079 1080 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1081 typename M6, typename M7, typename M8, typename M9, typename M10> 1082 inline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9, 1083 M10>::type 1084 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) { 1085 return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9, 1086 M10>::type( 1087 ::testing::AllOf(m1, m2, m3, m4, m5), 1088 ::testing::AllOf(m6, m7, m8, m9, m10)); 1089 } 1090 1091 // AnyOf(m1, m2, ..., mk) matches any value that matches any of the given 1092 // sub-matchers. AnyOf is called fully qualified to prevent ADL from firing. 1093 1094 template <typename M1, typename M2> 1095 inline typename internal::AnyOfResult2<M1, M2>::type 1096 AnyOf(M1 m1, M2 m2) { 1097 return typename internal::AnyOfResult2<M1, M2>::type( 1098 m1, 1099 m2); 1100 } 1101 1102 template <typename M1, typename M2, typename M3> 1103 inline typename internal::AnyOfResult3<M1, M2, M3>::type 1104 AnyOf(M1 m1, M2 m2, M3 m3) { 1105 return typename internal::AnyOfResult3<M1, M2, M3>::type( 1106 m1, 1107 ::testing::AnyOf(m2, m3)); 1108 } 1109 1110 template <typename M1, typename M2, typename M3, typename M4> 1111 inline typename internal::AnyOfResult4<M1, M2, M3, M4>::type 1112 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) { 1113 return typename internal::AnyOfResult4<M1, M2, M3, M4>::type( 1114 ::testing::AnyOf(m1, m2), 1115 ::testing::AnyOf(m3, m4)); 1116 } 1117 1118 template <typename M1, typename M2, typename M3, typename M4, typename M5> 1119 inline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type 1120 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) { 1121 return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type( 1122 ::testing::AnyOf(m1, m2), 1123 ::testing::AnyOf(m3, m4, m5)); 1124 } 1125 1126 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1127 typename M6> 1128 inline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type 1129 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) { 1130 return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type( 1131 ::testing::AnyOf(m1, m2, m3), 1132 ::testing::AnyOf(m4, m5, m6)); 1133 } 1134 1135 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1136 typename M6, typename M7> 1137 inline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type 1138 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) { 1139 return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type( 1140 ::testing::AnyOf(m1, m2, m3), 1141 ::testing::AnyOf(m4, m5, m6, m7)); 1142 } 1143 1144 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1145 typename M6, typename M7, typename M8> 1146 inline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type 1147 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) { 1148 return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type( 1149 ::testing::AnyOf(m1, m2, m3, m4), 1150 ::testing::AnyOf(m5, m6, m7, m8)); 1151 } 1152 1153 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1154 typename M6, typename M7, typename M8, typename M9> 1155 inline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type 1156 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) { 1157 return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, 1158 M9>::type( 1159 ::testing::AnyOf(m1, m2, m3, m4), 1160 ::testing::AnyOf(m5, m6, m7, m8, m9)); 1161 } 1162 1163 template <typename M1, typename M2, typename M3, typename M4, typename M5, 1164 typename M6, typename M7, typename M8, typename M9, typename M10> 1165 inline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9, 1166 M10>::type 1167 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) { 1168 return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9, 1169 M10>::type( 1170 ::testing::AnyOf(m1, m2, m3, m4, m5), 1171 ::testing::AnyOf(m6, m7, m8, m9, m10)); 1172 } 1173 1174 } // namespace testing 1175 1176 1177 // The MATCHER* family of macros can be used in a namespace scope to 1178 // define custom matchers easily. 1179 // 1180 // Basic Usage 1181 // =========== 1182 // 1183 // The syntax 1184 // 1185 // MATCHER(name, description_string) { statements; } 1186 // 1187 // defines a matcher with the given name that executes the statements, 1188 // which must return a bool to indicate if the match succeeds. Inside 1189 // the statements, you can refer to the value being matched by 'arg', 1190 // and refer to its type by 'arg_type'. 1191 // 1192 // The description string documents what the matcher does, and is used 1193 // to generate the failure message when the match fails. Since a 1194 // MATCHER() is usually defined in a header file shared by multiple 1195 // C++ source files, we require the description to be a C-string 1196 // literal to avoid possible side effects. It can be empty, in which 1197 // case we'll use the sequence of words in the matcher name as the 1198 // description. 1199 // 1200 // For example: 1201 // 1202 // MATCHER(IsEven, "") { return (arg % 2) == 0; } 1203 // 1204 // allows you to write 1205 // 1206 // // Expects mock_foo.Bar(n) to be called where n is even. 1207 // EXPECT_CALL(mock_foo, Bar(IsEven())); 1208 // 1209 // or, 1210 // 1211 // // Verifies that the value of some_expression is even. 1212 // EXPECT_THAT(some_expression, IsEven()); 1213 // 1214 // If the above assertion fails, it will print something like: 1215 // 1216 // Value of: some_expression 1217 // Expected: is even 1218 // Actual: 7 1219 // 1220 // where the description "is even" is automatically calculated from the 1221 // matcher name IsEven. 1222 // 1223 // Argument Type 1224 // ============= 1225 // 1226 // Note that the type of the value being matched (arg_type) is 1227 // determined by the context in which you use the matcher and is 1228 // supplied to you by the compiler, so you don't need to worry about 1229 // declaring it (nor can you). This allows the matcher to be 1230 // polymorphic. For example, IsEven() can be used to match any type 1231 // where the value of "(arg % 2) == 0" can be implicitly converted to 1232 // a bool. In the "Bar(IsEven())" example above, if method Bar() 1233 // takes an int, 'arg_type' will be int; if it takes an unsigned long, 1234 // 'arg_type' will be unsigned long; and so on. 1235 // 1236 // Parameterizing Matchers 1237 // ======================= 1238 // 1239 // Sometimes you'll want to parameterize the matcher. For that you 1240 // can use another macro: 1241 // 1242 // MATCHER_P(name, param_name, description_string) { statements; } 1243 // 1244 // For example: 1245 // 1246 // MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; } 1247 // 1248 // will allow you to write: 1249 // 1250 // EXPECT_THAT(Blah("a"), HasAbsoluteValue(n)); 1251 // 1252 // which may lead to this message (assuming n is 10): 1253 // 1254 // Value of: Blah("a") 1255 // Expected: has absolute value 10 1256 // Actual: -9 1257 // 1258 // Note that both the matcher description and its parameter are 1259 // printed, making the message human-friendly. 1260 // 1261 // In the matcher definition body, you can write 'foo_type' to 1262 // reference the type of a parameter named 'foo'. For example, in the 1263 // body of MATCHER_P(HasAbsoluteValue, value) above, you can write 1264 // 'value_type' to refer to the type of 'value'. 1265 // 1266 // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to 1267 // support multi-parameter matchers. 1268 // 1269 // Describing Parameterized Matchers 1270 // ================================= 1271 // 1272 // The last argument to MATCHER*() is a string-typed expression. The 1273 // expression can reference all of the matcher's parameters and a 1274 // special bool-typed variable named 'negation'. When 'negation' is 1275 // false, the expression should evaluate to the matcher's description; 1276 // otherwise it should evaluate to the description of the negation of 1277 // the matcher. For example, 1278 // 1279 // using testing::PrintToString; 1280 // 1281 // MATCHER_P2(InClosedRange, low, hi, 1282 // string(negation ? "is not" : "is") + " in range [" + 1283 // PrintToString(low) + ", " + PrintToString(hi) + "]") { 1284 // return low <= arg && arg <= hi; 1285 // } 1286 // ... 1287 // EXPECT_THAT(3, InClosedRange(4, 6)); 1288 // EXPECT_THAT(3, Not(InClosedRange(2, 4))); 1289 // 1290 // would generate two failures that contain the text: 1291 // 1292 // Expected: is in range [4, 6] 1293 // ... 1294 // Expected: is not in range [2, 4] 1295 // 1296 // If you specify "" as the description, the failure message will 1297 // contain the sequence of words in the matcher name followed by the 1298 // parameter values printed as a tuple. For example, 1299 // 1300 // MATCHER_P2(InClosedRange, low, hi, "") { ... } 1301 // ... 1302 // EXPECT_THAT(3, InClosedRange(4, 6)); 1303 // EXPECT_THAT(3, Not(InClosedRange(2, 4))); 1304 // 1305 // would generate two failures that contain the text: 1306 // 1307 // Expected: in closed range (4, 6) 1308 // ... 1309 // Expected: not (in closed range (2, 4)) 1310 // 1311 // Types of Matcher Parameters 1312 // =========================== 1313 // 1314 // For the purpose of typing, you can view 1315 // 1316 // MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... } 1317 // 1318 // as shorthand for 1319 // 1320 // template <typename p1_type, ..., typename pk_type> 1321 // FooMatcherPk<p1_type, ..., pk_type> 1322 // Foo(p1_type p1, ..., pk_type pk) { ... } 1323 // 1324 // When you write Foo(v1, ..., vk), the compiler infers the types of 1325 // the parameters v1, ..., and vk for you. If you are not happy with 1326 // the result of the type inference, you can specify the types by 1327 // explicitly instantiating the template, as in Foo<long, bool>(5, 1328 // false). As said earlier, you don't get to (or need to) specify 1329 // 'arg_type' as that's determined by the context in which the matcher 1330 // is used. You can assign the result of expression Foo(p1, ..., pk) 1331 // to a variable of type FooMatcherPk<p1_type, ..., pk_type>. This 1332 // can be useful when composing matchers. 1333 // 1334 // While you can instantiate a matcher template with reference types, 1335 // passing the parameters by pointer usually makes your code more 1336 // readable. If, however, you still want to pass a parameter by 1337 // reference, be aware that in the failure message generated by the 1338 // matcher you will see the value of the referenced object but not its 1339 // address. 1340 // 1341 // Explaining Match Results 1342 // ======================== 1343 // 1344 // Sometimes the matcher description alone isn't enough to explain why 1345 // the match has failed or succeeded. For example, when expecting a 1346 // long string, it can be very helpful to also print the diff between 1347 // the expected string and the actual one. To achieve that, you can 1348 // optionally stream additional information to a special variable 1349 // named result_listener, whose type is a pointer to class 1350 // MatchResultListener: 1351 // 1352 // MATCHER_P(EqualsLongString, str, "") { 1353 // if (arg == str) return true; 1354 // 1355 // *result_listener << "the difference: " 1356 /// << DiffStrings(str, arg); 1357 // return false; 1358 // } 1359 // 1360 // Overloading Matchers 1361 // ==================== 1362 // 1363 // You can overload matchers with different numbers of parameters: 1364 // 1365 // MATCHER_P(Blah, a, description_string1) { ... } 1366 // MATCHER_P2(Blah, a, b, description_string2) { ... } 1367 // 1368 // Caveats 1369 // ======= 1370 // 1371 // When defining a new matcher, you should also consider implementing 1372 // MatcherInterface or using MakePolymorphicMatcher(). These 1373 // approaches require more work than the MATCHER* macros, but also 1374 // give you more control on the types of the value being matched and 1375 // the matcher parameters, which may leads to better compiler error 1376 // messages when the matcher is used wrong. They also allow 1377 // overloading matchers based on parameter types (as opposed to just 1378 // based on the number of parameters). 1379 // 1380 // MATCHER*() can only be used in a namespace scope. The reason is 1381 // that C++ doesn't yet allow function-local types to be used to 1382 // instantiate templates. The up-coming C++0x standard will fix this. 1383 // Once that's done, we'll consider supporting using MATCHER*() inside 1384 // a function. 1385 // 1386 // More Information 1387 // ================ 1388 // 1389 // To learn more about using these macros, please search for 'MATCHER' 1390 // on http://code.google.com/p/googlemock/wiki/CookBook. 1391 1392 #define MATCHER(name, description)\ 1393 class name##Matcher {\ 1394 public:\ 1395 template <typename arg_type>\ 1396 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1397 public:\ 1398 gmock_Impl()\ 1399 {}\ 1400 virtual bool MatchAndExplain(\ 1401 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1402 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1403 *gmock_os << FormatDescription(false);\ 1404 }\ 1405 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1406 *gmock_os << FormatDescription(true);\ 1407 }\ 1408 private:\ 1409 ::testing::internal::string FormatDescription(bool negation) const {\ 1410 const ::testing::internal::string gmock_description = (description);\ 1411 if (!gmock_description.empty())\ 1412 return gmock_description;\ 1413 return ::testing::internal::FormatMatcherDescription(\ 1414 negation, #name, \ 1415 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1416 ::std::tr1::tuple<>()));\ 1417 }\ 1418 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1419 };\ 1420 template <typename arg_type>\ 1421 operator ::testing::Matcher<arg_type>() const {\ 1422 return ::testing::Matcher<arg_type>(\ 1423 new gmock_Impl<arg_type>());\ 1424 }\ 1425 name##Matcher() {\ 1426 }\ 1427 private:\ 1428 GTEST_DISALLOW_ASSIGN_(name##Matcher);\ 1429 };\ 1430 inline name##Matcher name() {\ 1431 return name##Matcher();\ 1432 }\ 1433 template <typename arg_type>\ 1434 bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\ 1435 arg_type arg, \ 1436 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1437 const 1438 1439 #define MATCHER_P(name, p0, description)\ 1440 template <typename p0##_type>\ 1441 class name##MatcherP {\ 1442 public:\ 1443 template <typename arg_type>\ 1444 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1445 public:\ 1446 explicit gmock_Impl(p0##_type gmock_p0)\ 1447 : p0(gmock_p0) {}\ 1448 virtual bool MatchAndExplain(\ 1449 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1450 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1451 *gmock_os << FormatDescription(false);\ 1452 }\ 1453 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1454 *gmock_os << FormatDescription(true);\ 1455 }\ 1456 p0##_type p0;\ 1457 private:\ 1458 ::testing::internal::string FormatDescription(bool negation) const {\ 1459 const ::testing::internal::string gmock_description = (description);\ 1460 if (!gmock_description.empty())\ 1461 return gmock_description;\ 1462 return ::testing::internal::FormatMatcherDescription(\ 1463 negation, #name, \ 1464 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1465 ::std::tr1::tuple<p0##_type>(p0)));\ 1466 }\ 1467 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1468 };\ 1469 template <typename arg_type>\ 1470 operator ::testing::Matcher<arg_type>() const {\ 1471 return ::testing::Matcher<arg_type>(\ 1472 new gmock_Impl<arg_type>(p0));\ 1473 }\ 1474 name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\ 1475 }\ 1476 p0##_type p0;\ 1477 private:\ 1478 GTEST_DISALLOW_ASSIGN_(name##MatcherP);\ 1479 };\ 1480 template <typename p0##_type>\ 1481 inline name##MatcherP<p0##_type> name(p0##_type p0) {\ 1482 return name##MatcherP<p0##_type>(p0);\ 1483 }\ 1484 template <typename p0##_type>\ 1485 template <typename arg_type>\ 1486 bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1487 arg_type arg, \ 1488 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1489 const 1490 1491 #define MATCHER_P2(name, p0, p1, description)\ 1492 template <typename p0##_type, typename p1##_type>\ 1493 class name##MatcherP2 {\ 1494 public:\ 1495 template <typename arg_type>\ 1496 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1497 public:\ 1498 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\ 1499 : p0(gmock_p0), p1(gmock_p1) {}\ 1500 virtual bool MatchAndExplain(\ 1501 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1502 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1503 *gmock_os << FormatDescription(false);\ 1504 }\ 1505 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1506 *gmock_os << FormatDescription(true);\ 1507 }\ 1508 p0##_type p0;\ 1509 p1##_type p1;\ 1510 private:\ 1511 ::testing::internal::string FormatDescription(bool negation) const {\ 1512 const ::testing::internal::string gmock_description = (description);\ 1513 if (!gmock_description.empty())\ 1514 return gmock_description;\ 1515 return ::testing::internal::FormatMatcherDescription(\ 1516 negation, #name, \ 1517 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1518 ::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\ 1519 }\ 1520 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1521 };\ 1522 template <typename arg_type>\ 1523 operator ::testing::Matcher<arg_type>() const {\ 1524 return ::testing::Matcher<arg_type>(\ 1525 new gmock_Impl<arg_type>(p0, p1));\ 1526 }\ 1527 name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ 1528 p1(gmock_p1) {\ 1529 }\ 1530 p0##_type p0;\ 1531 p1##_type p1;\ 1532 private:\ 1533 GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\ 1534 };\ 1535 template <typename p0##_type, typename p1##_type>\ 1536 inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \ 1537 p1##_type p1) {\ 1538 return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\ 1539 }\ 1540 template <typename p0##_type, typename p1##_type>\ 1541 template <typename arg_type>\ 1542 bool name##MatcherP2<p0##_type, \ 1543 p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1544 arg_type arg, \ 1545 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1546 const 1547 1548 #define MATCHER_P3(name, p0, p1, p2, description)\ 1549 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1550 class name##MatcherP3 {\ 1551 public:\ 1552 template <typename arg_type>\ 1553 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1554 public:\ 1555 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\ 1556 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ 1557 virtual bool MatchAndExplain(\ 1558 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1559 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1560 *gmock_os << FormatDescription(false);\ 1561 }\ 1562 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1563 *gmock_os << FormatDescription(true);\ 1564 }\ 1565 p0##_type p0;\ 1566 p1##_type p1;\ 1567 p2##_type p2;\ 1568 private:\ 1569 ::testing::internal::string FormatDescription(bool negation) const {\ 1570 const ::testing::internal::string gmock_description = (description);\ 1571 if (!gmock_description.empty())\ 1572 return gmock_description;\ 1573 return ::testing::internal::FormatMatcherDescription(\ 1574 negation, #name, \ 1575 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1576 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \ 1577 p2)));\ 1578 }\ 1579 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1580 };\ 1581 template <typename arg_type>\ 1582 operator ::testing::Matcher<arg_type>() const {\ 1583 return ::testing::Matcher<arg_type>(\ 1584 new gmock_Impl<arg_type>(p0, p1, p2));\ 1585 }\ 1586 name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ 1587 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\ 1588 }\ 1589 p0##_type p0;\ 1590 p1##_type p1;\ 1591 p2##_type p2;\ 1592 private:\ 1593 GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\ 1594 };\ 1595 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1596 inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ 1597 p1##_type p1, p2##_type p2) {\ 1598 return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\ 1599 }\ 1600 template <typename p0##_type, typename p1##_type, typename p2##_type>\ 1601 template <typename arg_type>\ 1602 bool name##MatcherP3<p0##_type, p1##_type, \ 1603 p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1604 arg_type arg, \ 1605 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1606 const 1607 1608 #define MATCHER_P4(name, p0, p1, p2, p3, description)\ 1609 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1610 typename p3##_type>\ 1611 class name##MatcherP4 {\ 1612 public:\ 1613 template <typename arg_type>\ 1614 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1615 public:\ 1616 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1617 p3##_type gmock_p3)\ 1618 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\ 1619 virtual bool MatchAndExplain(\ 1620 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1621 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1622 *gmock_os << FormatDescription(false);\ 1623 }\ 1624 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1625 *gmock_os << FormatDescription(true);\ 1626 }\ 1627 p0##_type p0;\ 1628 p1##_type p1;\ 1629 p2##_type p2;\ 1630 p3##_type p3;\ 1631 private:\ 1632 ::testing::internal::string FormatDescription(bool negation) const {\ 1633 const ::testing::internal::string gmock_description = (description);\ 1634 if (!gmock_description.empty())\ 1635 return gmock_description;\ 1636 return ::testing::internal::FormatMatcherDescription(\ 1637 negation, #name, \ 1638 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1639 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \ 1640 p3##_type>(p0, p1, p2, p3)));\ 1641 }\ 1642 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1643 };\ 1644 template <typename arg_type>\ 1645 operator ::testing::Matcher<arg_type>() const {\ 1646 return ::testing::Matcher<arg_type>(\ 1647 new gmock_Impl<arg_type>(p0, p1, p2, p3));\ 1648 }\ 1649 name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ 1650 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ 1651 p2(gmock_p2), p3(gmock_p3) {\ 1652 }\ 1653 p0##_type p0;\ 1654 p1##_type p1;\ 1655 p2##_type p2;\ 1656 p3##_type p3;\ 1657 private:\ 1658 GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\ 1659 };\ 1660 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1661 typename p3##_type>\ 1662 inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \ 1663 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 1664 p3##_type p3) {\ 1665 return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \ 1666 p1, p2, p3);\ 1667 }\ 1668 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1669 typename p3##_type>\ 1670 template <typename arg_type>\ 1671 bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \ 1672 p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1673 arg_type arg, \ 1674 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1675 const 1676 1677 #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ 1678 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1679 typename p3##_type, typename p4##_type>\ 1680 class name##MatcherP5 {\ 1681 public:\ 1682 template <typename arg_type>\ 1683 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1684 public:\ 1685 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1686 p3##_type gmock_p3, p4##_type gmock_p4)\ 1687 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1688 p4(gmock_p4) {}\ 1689 virtual bool MatchAndExplain(\ 1690 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1691 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1692 *gmock_os << FormatDescription(false);\ 1693 }\ 1694 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1695 *gmock_os << FormatDescription(true);\ 1696 }\ 1697 p0##_type p0;\ 1698 p1##_type p1;\ 1699 p2##_type p2;\ 1700 p3##_type p3;\ 1701 p4##_type p4;\ 1702 private:\ 1703 ::testing::internal::string FormatDescription(bool negation) const {\ 1704 const ::testing::internal::string gmock_description = (description);\ 1705 if (!gmock_description.empty())\ 1706 return gmock_description;\ 1707 return ::testing::internal::FormatMatcherDescription(\ 1708 negation, #name, \ 1709 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1710 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1711 p4##_type>(p0, p1, p2, p3, p4)));\ 1712 }\ 1713 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1714 };\ 1715 template <typename arg_type>\ 1716 operator ::testing::Matcher<arg_type>() const {\ 1717 return ::testing::Matcher<arg_type>(\ 1718 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\ 1719 }\ 1720 name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ 1721 p2##_type gmock_p2, p3##_type gmock_p3, \ 1722 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1723 p3(gmock_p3), p4(gmock_p4) {\ 1724 }\ 1725 p0##_type p0;\ 1726 p1##_type p1;\ 1727 p2##_type p2;\ 1728 p3##_type p3;\ 1729 p4##_type p4;\ 1730 private:\ 1731 GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\ 1732 };\ 1733 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1734 typename p3##_type, typename p4##_type>\ 1735 inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1736 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 1737 p4##_type p4) {\ 1738 return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1739 p4##_type>(p0, p1, p2, p3, p4);\ 1740 }\ 1741 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1742 typename p3##_type, typename p4##_type>\ 1743 template <typename arg_type>\ 1744 bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \ 1745 p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1746 arg_type arg, \ 1747 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1748 const 1749 1750 #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ 1751 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1752 typename p3##_type, typename p4##_type, typename p5##_type>\ 1753 class name##MatcherP6 {\ 1754 public:\ 1755 template <typename arg_type>\ 1756 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1757 public:\ 1758 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1759 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\ 1760 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1761 p4(gmock_p4), p5(gmock_p5) {}\ 1762 virtual bool MatchAndExplain(\ 1763 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1764 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1765 *gmock_os << FormatDescription(false);\ 1766 }\ 1767 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1768 *gmock_os << FormatDescription(true);\ 1769 }\ 1770 p0##_type p0;\ 1771 p1##_type p1;\ 1772 p2##_type p2;\ 1773 p3##_type p3;\ 1774 p4##_type p4;\ 1775 p5##_type p5;\ 1776 private:\ 1777 ::testing::internal::string FormatDescription(bool negation) const {\ 1778 const ::testing::internal::string gmock_description = (description);\ 1779 if (!gmock_description.empty())\ 1780 return gmock_description;\ 1781 return ::testing::internal::FormatMatcherDescription(\ 1782 negation, #name, \ 1783 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1784 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1785 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\ 1786 }\ 1787 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1788 };\ 1789 template <typename arg_type>\ 1790 operator ::testing::Matcher<arg_type>() const {\ 1791 return ::testing::Matcher<arg_type>(\ 1792 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\ 1793 }\ 1794 name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ 1795 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1796 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1797 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\ 1798 }\ 1799 p0##_type p0;\ 1800 p1##_type p1;\ 1801 p2##_type p2;\ 1802 p3##_type p3;\ 1803 p4##_type p4;\ 1804 p5##_type p5;\ 1805 private:\ 1806 GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\ 1807 };\ 1808 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1809 typename p3##_type, typename p4##_type, typename p5##_type>\ 1810 inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 1811 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \ 1812 p3##_type p3, p4##_type p4, p5##_type p5) {\ 1813 return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \ 1814 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\ 1815 }\ 1816 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1817 typename p3##_type, typename p4##_type, typename p5##_type>\ 1818 template <typename arg_type>\ 1819 bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1820 p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1821 arg_type arg, \ 1822 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1823 const 1824 1825 #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\ 1826 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1827 typename p3##_type, typename p4##_type, typename p5##_type, \ 1828 typename p6##_type>\ 1829 class name##MatcherP7 {\ 1830 public:\ 1831 template <typename arg_type>\ 1832 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1833 public:\ 1834 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1835 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1836 p6##_type gmock_p6)\ 1837 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1838 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ 1839 virtual bool MatchAndExplain(\ 1840 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1841 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1842 *gmock_os << FormatDescription(false);\ 1843 }\ 1844 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1845 *gmock_os << FormatDescription(true);\ 1846 }\ 1847 p0##_type p0;\ 1848 p1##_type p1;\ 1849 p2##_type p2;\ 1850 p3##_type p3;\ 1851 p4##_type p4;\ 1852 p5##_type p5;\ 1853 p6##_type p6;\ 1854 private:\ 1855 ::testing::internal::string FormatDescription(bool negation) const {\ 1856 const ::testing::internal::string gmock_description = (description);\ 1857 if (!gmock_description.empty())\ 1858 return gmock_description;\ 1859 return ::testing::internal::FormatMatcherDescription(\ 1860 negation, #name, \ 1861 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1862 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1863 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \ 1864 p6)));\ 1865 }\ 1866 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1867 };\ 1868 template <typename arg_type>\ 1869 operator ::testing::Matcher<arg_type>() const {\ 1870 return ::testing::Matcher<arg_type>(\ 1871 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\ 1872 }\ 1873 name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ 1874 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1875 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ 1876 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ 1877 p6(gmock_p6) {\ 1878 }\ 1879 p0##_type p0;\ 1880 p1##_type p1;\ 1881 p2##_type p2;\ 1882 p3##_type p3;\ 1883 p4##_type p4;\ 1884 p5##_type p5;\ 1885 p6##_type p6;\ 1886 private:\ 1887 GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\ 1888 };\ 1889 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1890 typename p3##_type, typename p4##_type, typename p5##_type, \ 1891 typename p6##_type>\ 1892 inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 1893 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \ 1894 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 1895 p6##_type p6) {\ 1896 return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \ 1897 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\ 1898 }\ 1899 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1900 typename p3##_type, typename p4##_type, typename p5##_type, \ 1901 typename p6##_type>\ 1902 template <typename arg_type>\ 1903 bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1904 p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1905 arg_type arg, \ 1906 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1907 const 1908 1909 #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\ 1910 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1911 typename p3##_type, typename p4##_type, typename p5##_type, \ 1912 typename p6##_type, typename p7##_type>\ 1913 class name##MatcherP8 {\ 1914 public:\ 1915 template <typename arg_type>\ 1916 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 1917 public:\ 1918 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 1919 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 1920 p6##_type gmock_p6, p7##_type gmock_p7)\ 1921 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 1922 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ 1923 virtual bool MatchAndExplain(\ 1924 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 1925 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 1926 *gmock_os << FormatDescription(false);\ 1927 }\ 1928 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 1929 *gmock_os << FormatDescription(true);\ 1930 }\ 1931 p0##_type p0;\ 1932 p1##_type p1;\ 1933 p2##_type p2;\ 1934 p3##_type p3;\ 1935 p4##_type p4;\ 1936 p5##_type p5;\ 1937 p6##_type p6;\ 1938 p7##_type p7;\ 1939 private:\ 1940 ::testing::internal::string FormatDescription(bool negation) const {\ 1941 const ::testing::internal::string gmock_description = (description);\ 1942 if (!gmock_description.empty())\ 1943 return gmock_description;\ 1944 return ::testing::internal::FormatMatcherDescription(\ 1945 negation, #name, \ 1946 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 1947 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 1948 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \ 1949 p3, p4, p5, p6, p7)));\ 1950 }\ 1951 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 1952 };\ 1953 template <typename arg_type>\ 1954 operator ::testing::Matcher<arg_type>() const {\ 1955 return ::testing::Matcher<arg_type>(\ 1956 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\ 1957 }\ 1958 name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ 1959 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 1960 p5##_type gmock_p5, p6##_type gmock_p6, \ 1961 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 1962 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 1963 p7(gmock_p7) {\ 1964 }\ 1965 p0##_type p0;\ 1966 p1##_type p1;\ 1967 p2##_type p2;\ 1968 p3##_type p3;\ 1969 p4##_type p4;\ 1970 p5##_type p5;\ 1971 p6##_type p6;\ 1972 p7##_type p7;\ 1973 private:\ 1974 GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\ 1975 };\ 1976 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1977 typename p3##_type, typename p4##_type, typename p5##_type, \ 1978 typename p6##_type, typename p7##_type>\ 1979 inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 1980 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \ 1981 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \ 1982 p6##_type p6, p7##_type p7) {\ 1983 return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \ 1984 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \ 1985 p6, p7);\ 1986 }\ 1987 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 1988 typename p3##_type, typename p4##_type, typename p5##_type, \ 1989 typename p6##_type, typename p7##_type>\ 1990 template <typename arg_type>\ 1991 bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 1992 p5##_type, p6##_type, \ 1993 p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 1994 arg_type arg, \ 1995 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 1996 const 1997 1998 #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\ 1999 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2000 typename p3##_type, typename p4##_type, typename p5##_type, \ 2001 typename p6##_type, typename p7##_type, typename p8##_type>\ 2002 class name##MatcherP9 {\ 2003 public:\ 2004 template <typename arg_type>\ 2005 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 2006 public:\ 2007 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 2008 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 2009 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\ 2010 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 2011 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 2012 p8(gmock_p8) {}\ 2013 virtual bool MatchAndExplain(\ 2014 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 2015 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 2016 *gmock_os << FormatDescription(false);\ 2017 }\ 2018 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 2019 *gmock_os << FormatDescription(true);\ 2020 }\ 2021 p0##_type p0;\ 2022 p1##_type p1;\ 2023 p2##_type p2;\ 2024 p3##_type p3;\ 2025 p4##_type p4;\ 2026 p5##_type p5;\ 2027 p6##_type p6;\ 2028 p7##_type p7;\ 2029 p8##_type p8;\ 2030 private:\ 2031 ::testing::internal::string FormatDescription(bool negation) const {\ 2032 const ::testing::internal::string gmock_description = (description);\ 2033 if (!gmock_description.empty())\ 2034 return gmock_description;\ 2035 return ::testing::internal::FormatMatcherDescription(\ 2036 negation, #name, \ 2037 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 2038 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 2039 p4##_type, p5##_type, p6##_type, p7##_type, \ 2040 p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ 2041 }\ 2042 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 2043 };\ 2044 template <typename arg_type>\ 2045 operator ::testing::Matcher<arg_type>() const {\ 2046 return ::testing::Matcher<arg_type>(\ 2047 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ 2048 }\ 2049 name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ 2050 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 2051 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 2052 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ 2053 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 2054 p8(gmock_p8) {\ 2055 }\ 2056 p0##_type p0;\ 2057 p1##_type p1;\ 2058 p2##_type p2;\ 2059 p3##_type p3;\ 2060 p4##_type p4;\ 2061 p5##_type p5;\ 2062 p6##_type p6;\ 2063 p7##_type p7;\ 2064 p8##_type p8;\ 2065 private:\ 2066 GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\ 2067 };\ 2068 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2069 typename p3##_type, typename p4##_type, typename p5##_type, \ 2070 typename p6##_type, typename p7##_type, typename p8##_type>\ 2071 inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 2072 p4##_type, p5##_type, p6##_type, p7##_type, \ 2073 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 2074 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \ 2075 p8##_type p8) {\ 2076 return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \ 2077 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \ 2078 p3, p4, p5, p6, p7, p8);\ 2079 }\ 2080 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2081 typename p3##_type, typename p4##_type, typename p5##_type, \ 2082 typename p6##_type, typename p7##_type, typename p8##_type>\ 2083 template <typename arg_type>\ 2084 bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \ 2085 p5##_type, p6##_type, p7##_type, \ 2086 p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 2087 arg_type arg, \ 2088 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 2089 const 2090 2091 #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\ 2092 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2093 typename p3##_type, typename p4##_type, typename p5##_type, \ 2094 typename p6##_type, typename p7##_type, typename p8##_type, \ 2095 typename p9##_type>\ 2096 class name##MatcherP10 {\ 2097 public:\ 2098 template <typename arg_type>\ 2099 class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\ 2100 public:\ 2101 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ 2102 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ 2103 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ 2104 p9##_type gmock_p9)\ 2105 : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \ 2106 p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ 2107 p8(gmock_p8), p9(gmock_p9) {}\ 2108 virtual bool MatchAndExplain(\ 2109 arg_type arg, ::testing::MatchResultListener* result_listener) const;\ 2110 virtual void DescribeTo(::std::ostream* gmock_os) const {\ 2111 *gmock_os << FormatDescription(false);\ 2112 }\ 2113 virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\ 2114 *gmock_os << FormatDescription(true);\ 2115 }\ 2116 p0##_type p0;\ 2117 p1##_type p1;\ 2118 p2##_type p2;\ 2119 p3##_type p3;\ 2120 p4##_type p4;\ 2121 p5##_type p5;\ 2122 p6##_type p6;\ 2123 p7##_type p7;\ 2124 p8##_type p8;\ 2125 p9##_type p9;\ 2126 private:\ 2127 ::testing::internal::string FormatDescription(bool negation) const {\ 2128 const ::testing::internal::string gmock_description = (description);\ 2129 if (!gmock_description.empty())\ 2130 return gmock_description;\ 2131 return ::testing::internal::FormatMatcherDescription(\ 2132 negation, #name, \ 2133 ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\ 2134 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \ 2135 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2136 p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ 2137 }\ 2138 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\ 2139 };\ 2140 template <typename arg_type>\ 2141 operator ::testing::Matcher<arg_type>() const {\ 2142 return ::testing::Matcher<arg_type>(\ 2143 new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ 2144 }\ 2145 name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ 2146 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ 2147 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ 2148 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ 2149 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ 2150 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\ 2151 }\ 2152 p0##_type p0;\ 2153 p1##_type p1;\ 2154 p2##_type p2;\ 2155 p3##_type p3;\ 2156 p4##_type p4;\ 2157 p5##_type p5;\ 2158 p6##_type p6;\ 2159 p7##_type p7;\ 2160 p8##_type p8;\ 2161 p9##_type p9;\ 2162 private:\ 2163 GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\ 2164 };\ 2165 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2166 typename p3##_type, typename p4##_type, typename p5##_type, \ 2167 typename p6##_type, typename p7##_type, typename p8##_type, \ 2168 typename p9##_type>\ 2169 inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2170 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2171 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \ 2172 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \ 2173 p9##_type p9) {\ 2174 return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2175 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \ 2176 p1, p2, p3, p4, p5, p6, p7, p8, p9);\ 2177 }\ 2178 template <typename p0##_type, typename p1##_type, typename p2##_type, \ 2179 typename p3##_type, typename p4##_type, typename p5##_type, \ 2180 typename p6##_type, typename p7##_type, typename p8##_type, \ 2181 typename p9##_type>\ 2182 template <typename arg_type>\ 2183 bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \ 2184 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \ 2185 p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\ 2186 arg_type arg, \ 2187 ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\ 2188 const 2189 2190 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_ 2191