?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

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