gmock-generated-matchers.h
Go to the documentation of this file.
00001 // This file was GENERATED by command:
00002 //     pump.py gmock-generated-matchers.h.pump
00003 // DO NOT EDIT BY HAND!!!
00004 
00005 // Copyright 2008, Google Inc.
00006 // All rights reserved.
00007 //
00008 // Redistribution and use in source and binary forms, with or without
00009 // modification, are permitted provided that the following conditions are
00010 // met:
00011 //
00012 //     * Redistributions of source code must retain the above copyright
00013 // notice, this list of conditions and the following disclaimer.
00014 //     * Redistributions in binary form must reproduce the above
00015 // copyright notice, this list of conditions and the following disclaimer
00016 // in the documentation and/or other materials provided with the
00017 // distribution.
00018 //     * Neither the name of Google Inc. nor the names of its
00019 // contributors may be used to endorse or promote products derived from
00020 // this software without specific prior written permission.
00021 //
00022 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00023 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00024 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00025 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00026 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00027 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00028 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00029 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00030 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00031 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00032 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 
00034 // Google Mock - a framework for writing C++ mock classes.
00035 //
00036 // This file implements some commonly used variadic matchers.
00037 
00038 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
00039 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
00040 
00041 #include <iterator>
00042 #include <sstream>
00043 #include <string>
00044 #include <vector>
00045 #include "gmock/gmock-matchers.h"
00046 
00047 namespace testing {
00048 namespace internal {
00049 
00050 // The type of the i-th (0-based) field of Tuple.
00051 #define GMOCK_FIELD_TYPE_(Tuple, i) \
00052     typename ::std::tr1::tuple_element<i, Tuple>::type
00053 
00054 // TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
00055 // tuple of type Tuple.  It has two members:
00056 //
00057 //   type: a tuple type whose i-th field is the ki-th field of Tuple.
00058 //   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
00059 //
00060 // For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:
00061 //
00062 //   type is tuple<int, bool>, and
00063 //   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).
00064 
00065 template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
00066     int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
00067     int k9 = -1>
00068 class TupleFields;
00069 
00070 // This generic version is used when there are 10 selectors.
00071 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
00072     int k7, int k8, int k9>
00073 class TupleFields {
00074  public:
00075   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00076       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00077       GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
00078       GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
00079       GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),
00080       GMOCK_FIELD_TYPE_(Tuple, k9)> type;
00081   static type GetSelectedFields(const Tuple& t) {
00082     using ::std::tr1::get;
00083     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
00084         get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));
00085   }
00086 };
00087 
00088 // The following specialization is used for 0 ~ 9 selectors.
00089 
00090 template <class Tuple>
00091 class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
00092  public:
00093   typedef ::std::tr1::tuple<> type;
00094   static type GetSelectedFields(const Tuple& /* t */) {
00095     using ::std::tr1::get;
00096     return type();
00097   }
00098 };
00099 
00100 template <class Tuple, int k0>
00101 class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
00102  public:
00103   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;
00104   static type GetSelectedFields(const Tuple& t) {
00105     using ::std::tr1::get;
00106     return type(get<k0>(t));
00107   }
00108 };
00109 
00110 template <class Tuple, int k0, int k1>
00111 class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {
00112  public:
00113   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00114       GMOCK_FIELD_TYPE_(Tuple, k1)> type;
00115   static type GetSelectedFields(const Tuple& t) {
00116     using ::std::tr1::get;
00117     return type(get<k0>(t), get<k1>(t));
00118   }
00119 };
00120 
00121 template <class Tuple, int k0, int k1, int k2>
00122 class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {
00123  public:
00124   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00125       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;
00126   static type GetSelectedFields(const Tuple& t) {
00127     using ::std::tr1::get;
00128     return type(get<k0>(t), get<k1>(t), get<k2>(t));
00129   }
00130 };
00131 
00132 template <class Tuple, int k0, int k1, int k2, int k3>
00133 class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {
00134  public:
00135   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00136       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00137       GMOCK_FIELD_TYPE_(Tuple, k3)> type;
00138   static type GetSelectedFields(const Tuple& t) {
00139     using ::std::tr1::get;
00140     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));
00141   }
00142 };
00143 
00144 template <class Tuple, int k0, int k1, int k2, int k3, int k4>
00145 class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {
00146  public:
00147   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00148       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00149       GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;
00150   static type GetSelectedFields(const Tuple& t) {
00151     using ::std::tr1::get;
00152     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));
00153   }
00154 };
00155 
00156 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>
00157 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {
00158  public:
00159   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00160       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00161       GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
00162       GMOCK_FIELD_TYPE_(Tuple, k5)> type;
00163   static type GetSelectedFields(const Tuple& t) {
00164     using ::std::tr1::get;
00165     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
00166         get<k5>(t));
00167   }
00168 };
00169 
00170 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>
00171 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {
00172  public:
00173   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00174       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00175       GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
00176       GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;
00177   static type GetSelectedFields(const Tuple& t) {
00178     using ::std::tr1::get;
00179     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
00180         get<k5>(t), get<k6>(t));
00181   }
00182 };
00183 
00184 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
00185     int k7>
00186 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {
00187  public:
00188   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00189       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00190       GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
00191       GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
00192       GMOCK_FIELD_TYPE_(Tuple, k7)> type;
00193   static type GetSelectedFields(const Tuple& t) {
00194     using ::std::tr1::get;
00195     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
00196         get<k5>(t), get<k6>(t), get<k7>(t));
00197   }
00198 };
00199 
00200 template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
00201     int k7, int k8>
00202 class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {
00203  public:
00204   typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
00205       GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
00206       GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
00207       GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
00208       GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;
00209   static type GetSelectedFields(const Tuple& t) {
00210     using ::std::tr1::get;
00211     return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
00212         get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));
00213   }
00214 };
00215 
00216 #undef GMOCK_FIELD_TYPE_
00217 
00218 // Implements the Args() matcher.
00219 template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
00220     int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
00221     int k9 = -1>
00222 class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
00223  public:
00224   // ArgsTuple may have top-level const or reference modifiers.
00225   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;
00226   typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,
00227       k6, k7, k8, k9>::type SelectedArgs;
00228   typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;
00229 
00230   template <typename InnerMatcher>
00231   explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
00232       : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
00233 
00234   virtual bool MatchAndExplain(ArgsTuple args,
00235                                MatchResultListener* listener) const {
00236     const SelectedArgs& selected_args = GetSelectedArgs(args);
00237     if (!listener->IsInterested())
00238       return inner_matcher_.Matches(selected_args);
00239 
00240     PrintIndices(listener->stream());
00241     *listener << "are " << PrintToString(selected_args);
00242 
00243     StringMatchResultListener inner_listener;
00244     const bool match = inner_matcher_.MatchAndExplain(selected_args,
00245                                                       &inner_listener);
00246     PrintIfNotEmpty(inner_listener.str(), listener->stream());
00247     return match;
00248   }
00249 
00250   virtual void DescribeTo(::std::ostream* os) const {
00251     *os << "are a tuple ";
00252     PrintIndices(os);
00253     inner_matcher_.DescribeTo(os);
00254   }
00255 
00256   virtual void DescribeNegationTo(::std::ostream* os) const {
00257     *os << "are a tuple ";
00258     PrintIndices(os);
00259     inner_matcher_.DescribeNegationTo(os);
00260   }
00261 
00262  private:
00263   static SelectedArgs GetSelectedArgs(ArgsTuple args) {
00264     return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,
00265         k9>::GetSelectedFields(args);
00266   }
00267 
00268   // Prints the indices of the selected fields.
00269   static void PrintIndices(::std::ostream* os) {
00270     *os << "whose fields (";
00271     const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };
00272     for (int i = 0; i < 10; i++) {
00273       if (indices[i] < 0)
00274         break;
00275 
00276       if (i >= 1)
00277         *os << ", ";
00278 
00279       *os << "#" << indices[i];
00280     }
00281     *os << ") ";
00282   }
00283 
00284   const MonomorphicInnerMatcher inner_matcher_;
00285 
00286   GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);
00287 };
00288 
00289 template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,
00290     int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,
00291     int k8 = -1, int k9 = -1>
00292 class ArgsMatcher {
00293  public:
00294   explicit ArgsMatcher(const InnerMatcher& inner_matcher)
00295       : inner_matcher_(inner_matcher) {}
00296 
00297   template <typename ArgsTuple>
00298   operator Matcher<ArgsTuple>() const {
00299     return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,
00300         k6, k7, k8, k9>(inner_matcher_));
00301   }
00302 
00303  private:
00304   const InnerMatcher inner_matcher_;
00305 
00306   GTEST_DISALLOW_ASSIGN_(ArgsMatcher);
00307 };
00308 
00309 // A set of metafunctions for computing the result type of AllOf.
00310 // AllOf(m1, ..., mN) returns
00311 // AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
00312 
00313 // Although AllOf isn't defined for one argument, AllOfResult1 is defined
00314 // to simplify the implementation.
00315 template <typename M1>
00316 struct AllOfResult1 {
00317   typedef M1 type;
00318 };
00319 
00320 template <typename M1, typename M2>
00321 struct AllOfResult2 {
00322   typedef BothOfMatcher<
00323       typename AllOfResult1<M1>::type,
00324       typename AllOfResult1<M2>::type
00325   > type;
00326 };
00327 
00328 template <typename M1, typename M2, typename M3>
00329 struct AllOfResult3 {
00330   typedef BothOfMatcher<
00331       typename AllOfResult1<M1>::type,
00332       typename AllOfResult2<M2, M3>::type
00333   > type;
00334 };
00335 
00336 template <typename M1, typename M2, typename M3, typename M4>
00337 struct AllOfResult4 {
00338   typedef BothOfMatcher<
00339       typename AllOfResult2<M1, M2>::type,
00340       typename AllOfResult2<M3, M4>::type
00341   > type;
00342 };
00343 
00344 template <typename M1, typename M2, typename M3, typename M4, typename M5>
00345 struct AllOfResult5 {
00346   typedef BothOfMatcher<
00347       typename AllOfResult2<M1, M2>::type,
00348       typename AllOfResult3<M3, M4, M5>::type
00349   > type;
00350 };
00351 
00352 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00353     typename M6>
00354 struct AllOfResult6 {
00355   typedef BothOfMatcher<
00356       typename AllOfResult3<M1, M2, M3>::type,
00357       typename AllOfResult3<M4, M5, M6>::type
00358   > type;
00359 };
00360 
00361 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00362     typename M6, typename M7>
00363 struct AllOfResult7 {
00364   typedef BothOfMatcher<
00365       typename AllOfResult3<M1, M2, M3>::type,
00366       typename AllOfResult4<M4, M5, M6, M7>::type
00367   > type;
00368 };
00369 
00370 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00371     typename M6, typename M7, typename M8>
00372 struct AllOfResult8 {
00373   typedef BothOfMatcher<
00374       typename AllOfResult4<M1, M2, M3, M4>::type,
00375       typename AllOfResult4<M5, M6, M7, M8>::type
00376   > type;
00377 };
00378 
00379 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00380     typename M6, typename M7, typename M8, typename M9>
00381 struct AllOfResult9 {
00382   typedef BothOfMatcher<
00383       typename AllOfResult4<M1, M2, M3, M4>::type,
00384       typename AllOfResult5<M5, M6, M7, M8, M9>::type
00385   > type;
00386 };
00387 
00388 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00389     typename M6, typename M7, typename M8, typename M9, typename M10>
00390 struct AllOfResult10 {
00391   typedef BothOfMatcher<
00392       typename AllOfResult5<M1, M2, M3, M4, M5>::type,
00393       typename AllOfResult5<M6, M7, M8, M9, M10>::type
00394   > type;
00395 };
00396 
00397 // A set of metafunctions for computing the result type of AnyOf.
00398 // AnyOf(m1, ..., mN) returns
00399 // AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
00400 
00401 // Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
00402 // to simplify the implementation.
00403 template <typename M1>
00404 struct AnyOfResult1 {
00405   typedef M1 type;
00406 };
00407 
00408 template <typename M1, typename M2>
00409 struct AnyOfResult2 {
00410   typedef EitherOfMatcher<
00411       typename AnyOfResult1<M1>::type,
00412       typename AnyOfResult1<M2>::type
00413   > type;
00414 };
00415 
00416 template <typename M1, typename M2, typename M3>
00417 struct AnyOfResult3 {
00418   typedef EitherOfMatcher<
00419       typename AnyOfResult1<M1>::type,
00420       typename AnyOfResult2<M2, M3>::type
00421   > type;
00422 };
00423 
00424 template <typename M1, typename M2, typename M3, typename M4>
00425 struct AnyOfResult4 {
00426   typedef EitherOfMatcher<
00427       typename AnyOfResult2<M1, M2>::type,
00428       typename AnyOfResult2<M3, M4>::type
00429   > type;
00430 };
00431 
00432 template <typename M1, typename M2, typename M3, typename M4, typename M5>
00433 struct AnyOfResult5 {
00434   typedef EitherOfMatcher<
00435       typename AnyOfResult2<M1, M2>::type,
00436       typename AnyOfResult3<M3, M4, M5>::type
00437   > type;
00438 };
00439 
00440 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00441     typename M6>
00442 struct AnyOfResult6 {
00443   typedef EitherOfMatcher<
00444       typename AnyOfResult3<M1, M2, M3>::type,
00445       typename AnyOfResult3<M4, M5, M6>::type
00446   > type;
00447 };
00448 
00449 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00450     typename M6, typename M7>
00451 struct AnyOfResult7 {
00452   typedef EitherOfMatcher<
00453       typename AnyOfResult3<M1, M2, M3>::type,
00454       typename AnyOfResult4<M4, M5, M6, M7>::type
00455   > type;
00456 };
00457 
00458 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00459     typename M6, typename M7, typename M8>
00460 struct AnyOfResult8 {
00461   typedef EitherOfMatcher<
00462       typename AnyOfResult4<M1, M2, M3, M4>::type,
00463       typename AnyOfResult4<M5, M6, M7, M8>::type
00464   > type;
00465 };
00466 
00467 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00468     typename M6, typename M7, typename M8, typename M9>
00469 struct AnyOfResult9 {
00470   typedef EitherOfMatcher<
00471       typename AnyOfResult4<M1, M2, M3, M4>::type,
00472       typename AnyOfResult5<M5, M6, M7, M8, M9>::type
00473   > type;
00474 };
00475 
00476 template <typename M1, typename M2, typename M3, typename M4, typename M5,
00477     typename M6, typename M7, typename M8, typename M9, typename M10>
00478 struct AnyOfResult10 {
00479   typedef EitherOfMatcher<
00480       typename AnyOfResult5<M1, M2, M3, M4, M5>::type,
00481       typename AnyOfResult5<M6, M7, M8, M9, M10>::type
00482   > type;
00483 };
00484 
00485 }  // namespace internal
00486 
00487 // Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
00488 // fields of it matches a_matcher.  C++ doesn't support default
00489 // arguments for function templates, so we have to overload it.
00490 template <typename InnerMatcher>
00491 inline internal::ArgsMatcher<InnerMatcher>
00492 Args(const InnerMatcher& matcher) {
00493   return internal::ArgsMatcher<InnerMatcher>(matcher);
00494 }
00495 
00496 template <int k1, typename InnerMatcher>
00497 inline internal::ArgsMatcher<InnerMatcher, k1>
00498 Args(const InnerMatcher& matcher) {
00499   return internal::ArgsMatcher<InnerMatcher, k1>(matcher);
00500 }
00501 
00502 template <int k1, int k2, typename InnerMatcher>
00503 inline internal::ArgsMatcher<InnerMatcher, k1, k2>
00504 Args(const InnerMatcher& matcher) {
00505   return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);
00506 }
00507 
00508 template <int k1, int k2, int k3, typename InnerMatcher>
00509 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>
00510 Args(const InnerMatcher& matcher) {
00511   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);
00512 }
00513 
00514 template <int k1, int k2, int k3, int k4, typename InnerMatcher>
00515 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>
00516 Args(const InnerMatcher& matcher) {
00517   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);
00518 }
00519 
00520 template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>
00521 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>
00522 Args(const InnerMatcher& matcher) {
00523   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);
00524 }
00525 
00526 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>
00527 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>
00528 Args(const InnerMatcher& matcher) {
00529   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);
00530 }
00531 
00532 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
00533     typename InnerMatcher>
00534 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>
00535 Args(const InnerMatcher& matcher) {
00536   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,
00537       k7>(matcher);
00538 }
00539 
00540 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
00541     typename InnerMatcher>
00542 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>
00543 Args(const InnerMatcher& matcher) {
00544   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,
00545       k8>(matcher);
00546 }
00547 
00548 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
00549     int k9, typename InnerMatcher>
00550 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>
00551 Args(const InnerMatcher& matcher) {
00552   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
00553       k9>(matcher);
00554 }
00555 
00556 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
00557     int k9, int k10, typename InnerMatcher>
00558 inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,
00559     k10>
00560 Args(const InnerMatcher& matcher) {
00561   return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
00562       k9, k10>(matcher);
00563 }
00564 
00565 // ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with
00566 // n elements, where the i-th element in the container must
00567 // match the i-th argument in the list.  Each argument of
00568 // ElementsAre() can be either a value or a matcher.  We support up to
00569 // 10 arguments.
00570 //
00571 // The use of DecayArray in the implementation allows ElementsAre()
00572 // to accept string literals, whose type is const char[N], but we
00573 // want to treat them as const char*.
00574 //
00575 // NOTE: Since ElementsAre() cares about the order of the elements, it
00576 // must not be used with containers whose elements's order is
00577 // undefined (e.g. hash_map).
00578 
00579 inline internal::ElementsAreMatcher<
00580     std::tr1::tuple<> >
00581 ElementsAre() {
00582   typedef std::tr1::tuple<> Args;
00583   return internal::ElementsAreMatcher<Args>(Args());
00584 }
00585 
00586 template <typename T1>
00587 inline internal::ElementsAreMatcher<
00588     std::tr1::tuple<
00589         typename internal::DecayArray<T1>::type> >
00590 ElementsAre(const T1& e1) {
00591   typedef std::tr1::tuple<
00592       typename internal::DecayArray<T1>::type> Args;
00593   return internal::ElementsAreMatcher<Args>(Args(e1));
00594 }
00595 
00596 template <typename T1, typename T2>
00597 inline internal::ElementsAreMatcher<
00598     std::tr1::tuple<
00599         typename internal::DecayArray<T1>::type,
00600         typename internal::DecayArray<T2>::type> >
00601 ElementsAre(const T1& e1, const T2& e2) {
00602   typedef std::tr1::tuple<
00603       typename internal::DecayArray<T1>::type,
00604       typename internal::DecayArray<T2>::type> Args;
00605   return internal::ElementsAreMatcher<Args>(Args(e1, e2));
00606 }
00607 
00608 template <typename T1, typename T2, typename T3>
00609 inline internal::ElementsAreMatcher<
00610     std::tr1::tuple<
00611         typename internal::DecayArray<T1>::type,
00612         typename internal::DecayArray<T2>::type,
00613         typename internal::DecayArray<T3>::type> >
00614 ElementsAre(const T1& e1, const T2& e2, const T3& e3) {
00615   typedef std::tr1::tuple<
00616       typename internal::DecayArray<T1>::type,
00617       typename internal::DecayArray<T2>::type,
00618       typename internal::DecayArray<T3>::type> Args;
00619   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3));
00620 }
00621 
00622 template <typename T1, typename T2, typename T3, typename T4>
00623 inline internal::ElementsAreMatcher<
00624     std::tr1::tuple<
00625         typename internal::DecayArray<T1>::type,
00626         typename internal::DecayArray<T2>::type,
00627         typename internal::DecayArray<T3>::type,
00628         typename internal::DecayArray<T4>::type> >
00629 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {
00630   typedef std::tr1::tuple<
00631       typename internal::DecayArray<T1>::type,
00632       typename internal::DecayArray<T2>::type,
00633       typename internal::DecayArray<T3>::type,
00634       typename internal::DecayArray<T4>::type> Args;
00635   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4));
00636 }
00637 
00638 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00639 inline internal::ElementsAreMatcher<
00640     std::tr1::tuple<
00641         typename internal::DecayArray<T1>::type,
00642         typename internal::DecayArray<T2>::type,
00643         typename internal::DecayArray<T3>::type,
00644         typename internal::DecayArray<T4>::type,
00645         typename internal::DecayArray<T5>::type> >
00646 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00647     const T5& e5) {
00648   typedef std::tr1::tuple<
00649       typename internal::DecayArray<T1>::type,
00650       typename internal::DecayArray<T2>::type,
00651       typename internal::DecayArray<T3>::type,
00652       typename internal::DecayArray<T4>::type,
00653       typename internal::DecayArray<T5>::type> Args;
00654   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));
00655 }
00656 
00657 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00658     typename T6>
00659 inline internal::ElementsAreMatcher<
00660     std::tr1::tuple<
00661         typename internal::DecayArray<T1>::type,
00662         typename internal::DecayArray<T2>::type,
00663         typename internal::DecayArray<T3>::type,
00664         typename internal::DecayArray<T4>::type,
00665         typename internal::DecayArray<T5>::type,
00666         typename internal::DecayArray<T6>::type> >
00667 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00668     const T5& e5, const T6& e6) {
00669   typedef std::tr1::tuple<
00670       typename internal::DecayArray<T1>::type,
00671       typename internal::DecayArray<T2>::type,
00672       typename internal::DecayArray<T3>::type,
00673       typename internal::DecayArray<T4>::type,
00674       typename internal::DecayArray<T5>::type,
00675       typename internal::DecayArray<T6>::type> Args;
00676   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6));
00677 }
00678 
00679 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00680     typename T6, typename T7>
00681 inline internal::ElementsAreMatcher<
00682     std::tr1::tuple<
00683         typename internal::DecayArray<T1>::type,
00684         typename internal::DecayArray<T2>::type,
00685         typename internal::DecayArray<T3>::type,
00686         typename internal::DecayArray<T4>::type,
00687         typename internal::DecayArray<T5>::type,
00688         typename internal::DecayArray<T6>::type,
00689         typename internal::DecayArray<T7>::type> >
00690 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00691     const T5& e5, const T6& e6, const T7& e7) {
00692   typedef std::tr1::tuple<
00693       typename internal::DecayArray<T1>::type,
00694       typename internal::DecayArray<T2>::type,
00695       typename internal::DecayArray<T3>::type,
00696       typename internal::DecayArray<T4>::type,
00697       typename internal::DecayArray<T5>::type,
00698       typename internal::DecayArray<T6>::type,
00699       typename internal::DecayArray<T7>::type> Args;
00700   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7));
00701 }
00702 
00703 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00704     typename T6, typename T7, typename T8>
00705 inline internal::ElementsAreMatcher<
00706     std::tr1::tuple<
00707         typename internal::DecayArray<T1>::type,
00708         typename internal::DecayArray<T2>::type,
00709         typename internal::DecayArray<T3>::type,
00710         typename internal::DecayArray<T4>::type,
00711         typename internal::DecayArray<T5>::type,
00712         typename internal::DecayArray<T6>::type,
00713         typename internal::DecayArray<T7>::type,
00714         typename internal::DecayArray<T8>::type> >
00715 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00716     const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
00717   typedef std::tr1::tuple<
00718       typename internal::DecayArray<T1>::type,
00719       typename internal::DecayArray<T2>::type,
00720       typename internal::DecayArray<T3>::type,
00721       typename internal::DecayArray<T4>::type,
00722       typename internal::DecayArray<T5>::type,
00723       typename internal::DecayArray<T6>::type,
00724       typename internal::DecayArray<T7>::type,
00725       typename internal::DecayArray<T8>::type> Args;
00726   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
00727       e8));
00728 }
00729 
00730 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00731     typename T6, typename T7, typename T8, typename T9>
00732 inline internal::ElementsAreMatcher<
00733     std::tr1::tuple<
00734         typename internal::DecayArray<T1>::type,
00735         typename internal::DecayArray<T2>::type,
00736         typename internal::DecayArray<T3>::type,
00737         typename internal::DecayArray<T4>::type,
00738         typename internal::DecayArray<T5>::type,
00739         typename internal::DecayArray<T6>::type,
00740         typename internal::DecayArray<T7>::type,
00741         typename internal::DecayArray<T8>::type,
00742         typename internal::DecayArray<T9>::type> >
00743 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00744     const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
00745   typedef std::tr1::tuple<
00746       typename internal::DecayArray<T1>::type,
00747       typename internal::DecayArray<T2>::type,
00748       typename internal::DecayArray<T3>::type,
00749       typename internal::DecayArray<T4>::type,
00750       typename internal::DecayArray<T5>::type,
00751       typename internal::DecayArray<T6>::type,
00752       typename internal::DecayArray<T7>::type,
00753       typename internal::DecayArray<T8>::type,
00754       typename internal::DecayArray<T9>::type> Args;
00755   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
00756       e8, e9));
00757 }
00758 
00759 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00760     typename T6, typename T7, typename T8, typename T9, typename T10>
00761 inline internal::ElementsAreMatcher<
00762     std::tr1::tuple<
00763         typename internal::DecayArray<T1>::type,
00764         typename internal::DecayArray<T2>::type,
00765         typename internal::DecayArray<T3>::type,
00766         typename internal::DecayArray<T4>::type,
00767         typename internal::DecayArray<T5>::type,
00768         typename internal::DecayArray<T6>::type,
00769         typename internal::DecayArray<T7>::type,
00770         typename internal::DecayArray<T8>::type,
00771         typename internal::DecayArray<T9>::type,
00772         typename internal::DecayArray<T10>::type> >
00773 ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00774     const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
00775     const T10& e10) {
00776   typedef std::tr1::tuple<
00777       typename internal::DecayArray<T1>::type,
00778       typename internal::DecayArray<T2>::type,
00779       typename internal::DecayArray<T3>::type,
00780       typename internal::DecayArray<T4>::type,
00781       typename internal::DecayArray<T5>::type,
00782       typename internal::DecayArray<T6>::type,
00783       typename internal::DecayArray<T7>::type,
00784       typename internal::DecayArray<T8>::type,
00785       typename internal::DecayArray<T9>::type,
00786       typename internal::DecayArray<T10>::type> Args;
00787   return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
00788       e8, e9, e10));
00789 }
00790 
00791 // UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension
00792 // that matches n elements in any order.  We support up to n=10 arguments.
00793 
00794 inline internal::UnorderedElementsAreMatcher<
00795     std::tr1::tuple<> >
00796 UnorderedElementsAre() {
00797   typedef std::tr1::tuple<> Args;
00798   return internal::UnorderedElementsAreMatcher<Args>(Args());
00799 }
00800 
00801 template <typename T1>
00802 inline internal::UnorderedElementsAreMatcher<
00803     std::tr1::tuple<
00804         typename internal::DecayArray<T1>::type> >
00805 UnorderedElementsAre(const T1& e1) {
00806   typedef std::tr1::tuple<
00807       typename internal::DecayArray<T1>::type> Args;
00808   return internal::UnorderedElementsAreMatcher<Args>(Args(e1));
00809 }
00810 
00811 template <typename T1, typename T2>
00812 inline internal::UnorderedElementsAreMatcher<
00813     std::tr1::tuple<
00814         typename internal::DecayArray<T1>::type,
00815         typename internal::DecayArray<T2>::type> >
00816 UnorderedElementsAre(const T1& e1, const T2& e2) {
00817   typedef std::tr1::tuple<
00818       typename internal::DecayArray<T1>::type,
00819       typename internal::DecayArray<T2>::type> Args;
00820   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2));
00821 }
00822 
00823 template <typename T1, typename T2, typename T3>
00824 inline internal::UnorderedElementsAreMatcher<
00825     std::tr1::tuple<
00826         typename internal::DecayArray<T1>::type,
00827         typename internal::DecayArray<T2>::type,
00828         typename internal::DecayArray<T3>::type> >
00829 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) {
00830   typedef std::tr1::tuple<
00831       typename internal::DecayArray<T1>::type,
00832       typename internal::DecayArray<T2>::type,
00833       typename internal::DecayArray<T3>::type> Args;
00834   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3));
00835 }
00836 
00837 template <typename T1, typename T2, typename T3, typename T4>
00838 inline internal::UnorderedElementsAreMatcher<
00839     std::tr1::tuple<
00840         typename internal::DecayArray<T1>::type,
00841         typename internal::DecayArray<T2>::type,
00842         typename internal::DecayArray<T3>::type,
00843         typename internal::DecayArray<T4>::type> >
00844 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {
00845   typedef std::tr1::tuple<
00846       typename internal::DecayArray<T1>::type,
00847       typename internal::DecayArray<T2>::type,
00848       typename internal::DecayArray<T3>::type,
00849       typename internal::DecayArray<T4>::type> Args;
00850   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4));
00851 }
00852 
00853 template <typename T1, typename T2, typename T3, typename T4, typename T5>
00854 inline internal::UnorderedElementsAreMatcher<
00855     std::tr1::tuple<
00856         typename internal::DecayArray<T1>::type,
00857         typename internal::DecayArray<T2>::type,
00858         typename internal::DecayArray<T3>::type,
00859         typename internal::DecayArray<T4>::type,
00860         typename internal::DecayArray<T5>::type> >
00861 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00862     const T5& e5) {
00863   typedef std::tr1::tuple<
00864       typename internal::DecayArray<T1>::type,
00865       typename internal::DecayArray<T2>::type,
00866       typename internal::DecayArray<T3>::type,
00867       typename internal::DecayArray<T4>::type,
00868       typename internal::DecayArray<T5>::type> Args;
00869   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));
00870 }
00871 
00872 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00873     typename T6>
00874 inline internal::UnorderedElementsAreMatcher<
00875     std::tr1::tuple<
00876         typename internal::DecayArray<T1>::type,
00877         typename internal::DecayArray<T2>::type,
00878         typename internal::DecayArray<T3>::type,
00879         typename internal::DecayArray<T4>::type,
00880         typename internal::DecayArray<T5>::type,
00881         typename internal::DecayArray<T6>::type> >
00882 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00883     const T5& e5, const T6& e6) {
00884   typedef std::tr1::tuple<
00885       typename internal::DecayArray<T1>::type,
00886       typename internal::DecayArray<T2>::type,
00887       typename internal::DecayArray<T3>::type,
00888       typename internal::DecayArray<T4>::type,
00889       typename internal::DecayArray<T5>::type,
00890       typename internal::DecayArray<T6>::type> Args;
00891   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
00892       e6));
00893 }
00894 
00895 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00896     typename T6, typename T7>
00897 inline internal::UnorderedElementsAreMatcher<
00898     std::tr1::tuple<
00899         typename internal::DecayArray<T1>::type,
00900         typename internal::DecayArray<T2>::type,
00901         typename internal::DecayArray<T3>::type,
00902         typename internal::DecayArray<T4>::type,
00903         typename internal::DecayArray<T5>::type,
00904         typename internal::DecayArray<T6>::type,
00905         typename internal::DecayArray<T7>::type> >
00906 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00907     const T5& e5, const T6& e6, const T7& e7) {
00908   typedef std::tr1::tuple<
00909       typename internal::DecayArray<T1>::type,
00910       typename internal::DecayArray<T2>::type,
00911       typename internal::DecayArray<T3>::type,
00912       typename internal::DecayArray<T4>::type,
00913       typename internal::DecayArray<T5>::type,
00914       typename internal::DecayArray<T6>::type,
00915       typename internal::DecayArray<T7>::type> Args;
00916   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
00917       e6, e7));
00918 }
00919 
00920 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00921     typename T6, typename T7, typename T8>
00922 inline internal::UnorderedElementsAreMatcher<
00923     std::tr1::tuple<
00924         typename internal::DecayArray<T1>::type,
00925         typename internal::DecayArray<T2>::type,
00926         typename internal::DecayArray<T3>::type,
00927         typename internal::DecayArray<T4>::type,
00928         typename internal::DecayArray<T5>::type,
00929         typename internal::DecayArray<T6>::type,
00930         typename internal::DecayArray<T7>::type,
00931         typename internal::DecayArray<T8>::type> >
00932 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00933     const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
00934   typedef std::tr1::tuple<
00935       typename internal::DecayArray<T1>::type,
00936       typename internal::DecayArray<T2>::type,
00937       typename internal::DecayArray<T3>::type,
00938       typename internal::DecayArray<T4>::type,
00939       typename internal::DecayArray<T5>::type,
00940       typename internal::DecayArray<T6>::type,
00941       typename internal::DecayArray<T7>::type,
00942       typename internal::DecayArray<T8>::type> Args;
00943   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
00944       e6, e7, e8));
00945 }
00946 
00947 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00948     typename T6, typename T7, typename T8, typename T9>
00949 inline internal::UnorderedElementsAreMatcher<
00950     std::tr1::tuple<
00951         typename internal::DecayArray<T1>::type,
00952         typename internal::DecayArray<T2>::type,
00953         typename internal::DecayArray<T3>::type,
00954         typename internal::DecayArray<T4>::type,
00955         typename internal::DecayArray<T5>::type,
00956         typename internal::DecayArray<T6>::type,
00957         typename internal::DecayArray<T7>::type,
00958         typename internal::DecayArray<T8>::type,
00959         typename internal::DecayArray<T9>::type> >
00960 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00961     const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
00962   typedef std::tr1::tuple<
00963       typename internal::DecayArray<T1>::type,
00964       typename internal::DecayArray<T2>::type,
00965       typename internal::DecayArray<T3>::type,
00966       typename internal::DecayArray<T4>::type,
00967       typename internal::DecayArray<T5>::type,
00968       typename internal::DecayArray<T6>::type,
00969       typename internal::DecayArray<T7>::type,
00970       typename internal::DecayArray<T8>::type,
00971       typename internal::DecayArray<T9>::type> Args;
00972   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
00973       e6, e7, e8, e9));
00974 }
00975 
00976 template <typename T1, typename T2, typename T3, typename T4, typename T5,
00977     typename T6, typename T7, typename T8, typename T9, typename T10>
00978 inline internal::UnorderedElementsAreMatcher<
00979     std::tr1::tuple<
00980         typename internal::DecayArray<T1>::type,
00981         typename internal::DecayArray<T2>::type,
00982         typename internal::DecayArray<T3>::type,
00983         typename internal::DecayArray<T4>::type,
00984         typename internal::DecayArray<T5>::type,
00985         typename internal::DecayArray<T6>::type,
00986         typename internal::DecayArray<T7>::type,
00987         typename internal::DecayArray<T8>::type,
00988         typename internal::DecayArray<T9>::type,
00989         typename internal::DecayArray<T10>::type> >
00990 UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
00991     const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
00992     const T10& e10) {
00993   typedef std::tr1::tuple<
00994       typename internal::DecayArray<T1>::type,
00995       typename internal::DecayArray<T2>::type,
00996       typename internal::DecayArray<T3>::type,
00997       typename internal::DecayArray<T4>::type,
00998       typename internal::DecayArray<T5>::type,
00999       typename internal::DecayArray<T6>::type,
01000       typename internal::DecayArray<T7>::type,
01001       typename internal::DecayArray<T8>::type,
01002       typename internal::DecayArray<T9>::type,
01003       typename internal::DecayArray<T10>::type> Args;
01004   return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
01005       e6, e7, e8, e9, e10));
01006 }
01007 
01008 // AllOf(m1, m2, ..., mk) matches any value that matches all of the given
01009 // sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.
01010 
01011 template <typename M1, typename M2>
01012 inline typename internal::AllOfResult2<M1, M2>::type
01013 AllOf(M1 m1, M2 m2) {
01014   return typename internal::AllOfResult2<M1, M2>::type(
01015       m1,
01016       m2);
01017 }
01018 
01019 template <typename M1, typename M2, typename M3>
01020 inline typename internal::AllOfResult3<M1, M2, M3>::type
01021 AllOf(M1 m1, M2 m2, M3 m3) {
01022   return typename internal::AllOfResult3<M1, M2, M3>::type(
01023       m1,
01024       ::testing::AllOf(m2, m3));
01025 }
01026 
01027 template <typename M1, typename M2, typename M3, typename M4>
01028 inline typename internal::AllOfResult4<M1, M2, M3, M4>::type
01029 AllOf(M1 m1, M2 m2, M3 m3, M4 m4) {
01030   return typename internal::AllOfResult4<M1, M2, M3, M4>::type(
01031       ::testing::AllOf(m1, m2),
01032       ::testing::AllOf(m3, m4));
01033 }
01034 
01035 template <typename M1, typename M2, typename M3, typename M4, typename M5>
01036 inline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type
01037 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
01038   return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(
01039       ::testing::AllOf(m1, m2),
01040       ::testing::AllOf(m3, m4, m5));
01041 }
01042 
01043 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01044     typename M6>
01045 inline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type
01046 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
01047   return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(
01048       ::testing::AllOf(m1, m2, m3),
01049       ::testing::AllOf(m4, m5, m6));
01050 }
01051 
01052 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01053     typename M6, typename M7>
01054 inline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
01055 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
01056   return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
01057       ::testing::AllOf(m1, m2, m3),
01058       ::testing::AllOf(m4, m5, m6, m7));
01059 }
01060 
01061 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01062     typename M6, typename M7, typename M8>
01063 inline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
01064 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
01065   return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
01066       ::testing::AllOf(m1, m2, m3, m4),
01067       ::testing::AllOf(m5, m6, m7, m8));
01068 }
01069 
01070 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01071     typename M6, typename M7, typename M8, typename M9>
01072 inline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
01073 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
01074   return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
01075       M9>::type(
01076       ::testing::AllOf(m1, m2, m3, m4),
01077       ::testing::AllOf(m5, m6, m7, m8, m9));
01078 }
01079 
01080 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01081     typename M6, typename M7, typename M8, typename M9, typename M10>
01082 inline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
01083     M10>::type
01084 AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
01085   return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
01086       M10>::type(
01087       ::testing::AllOf(m1, m2, m3, m4, m5),
01088       ::testing::AllOf(m6, m7, m8, m9, m10));
01089 }
01090 
01091 // AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
01092 // sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.
01093 
01094 template <typename M1, typename M2>
01095 inline typename internal::AnyOfResult2<M1, M2>::type
01096 AnyOf(M1 m1, M2 m2) {
01097   return typename internal::AnyOfResult2<M1, M2>::type(
01098       m1,
01099       m2);
01100 }
01101 
01102 template <typename M1, typename M2, typename M3>
01103 inline typename internal::AnyOfResult3<M1, M2, M3>::type
01104 AnyOf(M1 m1, M2 m2, M3 m3) {
01105   return typename internal::AnyOfResult3<M1, M2, M3>::type(
01106       m1,
01107       ::testing::AnyOf(m2, m3));
01108 }
01109 
01110 template <typename M1, typename M2, typename M3, typename M4>
01111 inline typename internal::AnyOfResult4<M1, M2, M3, M4>::type
01112 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {
01113   return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(
01114       ::testing::AnyOf(m1, m2),
01115       ::testing::AnyOf(m3, m4));
01116 }
01117 
01118 template <typename M1, typename M2, typename M3, typename M4, typename M5>
01119 inline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type
01120 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
01121   return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(
01122       ::testing::AnyOf(m1, m2),
01123       ::testing::AnyOf(m3, m4, m5));
01124 }
01125 
01126 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01127     typename M6>
01128 inline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type
01129 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
01130   return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(
01131       ::testing::AnyOf(m1, m2, m3),
01132       ::testing::AnyOf(m4, m5, m6));
01133 }
01134 
01135 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01136     typename M6, typename M7>
01137 inline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
01138 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
01139   return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
01140       ::testing::AnyOf(m1, m2, m3),
01141       ::testing::AnyOf(m4, m5, m6, m7));
01142 }
01143 
01144 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01145     typename M6, typename M7, typename M8>
01146 inline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
01147 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
01148   return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
01149       ::testing::AnyOf(m1, m2, m3, m4),
01150       ::testing::AnyOf(m5, m6, m7, m8));
01151 }
01152 
01153 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01154     typename M6, typename M7, typename M8, typename M9>
01155 inline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
01156 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
01157   return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
01158       M9>::type(
01159       ::testing::AnyOf(m1, m2, m3, m4),
01160       ::testing::AnyOf(m5, m6, m7, m8, m9));
01161 }
01162 
01163 template <typename M1, typename M2, typename M3, typename M4, typename M5,
01164     typename M6, typename M7, typename M8, typename M9, typename M10>
01165 inline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
01166     M10>::type
01167 AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
01168   return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
01169       M10>::type(
01170       ::testing::AnyOf(m1, m2, m3, m4, m5),
01171       ::testing::AnyOf(m6, m7, m8, m9, m10));
01172 }
01173 
01174 }  // namespace testing
01175 
01176 
01177 // The MATCHER* family of macros can be used in a namespace scope to
01178 // define custom matchers easily.
01179 //
01180 // Basic Usage
01181 // ===========
01182 //
01183 // The syntax
01184 //
01185 //   MATCHER(name, description_string) { statements; }
01186 //
01187 // defines a matcher with the given name that executes the statements,
01188 // which must return a bool to indicate if the match succeeds.  Inside
01189 // the statements, you can refer to the value being matched by 'arg',
01190 // and refer to its type by 'arg_type'.
01191 //
01192 // The description string documents what the matcher does, and is used
01193 // to generate the failure message when the match fails.  Since a
01194 // MATCHER() is usually defined in a header file shared by multiple
01195 // C++ source files, we require the description to be a C-string
01196 // literal to avoid possible side effects.  It can be empty, in which
01197 // case we'll use the sequence of words in the matcher name as the
01198 // description.
01199 //
01200 // For example:
01201 //
01202 //   MATCHER(IsEven, "") { return (arg % 2) == 0; }
01203 //
01204 // allows you to write
01205 //
01206 //   // Expects mock_foo.Bar(n) to be called where n is even.
01207 //   EXPECT_CALL(mock_foo, Bar(IsEven()));
01208 //
01209 // or,
01210 //
01211 //   // Verifies that the value of some_expression is even.
01212 //   EXPECT_THAT(some_expression, IsEven());
01213 //
01214 // If the above assertion fails, it will print something like:
01215 //
01216 //   Value of: some_expression
01217 //   Expected: is even
01218 //     Actual: 7
01219 //
01220 // where the description "is even" is automatically calculated from the
01221 // matcher name IsEven.
01222 //
01223 // Argument Type
01224 // =============
01225 //
01226 // Note that the type of the value being matched (arg_type) is
01227 // determined by the context in which you use the matcher and is
01228 // supplied to you by the compiler, so you don't need to worry about
01229 // declaring it (nor can you).  This allows the matcher to be
01230 // polymorphic.  For example, IsEven() can be used to match any type
01231 // where the value of "(arg % 2) == 0" can be implicitly converted to
01232 // a bool.  In the "Bar(IsEven())" example above, if method Bar()
01233 // takes an int, 'arg_type' will be int; if it takes an unsigned long,
01234 // 'arg_type' will be unsigned long; and so on.
01235 //
01236 // Parameterizing Matchers
01237 // =======================
01238 //
01239 // Sometimes you'll want to parameterize the matcher.  For that you
01240 // can use another macro:
01241 //
01242 //   MATCHER_P(name, param_name, description_string) { statements; }
01243 //
01244 // For example:
01245 //
01246 //   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
01247 //
01248 // will allow you to write:
01249 //
01250 //   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
01251 //
01252 // which may lead to this message (assuming n is 10):
01253 //
01254 //   Value of: Blah("a")
01255 //   Expected: has absolute value 10
01256 //     Actual: -9
01257 //
01258 // Note that both the matcher description and its parameter are
01259 // printed, making the message human-friendly.
01260 //
01261 // In the matcher definition body, you can write 'foo_type' to
01262 // reference the type of a parameter named 'foo'.  For example, in the
01263 // body of MATCHER_P(HasAbsoluteValue, value) above, you can write
01264 // 'value_type' to refer to the type of 'value'.
01265 //
01266 // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to
01267 // support multi-parameter matchers.
01268 //
01269 // Describing Parameterized Matchers
01270 // =================================
01271 //
01272 // The last argument to MATCHER*() is a string-typed expression.  The
01273 // expression can reference all of the matcher's parameters and a
01274 // special bool-typed variable named 'negation'.  When 'negation' is
01275 // false, the expression should evaluate to the matcher's description;
01276 // otherwise it should evaluate to the description of the negation of
01277 // the matcher.  For example,
01278 //
01279 //   using testing::PrintToString;
01280 //
01281 //   MATCHER_P2(InClosedRange, low, hi,
01282 //       string(negation ? "is not" : "is") + " in range [" +
01283 //       PrintToString(low) + ", " + PrintToString(hi) + "]") {
01284 //     return low <= arg && arg <= hi;
01285 //   }
01286 //   ...
01287 //   EXPECT_THAT(3, InClosedRange(4, 6));
01288 //   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
01289 //
01290 // would generate two failures that contain the text:
01291 //
01292 //   Expected: is in range [4, 6]
01293 //   ...
01294 //   Expected: is not in range [2, 4]
01295 //
01296 // If you specify "" as the description, the failure message will
01297 // contain the sequence of words in the matcher name followed by the
01298 // parameter values printed as a tuple.  For example,
01299 //
01300 //   MATCHER_P2(InClosedRange, low, hi, "") { ... }
01301 //   ...
01302 //   EXPECT_THAT(3, InClosedRange(4, 6));
01303 //   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
01304 //
01305 // would generate two failures that contain the text:
01306 //
01307 //   Expected: in closed range (4, 6)
01308 //   ...
01309 //   Expected: not (in closed range (2, 4))
01310 //
01311 // Types of Matcher Parameters
01312 // ===========================
01313 //
01314 // For the purpose of typing, you can view
01315 //
01316 //   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
01317 //
01318 // as shorthand for
01319 //
01320 //   template <typename p1_type, ..., typename pk_type>
01321 //   FooMatcherPk<p1_type, ..., pk_type>
01322 //   Foo(p1_type p1, ..., pk_type pk) { ... }
01323 //
01324 // When you write Foo(v1, ..., vk), the compiler infers the types of
01325 // the parameters v1, ..., and vk for you.  If you are not happy with
01326 // the result of the type inference, you can specify the types by
01327 // explicitly instantiating the template, as in Foo<long, bool>(5,
01328 // false).  As said earlier, you don't get to (or need to) specify
01329 // 'arg_type' as that's determined by the context in which the matcher
01330 // is used.  You can assign the result of expression Foo(p1, ..., pk)
01331 // to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
01332 // can be useful when composing matchers.
01333 //
01334 // While you can instantiate a matcher template with reference types,
01335 // passing the parameters by pointer usually makes your code more
01336 // readable.  If, however, you still want to pass a parameter by
01337 // reference, be aware that in the failure message generated by the
01338 // matcher you will see the value of the referenced object but not its
01339 // address.
01340 //
01341 // Explaining Match Results
01342 // ========================
01343 //
01344 // Sometimes the matcher description alone isn't enough to explain why
01345 // the match has failed or succeeded.  For example, when expecting a
01346 // long string, it can be very helpful to also print the diff between
01347 // the expected string and the actual one.  To achieve that, you can
01348 // optionally stream additional information to a special variable
01349 // named result_listener, whose type is a pointer to class
01350 // MatchResultListener:
01351 //
01352 //   MATCHER_P(EqualsLongString, str, "") {
01353 //     if (arg == str) return true;
01354 //
01355 //     *result_listener << "the difference: "
01357 //     return false;
01358 //   }
01359 //
01360 // Overloading Matchers
01361 // ====================
01362 //
01363 // You can overload matchers with different numbers of parameters:
01364 //
01365 //   MATCHER_P(Blah, a, description_string1) { ... }
01366 //   MATCHER_P2(Blah, a, b, description_string2) { ... }
01367 //
01368 // Caveats
01369 // =======
01370 //
01371 // When defining a new matcher, you should also consider implementing
01372 // MatcherInterface or using MakePolymorphicMatcher().  These
01373 // approaches require more work than the MATCHER* macros, but also
01374 // give you more control on the types of the value being matched and
01375 // the matcher parameters, which may leads to better compiler error
01376 // messages when the matcher is used wrong.  They also allow
01377 // overloading matchers based on parameter types (as opposed to just
01378 // based on the number of parameters).
01379 //
01380 // MATCHER*() can only be used in a namespace scope.  The reason is
01381 // that C++ doesn't yet allow function-local types to be used to
01382 // instantiate templates.  The up-coming C++0x standard will fix this.
01383 // Once that's done, we'll consider supporting using MATCHER*() inside
01384 // a function.
01385 //
01386 // More Information
01387 // ================
01388 //
01389 // To learn more about using these macros, please search for 'MATCHER'
01390 // on http://code.google.com/p/googlemock/wiki/CookBook.
01391 
01392 #define MATCHER(name, description)\
01393   class name##Matcher {\
01394    public:\
01395     template <typename arg_type>\
01396     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01397      public:\
01398       gmock_Impl()\
01399            {}\
01400       virtual bool MatchAndExplain(\
01401           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01402       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01403         *gmock_os << FormatDescription(false);\
01404       }\
01405       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01406         *gmock_os << FormatDescription(true);\
01407       }\
01408      private:\
01409       ::testing::internal::string FormatDescription(bool negation) const {\
01410         const ::testing::internal::string gmock_description = (description);\
01411         if (!gmock_description.empty())\
01412           return gmock_description;\
01413         return ::testing::internal::FormatMatcherDescription(\
01414             negation, #name, \
01415             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01416                 ::std::tr1::tuple<>()));\
01417       }\
01418       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01419     };\
01420     template <typename arg_type>\
01421     operator ::testing::Matcher<arg_type>() const {\
01422       return ::testing::Matcher<arg_type>(\
01423           new gmock_Impl<arg_type>());\
01424     }\
01425     name##Matcher() {\
01426     }\
01427    private:\
01428     GTEST_DISALLOW_ASSIGN_(name##Matcher);\
01429   };\
01430   inline name##Matcher name() {\
01431     return name##Matcher();\
01432   }\
01433   template <typename arg_type>\
01434   bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
01435       arg_type arg, \
01436       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01437           const
01438 
01439 #define MATCHER_P(name, p0, description)\
01440   template <typename p0##_type>\
01441   class name##MatcherP {\
01442    public:\
01443     template <typename arg_type>\
01444     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01445      public:\
01446       explicit gmock_Impl(p0##_type gmock_p0)\
01447            : p0(gmock_p0) {}\
01448       virtual bool MatchAndExplain(\
01449           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01450       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01451         *gmock_os << FormatDescription(false);\
01452       }\
01453       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01454         *gmock_os << FormatDescription(true);\
01455       }\
01456       p0##_type p0;\
01457      private:\
01458       ::testing::internal::string FormatDescription(bool negation) const {\
01459         const ::testing::internal::string gmock_description = (description);\
01460         if (!gmock_description.empty())\
01461           return gmock_description;\
01462         return ::testing::internal::FormatMatcherDescription(\
01463             negation, #name, \
01464             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01465                 ::std::tr1::tuple<p0##_type>(p0)));\
01466       }\
01467       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01468     };\
01469     template <typename arg_type>\
01470     operator ::testing::Matcher<arg_type>() const {\
01471       return ::testing::Matcher<arg_type>(\
01472           new gmock_Impl<arg_type>(p0));\
01473     }\
01474     name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\
01475     }\
01476     p0##_type p0;\
01477    private:\
01478     GTEST_DISALLOW_ASSIGN_(name##MatcherP);\
01479   };\
01480   template <typename p0##_type>\
01481   inline name##MatcherP<p0##_type> name(p0##_type p0) {\
01482     return name##MatcherP<p0##_type>(p0);\
01483   }\
01484   template <typename p0##_type>\
01485   template <typename arg_type>\
01486   bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01487       arg_type arg, \
01488       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01489           const
01490 
01491 #define MATCHER_P2(name, p0, p1, description)\
01492   template <typename p0##_type, typename p1##_type>\
01493   class name##MatcherP2 {\
01494    public:\
01495     template <typename arg_type>\
01496     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01497      public:\
01498       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
01499            : p0(gmock_p0), p1(gmock_p1) {}\
01500       virtual bool MatchAndExplain(\
01501           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01502       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01503         *gmock_os << FormatDescription(false);\
01504       }\
01505       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01506         *gmock_os << FormatDescription(true);\
01507       }\
01508       p0##_type p0;\
01509       p1##_type p1;\
01510      private:\
01511       ::testing::internal::string FormatDescription(bool negation) const {\
01512         const ::testing::internal::string gmock_description = (description);\
01513         if (!gmock_description.empty())\
01514           return gmock_description;\
01515         return ::testing::internal::FormatMatcherDescription(\
01516             negation, #name, \
01517             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01518                 ::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\
01519       }\
01520       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01521     };\
01522     template <typename arg_type>\
01523     operator ::testing::Matcher<arg_type>() const {\
01524       return ::testing::Matcher<arg_type>(\
01525           new gmock_Impl<arg_type>(p0, p1));\
01526     }\
01527     name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
01528         p1(gmock_p1) {\
01529     }\
01530     p0##_type p0;\
01531     p1##_type p1;\
01532    private:\
01533     GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\
01534   };\
01535   template <typename p0##_type, typename p1##_type>\
01536   inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \
01537       p1##_type p1) {\
01538     return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\
01539   }\
01540   template <typename p0##_type, typename p1##_type>\
01541   template <typename arg_type>\
01542   bool name##MatcherP2<p0##_type, \
01543       p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01544       arg_type arg, \
01545       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01546           const
01547 
01548 #define MATCHER_P3(name, p0, p1, p2, description)\
01549   template <typename p0##_type, typename p1##_type, typename p2##_type>\
01550   class name##MatcherP3 {\
01551    public:\
01552     template <typename arg_type>\
01553     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01554      public:\
01555       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
01556            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
01557       virtual bool MatchAndExplain(\
01558           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01559       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01560         *gmock_os << FormatDescription(false);\
01561       }\
01562       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01563         *gmock_os << FormatDescription(true);\
01564       }\
01565       p0##_type p0;\
01566       p1##_type p1;\
01567       p2##_type p2;\
01568      private:\
01569       ::testing::internal::string FormatDescription(bool negation) const {\
01570         const ::testing::internal::string gmock_description = (description);\
01571         if (!gmock_description.empty())\
01572           return gmock_description;\
01573         return ::testing::internal::FormatMatcherDescription(\
01574             negation, #name, \
01575             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01576                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \
01577                     p2)));\
01578       }\
01579       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01580     };\
01581     template <typename arg_type>\
01582     operator ::testing::Matcher<arg_type>() const {\
01583       return ::testing::Matcher<arg_type>(\
01584           new gmock_Impl<arg_type>(p0, p1, p2));\
01585     }\
01586     name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \
01587         p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\
01588     }\
01589     p0##_type p0;\
01590     p1##_type p1;\
01591     p2##_type p2;\
01592    private:\
01593     GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\
01594   };\
01595   template <typename p0##_type, typename p1##_type, typename p2##_type>\
01596   inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
01597       p1##_type p1, p2##_type p2) {\
01598     return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
01599   }\
01600   template <typename p0##_type, typename p1##_type, typename p2##_type>\
01601   template <typename arg_type>\
01602   bool name##MatcherP3<p0##_type, p1##_type, \
01603       p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01604       arg_type arg, \
01605       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01606           const
01607 
01608 #define MATCHER_P4(name, p0, p1, p2, p3, description)\
01609   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01610       typename p3##_type>\
01611   class name##MatcherP4 {\
01612    public:\
01613     template <typename arg_type>\
01614     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01615      public:\
01616       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
01617           p3##_type gmock_p3)\
01618            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\
01619       virtual bool MatchAndExplain(\
01620           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01621       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01622         *gmock_os << FormatDescription(false);\
01623       }\
01624       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01625         *gmock_os << FormatDescription(true);\
01626       }\
01627       p0##_type p0;\
01628       p1##_type p1;\
01629       p2##_type p2;\
01630       p3##_type p3;\
01631      private:\
01632       ::testing::internal::string FormatDescription(bool negation) const {\
01633         const ::testing::internal::string gmock_description = (description);\
01634         if (!gmock_description.empty())\
01635           return gmock_description;\
01636         return ::testing::internal::FormatMatcherDescription(\
01637             negation, #name, \
01638             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01639                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \
01640                     p3##_type>(p0, p1, p2, p3)));\
01641       }\
01642       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01643     };\
01644     template <typename arg_type>\
01645     operator ::testing::Matcher<arg_type>() const {\
01646       return ::testing::Matcher<arg_type>(\
01647           new gmock_Impl<arg_type>(p0, p1, p2, p3));\
01648     }\
01649     name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \
01650         p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
01651         p2(gmock_p2), p3(gmock_p3) {\
01652     }\
01653     p0##_type p0;\
01654     p1##_type p1;\
01655     p2##_type p2;\
01656     p3##_type p3;\
01657    private:\
01658     GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\
01659   };\
01660   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01661       typename p3##_type>\
01662   inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \
01663       p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
01664       p3##_type p3) {\
01665     return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
01666         p1, p2, p3);\
01667   }\
01668   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01669       typename p3##_type>\
01670   template <typename arg_type>\
01671   bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
01672       p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01673       arg_type arg, \
01674       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01675           const
01676 
01677 #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\
01678   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01679       typename p3##_type, typename p4##_type>\
01680   class name##MatcherP5 {\
01681    public:\
01682     template <typename arg_type>\
01683     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01684      public:\
01685       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
01686           p3##_type gmock_p3, p4##_type gmock_p4)\
01687            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
01688                p4(gmock_p4) {}\
01689       virtual bool MatchAndExplain(\
01690           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01691       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01692         *gmock_os << FormatDescription(false);\
01693       }\
01694       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01695         *gmock_os << FormatDescription(true);\
01696       }\
01697       p0##_type p0;\
01698       p1##_type p1;\
01699       p2##_type p2;\
01700       p3##_type p3;\
01701       p4##_type p4;\
01702      private:\
01703       ::testing::internal::string FormatDescription(bool negation) const {\
01704         const ::testing::internal::string gmock_description = (description);\
01705         if (!gmock_description.empty())\
01706           return gmock_description;\
01707         return ::testing::internal::FormatMatcherDescription(\
01708             negation, #name, \
01709             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01710                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
01711                     p4##_type>(p0, p1, p2, p3, p4)));\
01712       }\
01713       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01714     };\
01715     template <typename arg_type>\
01716     operator ::testing::Matcher<arg_type>() const {\
01717       return ::testing::Matcher<arg_type>(\
01718           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\
01719     }\
01720     name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \
01721         p2##_type gmock_p2, p3##_type gmock_p3, \
01722         p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
01723         p3(gmock_p3), p4(gmock_p4) {\
01724     }\
01725     p0##_type p0;\
01726     p1##_type p1;\
01727     p2##_type p2;\
01728     p3##_type p3;\
01729     p4##_type p4;\
01730    private:\
01731     GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\
01732   };\
01733   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01734       typename p3##_type, typename p4##_type>\
01735   inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
01736       p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
01737       p4##_type p4) {\
01738     return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
01739         p4##_type>(p0, p1, p2, p3, p4);\
01740   }\
01741   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01742       typename p3##_type, typename p4##_type>\
01743   template <typename arg_type>\
01744   bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
01745       p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01746       arg_type arg, \
01747       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01748           const
01749 
01750 #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\
01751   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01752       typename p3##_type, typename p4##_type, typename p5##_type>\
01753   class name##MatcherP6 {\
01754    public:\
01755     template <typename arg_type>\
01756     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01757      public:\
01758       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
01759           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\
01760            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
01761                p4(gmock_p4), p5(gmock_p5) {}\
01762       virtual bool MatchAndExplain(\
01763           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01764       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01765         *gmock_os << FormatDescription(false);\
01766       }\
01767       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01768         *gmock_os << FormatDescription(true);\
01769       }\
01770       p0##_type p0;\
01771       p1##_type p1;\
01772       p2##_type p2;\
01773       p3##_type p3;\
01774       p4##_type p4;\
01775       p5##_type p5;\
01776      private:\
01777       ::testing::internal::string FormatDescription(bool negation) const {\
01778         const ::testing::internal::string gmock_description = (description);\
01779         if (!gmock_description.empty())\
01780           return gmock_description;\
01781         return ::testing::internal::FormatMatcherDescription(\
01782             negation, #name, \
01783             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01784                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
01785                     p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
01786       }\
01787       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01788     };\
01789     template <typename arg_type>\
01790     operator ::testing::Matcher<arg_type>() const {\
01791       return ::testing::Matcher<arg_type>(\
01792           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\
01793     }\
01794     name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \
01795         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
01796         p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
01797         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\
01798     }\
01799     p0##_type p0;\
01800     p1##_type p1;\
01801     p2##_type p2;\
01802     p3##_type p3;\
01803     p4##_type p4;\
01804     p5##_type p5;\
01805    private:\
01806     GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\
01807   };\
01808   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01809       typename p3##_type, typename p4##_type, typename p5##_type>\
01810   inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
01811       p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
01812       p3##_type p3, p4##_type p4, p5##_type p5) {\
01813     return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
01814         p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
01815   }\
01816   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01817       typename p3##_type, typename p4##_type, typename p5##_type>\
01818   template <typename arg_type>\
01819   bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
01820       p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01821       arg_type arg, \
01822       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01823           const
01824 
01825 #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\
01826   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01827       typename p3##_type, typename p4##_type, typename p5##_type, \
01828       typename p6##_type>\
01829   class name##MatcherP7 {\
01830    public:\
01831     template <typename arg_type>\
01832     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01833      public:\
01834       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
01835           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
01836           p6##_type gmock_p6)\
01837            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
01838                p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
01839       virtual bool MatchAndExplain(\
01840           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01841       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01842         *gmock_os << FormatDescription(false);\
01843       }\
01844       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01845         *gmock_os << FormatDescription(true);\
01846       }\
01847       p0##_type p0;\
01848       p1##_type p1;\
01849       p2##_type p2;\
01850       p3##_type p3;\
01851       p4##_type p4;\
01852       p5##_type p5;\
01853       p6##_type p6;\
01854      private:\
01855       ::testing::internal::string FormatDescription(bool negation) const {\
01856         const ::testing::internal::string gmock_description = (description);\
01857         if (!gmock_description.empty())\
01858           return gmock_description;\
01859         return ::testing::internal::FormatMatcherDescription(\
01860             negation, #name, \
01861             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01862                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
01863                     p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
01864                     p6)));\
01865       }\
01866       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01867     };\
01868     template <typename arg_type>\
01869     operator ::testing::Matcher<arg_type>() const {\
01870       return ::testing::Matcher<arg_type>(\
01871           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\
01872     }\
01873     name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \
01874         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
01875         p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
01876         p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
01877         p6(gmock_p6) {\
01878     }\
01879     p0##_type p0;\
01880     p1##_type p1;\
01881     p2##_type p2;\
01882     p3##_type p3;\
01883     p4##_type p4;\
01884     p5##_type p5;\
01885     p6##_type p6;\
01886    private:\
01887     GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\
01888   };\
01889   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01890       typename p3##_type, typename p4##_type, typename p5##_type, \
01891       typename p6##_type>\
01892   inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
01893       p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
01894       p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
01895       p6##_type p6) {\
01896     return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
01897         p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
01898   }\
01899   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01900       typename p3##_type, typename p4##_type, typename p5##_type, \
01901       typename p6##_type>\
01902   template <typename arg_type>\
01903   bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
01904       p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01905       arg_type arg, \
01906       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01907           const
01908 
01909 #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\
01910   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01911       typename p3##_type, typename p4##_type, typename p5##_type, \
01912       typename p6##_type, typename p7##_type>\
01913   class name##MatcherP8 {\
01914    public:\
01915     template <typename arg_type>\
01916     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
01917      public:\
01918       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
01919           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
01920           p6##_type gmock_p6, p7##_type gmock_p7)\
01921            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
01922                p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
01923       virtual bool MatchAndExplain(\
01924           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
01925       virtual void DescribeTo(::std::ostream* gmock_os) const {\
01926         *gmock_os << FormatDescription(false);\
01927       }\
01928       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
01929         *gmock_os << FormatDescription(true);\
01930       }\
01931       p0##_type p0;\
01932       p1##_type p1;\
01933       p2##_type p2;\
01934       p3##_type p3;\
01935       p4##_type p4;\
01936       p5##_type p5;\
01937       p6##_type p6;\
01938       p7##_type p7;\
01939      private:\
01940       ::testing::internal::string FormatDescription(bool negation) const {\
01941         const ::testing::internal::string gmock_description = (description);\
01942         if (!gmock_description.empty())\
01943           return gmock_description;\
01944         return ::testing::internal::FormatMatcherDescription(\
01945             negation, #name, \
01946             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
01947                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
01948                     p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
01949                     p3, p4, p5, p6, p7)));\
01950       }\
01951       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
01952     };\
01953     template <typename arg_type>\
01954     operator ::testing::Matcher<arg_type>() const {\
01955       return ::testing::Matcher<arg_type>(\
01956           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\
01957     }\
01958     name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \
01959         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
01960         p5##_type gmock_p5, p6##_type gmock_p6, \
01961         p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
01962         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
01963         p7(gmock_p7) {\
01964     }\
01965     p0##_type p0;\
01966     p1##_type p1;\
01967     p2##_type p2;\
01968     p3##_type p3;\
01969     p4##_type p4;\
01970     p5##_type p5;\
01971     p6##_type p6;\
01972     p7##_type p7;\
01973    private:\
01974     GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\
01975   };\
01976   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01977       typename p3##_type, typename p4##_type, typename p5##_type, \
01978       typename p6##_type, typename p7##_type>\
01979   inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
01980       p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
01981       p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
01982       p6##_type p6, p7##_type p7) {\
01983     return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
01984         p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
01985         p6, p7);\
01986   }\
01987   template <typename p0##_type, typename p1##_type, typename p2##_type, \
01988       typename p3##_type, typename p4##_type, typename p5##_type, \
01989       typename p6##_type, typename p7##_type>\
01990   template <typename arg_type>\
01991   bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
01992       p5##_type, p6##_type, \
01993       p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
01994       arg_type arg, \
01995       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
01996           const
01997 
01998 #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\
01999   template <typename p0##_type, typename p1##_type, typename p2##_type, \
02000       typename p3##_type, typename p4##_type, typename p5##_type, \
02001       typename p6##_type, typename p7##_type, typename p8##_type>\
02002   class name##MatcherP9 {\
02003    public:\
02004     template <typename arg_type>\
02005     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
02006      public:\
02007       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
02008           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
02009           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\
02010            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
02011                p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
02012                p8(gmock_p8) {}\
02013       virtual bool MatchAndExplain(\
02014           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
02015       virtual void DescribeTo(::std::ostream* gmock_os) const {\
02016         *gmock_os << FormatDescription(false);\
02017       }\
02018       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
02019         *gmock_os << FormatDescription(true);\
02020       }\
02021       p0##_type p0;\
02022       p1##_type p1;\
02023       p2##_type p2;\
02024       p3##_type p3;\
02025       p4##_type p4;\
02026       p5##_type p5;\
02027       p6##_type p6;\
02028       p7##_type p7;\
02029       p8##_type p8;\
02030      private:\
02031       ::testing::internal::string FormatDescription(bool negation) const {\
02032         const ::testing::internal::string gmock_description = (description);\
02033         if (!gmock_description.empty())\
02034           return gmock_description;\
02035         return ::testing::internal::FormatMatcherDescription(\
02036             negation, #name, \
02037             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
02038                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
02039                     p4##_type, p5##_type, p6##_type, p7##_type, \
02040                     p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\
02041       }\
02042       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
02043     };\
02044     template <typename arg_type>\
02045     operator ::testing::Matcher<arg_type>() const {\
02046       return ::testing::Matcher<arg_type>(\
02047           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\
02048     }\
02049     name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \
02050         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
02051         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
02052         p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
02053         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
02054         p8(gmock_p8) {\
02055     }\
02056     p0##_type p0;\
02057     p1##_type p1;\
02058     p2##_type p2;\
02059     p3##_type p3;\
02060     p4##_type p4;\
02061     p5##_type p5;\
02062     p6##_type p6;\
02063     p7##_type p7;\
02064     p8##_type p8;\
02065    private:\
02066     GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\
02067   };\
02068   template <typename p0##_type, typename p1##_type, typename p2##_type, \
02069       typename p3##_type, typename p4##_type, typename p5##_type, \
02070       typename p6##_type, typename p7##_type, typename p8##_type>\
02071   inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
02072       p4##_type, p5##_type, p6##_type, p7##_type, \
02073       p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
02074       p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
02075       p8##_type p8) {\
02076     return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
02077         p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
02078         p3, p4, p5, p6, p7, p8);\
02079   }\
02080   template <typename p0##_type, typename p1##_type, typename p2##_type, \
02081       typename p3##_type, typename p4##_type, typename p5##_type, \
02082       typename p6##_type, typename p7##_type, typename p8##_type>\
02083   template <typename arg_type>\
02084   bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
02085       p5##_type, p6##_type, p7##_type, \
02086       p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
02087       arg_type arg, \
02088       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
02089           const
02090 
02091 #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\
02092   template <typename p0##_type, typename p1##_type, typename p2##_type, \
02093       typename p3##_type, typename p4##_type, typename p5##_type, \
02094       typename p6##_type, typename p7##_type, typename p8##_type, \
02095       typename p9##_type>\
02096   class name##MatcherP10 {\
02097    public:\
02098     template <typename arg_type>\
02099     class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
02100      public:\
02101       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
02102           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
02103           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
02104           p9##_type gmock_p9)\
02105            : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
02106                p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
02107                p8(gmock_p8), p9(gmock_p9) {}\
02108       virtual bool MatchAndExplain(\
02109           arg_type arg, ::testing::MatchResultListener* result_listener) const;\
02110       virtual void DescribeTo(::std::ostream* gmock_os) const {\
02111         *gmock_os << FormatDescription(false);\
02112       }\
02113       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
02114         *gmock_os << FormatDescription(true);\
02115       }\
02116       p0##_type p0;\
02117       p1##_type p1;\
02118       p2##_type p2;\
02119       p3##_type p3;\
02120       p4##_type p4;\
02121       p5##_type p5;\
02122       p6##_type p6;\
02123       p7##_type p7;\
02124       p8##_type p8;\
02125       p9##_type p9;\
02126      private:\
02127       ::testing::internal::string FormatDescription(bool negation) const {\
02128         const ::testing::internal::string gmock_description = (description);\
02129         if (!gmock_description.empty())\
02130           return gmock_description;\
02131         return ::testing::internal::FormatMatcherDescription(\
02132             negation, #name, \
02133             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
02134                 ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
02135                     p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
02136                     p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\
02137       }\
02138       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
02139     };\
02140     template <typename arg_type>\
02141     operator ::testing::Matcher<arg_type>() const {\
02142       return ::testing::Matcher<arg_type>(\
02143           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\
02144     }\
02145     name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \
02146         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
02147         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
02148         p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
02149         p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
02150         p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\
02151     }\
02152     p0##_type p0;\
02153     p1##_type p1;\
02154     p2##_type p2;\
02155     p3##_type p3;\
02156     p4##_type p4;\
02157     p5##_type p5;\
02158     p6##_type p6;\
02159     p7##_type p7;\
02160     p8##_type p8;\
02161     p9##_type p9;\
02162    private:\
02163     GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\
02164   };\
02165   template <typename p0##_type, typename p1##_type, typename p2##_type, \
02166       typename p3##_type, typename p4##_type, typename p5##_type, \
02167       typename p6##_type, typename p7##_type, typename p8##_type, \
02168       typename p9##_type>\
02169   inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
02170       p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
02171       p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
02172       p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
02173       p9##_type p9) {\
02174     return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
02175         p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
02176         p1, p2, p3, p4, p5, p6, p7, p8, p9);\
02177   }\
02178   template <typename p0##_type, typename p1##_type, typename p2##_type, \
02179       typename p3##_type, typename p4##_type, typename p5##_type, \
02180       typename p6##_type, typename p7##_type, typename p8##_type, \
02181       typename p9##_type>\
02182   template <typename arg_type>\
02183   bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
02184       p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
02185       p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
02186       arg_type arg, \
02187       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
02188           const
02189 
02190 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_


ros_opcua_impl_freeopcua
Author(s): Denis Štogl
autogenerated on Sat Jun 8 2019 18:24:41