Home | History | Annotate | Download | only in gmock
      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 <utility>
     47 #include <vector>
     48 #include "gmock/gmock-matchers.h"
     49 
     50 // The MATCHER* family of macros can be used in a namespace scope to
     51 // define custom matchers easily.
     52 //
     53 // Basic Usage
     54 // ===========
     55 //
     56 // The syntax
     57 //
     58 //   MATCHER(name, description_string) { statements; }
     59 //
     60 // defines a matcher with the given name that executes the statements,
     61 // which must return a bool to indicate if the match succeeds.  Inside
     62 // the statements, you can refer to the value being matched by 'arg',
     63 // and refer to its type by 'arg_type'.
     64 //
     65 // The description string documents what the matcher does, and is used
     66 // to generate the failure message when the match fails.  Since a
     67 // MATCHER() is usually defined in a header file shared by multiple
     68 // C++ source files, we require the description to be a C-string
     69 // literal to avoid possible side effects.  It can be empty, in which
     70 // case we'll use the sequence of words in the matcher name as the
     71 // description.
     72 //
     73 // For example:
     74 //
     75 //   MATCHER(IsEven, "") { return (arg % 2) == 0; }
     76 //
     77 // allows you to write
     78 //
     79 //   // Expects mock_foo.Bar(n) to be called where n is even.
     80 //   EXPECT_CALL(mock_foo, Bar(IsEven()));
     81 //
     82 // or,
     83 //
     84 //   // Verifies that the value of some_expression is even.
     85 //   EXPECT_THAT(some_expression, IsEven());
     86 //
     87 // If the above assertion fails, it will print something like:
     88 //
     89 //   Value of: some_expression
     90 //   Expected: is even
     91 //     Actual: 7
     92 //
     93 // where the description "is even" is automatically calculated from the
     94 // matcher name IsEven.
     95 //
     96 // Argument Type
     97 // =============
     98 //
     99 // Note that the type of the value being matched (arg_type) is
    100 // determined by the context in which you use the matcher and is
    101 // supplied to you by the compiler, so you don't need to worry about
    102 // declaring it (nor can you).  This allows the matcher to be
    103 // polymorphic.  For example, IsEven() can be used to match any type
    104 // where the value of "(arg % 2) == 0" can be implicitly converted to
    105 // a bool.  In the "Bar(IsEven())" example above, if method Bar()
    106 // takes an int, 'arg_type' will be int; if it takes an unsigned long,
    107 // 'arg_type' will be unsigned long; and so on.
    108 //
    109 // Parameterizing Matchers
    110 // =======================
    111 //
    112 // Sometimes you'll want to parameterize the matcher.  For that you
    113 // can use another macro:
    114 //
    115 //   MATCHER_P(name, param_name, description_string) { statements; }
    116 //
    117 // For example:
    118 //
    119 //   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
    120 //
    121 // will allow you to write:
    122 //
    123 //   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
    124 //
    125 // which may lead to this message (assuming n is 10):
    126 //
    127 //   Value of: Blah("a")
    128 //   Expected: has absolute value 10
    129 //     Actual: -9
    130 //
    131 // Note that both the matcher description and its parameter are
    132 // printed, making the message human-friendly.
    133 //
    134 // In the matcher definition body, you can write 'foo_type' to
    135 // reference the type of a parameter named 'foo'.  For example, in the
    136 // body of MATCHER_P(HasAbsoluteValue, value) above, you can write
    137 // 'value_type' to refer to the type of 'value'.
    138 //
    139 // We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to
    140 // support multi-parameter matchers.
    141 //
    142 // Describing Parameterized Matchers
    143 // =================================
    144 //
    145 // The last argument to MATCHER*() is a string-typed expression.  The
    146 // expression can reference all of the matcher's parameters and a
    147 // special bool-typed variable named 'negation'.  When 'negation' is
    148 // false, the expression should evaluate to the matcher's description;
    149 // otherwise it should evaluate to the description of the negation of
    150 // the matcher.  For example,
    151 //
    152 //   using testing::PrintToString;
    153 //
    154 //   MATCHER_P2(InClosedRange, low, hi,
    155 //       std::string(negation ? "is not" : "is") + " in range [" +
    156 //       PrintToString(low) + ", " + PrintToString(hi) + "]") {
    157 //     return low <= arg && arg <= hi;
    158 //   }
    159 //   ...
    160 //   EXPECT_THAT(3, InClosedRange(4, 6));
    161 //   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
    162 //
    163 // would generate two failures that contain the text:
    164 //
    165 //   Expected: is in range [4, 6]
    166 //   ...
    167 //   Expected: is not in range [2, 4]
    168 //
    169 // If you specify "" as the description, the failure message will
    170 // contain the sequence of words in the matcher name followed by the
    171 // parameter values printed as a tuple.  For example,
    172 //
    173 //   MATCHER_P2(InClosedRange, low, hi, "") { ... }
    174 //   ...
    175 //   EXPECT_THAT(3, InClosedRange(4, 6));
    176 //   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
    177 //
    178 // would generate two failures that contain the text:
    179 //
    180 //   Expected: in closed range (4, 6)
    181 //   ...
    182 //   Expected: not (in closed range (2, 4))
    183 //
    184 // Types of Matcher Parameters
    185 // ===========================
    186 //
    187 // For the purpose of typing, you can view
    188 //
    189 //   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
    190 //
    191 // as shorthand for
    192 //
    193 //   template <typename p1_type, ..., typename pk_type>
    194 //   FooMatcherPk<p1_type, ..., pk_type>
    195 //   Foo(p1_type p1, ..., pk_type pk) { ... }
    196 //
    197 // When you write Foo(v1, ..., vk), the compiler infers the types of
    198 // the parameters v1, ..., and vk for you.  If you are not happy with
    199 // the result of the type inference, you can specify the types by
    200 // explicitly instantiating the template, as in Foo<long, bool>(5,
    201 // false).  As said earlier, you don't get to (or need to) specify
    202 // 'arg_type' as that's determined by the context in which the matcher
    203 // is used.  You can assign the result of expression Foo(p1, ..., pk)
    204 // to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
    205 // can be useful when composing matchers.
    206 //
    207 // While you can instantiate a matcher template with reference types,
    208 // passing the parameters by pointer usually makes your code more
    209 // readable.  If, however, you still want to pass a parameter by
    210 // reference, be aware that in the failure message generated by the
    211 // matcher you will see the value of the referenced object but not its
    212 // address.
    213 //
    214 // Explaining Match Results
    215 // ========================
    216 //
    217 // Sometimes the matcher description alone isn't enough to explain why
    218 // the match has failed or succeeded.  For example, when expecting a
    219 // long string, it can be very helpful to also print the diff between
    220 // the expected string and the actual one.  To achieve that, you can
    221 // optionally stream additional information to a special variable
    222 // named result_listener, whose type is a pointer to class
    223 // MatchResultListener:
    224 //
    225 //   MATCHER_P(EqualsLongString, str, "") {
    226 //     if (arg == str) return true;
    227 //
    228 //     *result_listener << "the difference: "
    229 ///                     << DiffStrings(str, arg);
    230 //     return false;
    231 //   }
    232 //
    233 // Overloading Matchers
    234 // ====================
    235 //
    236 // You can overload matchers with different numbers of parameters:
    237 //
    238 //   MATCHER_P(Blah, a, description_string1) { ... }
    239 //   MATCHER_P2(Blah, a, b, description_string2) { ... }
    240 //
    241 // Caveats
    242 // =======
    243 //
    244 // When defining a new matcher, you should also consider implementing
    245 // MatcherInterface or using MakePolymorphicMatcher().  These
    246 // approaches require more work than the MATCHER* macros, but also
    247 // give you more control on the types of the value being matched and
    248 // the matcher parameters, which may leads to better compiler error
    249 // messages when the matcher is used wrong.  They also allow
    250 // overloading matchers based on parameter types (as opposed to just
    251 // based on the number of parameters).
    252 //
    253 // MATCHER*() can only be used in a namespace scope.  The reason is
    254 // that C++ doesn't yet allow function-local types to be used to
    255 // instantiate templates.  The up-coming C++0x standard will fix this.
    256 // Once that's done, we'll consider supporting using MATCHER*() inside
    257 // a function.
    258 //
    259 // More Information
    260 // ================
    261 //
    262 // To learn more about using these macros, please search for 'MATCHER'
    263 // on
    264 // https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md
    265 
    266 #define MATCHER(name, description)\
    267   class name##Matcher {\
    268    public:\
    269     template <typename arg_type>\
    270     class gmock_Impl : public ::testing::MatcherInterface<\
    271         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    272      public:\
    273       gmock_Impl()\
    274            {}\
    275       virtual bool MatchAndExplain(\
    276           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    277           ::testing::MatchResultListener* result_listener) const;\
    278       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    279         *gmock_os << FormatDescription(false);\
    280       }\
    281       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    282         *gmock_os << FormatDescription(true);\
    283       }\
    284      private:\
    285       ::std::string FormatDescription(bool negation) const {\
    286         ::std::string gmock_description = (description);\
    287         if (!gmock_description.empty()) {\
    288           return gmock_description;\
    289         }\
    290         return ::testing::internal::FormatMatcherDescription(\
    291             negation, #name, \
    292             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    293                 ::std::tuple<>()));\
    294       }\
    295     };\
    296     template <typename arg_type>\
    297     operator ::testing::Matcher<arg_type>() const {\
    298       return ::testing::Matcher<arg_type>(\
    299           new gmock_Impl<arg_type>());\
    300     }\
    301     name##Matcher() {\
    302     }\
    303    private:\
    304   };\
    305   inline name##Matcher name() {\
    306     return name##Matcher();\
    307   }\
    308   template <typename arg_type>\
    309   bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
    310       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    311       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    312           const
    313 
    314 #define MATCHER_P(name, p0, description)\
    315   template <typename p0##_type>\
    316   class name##MatcherP {\
    317    public:\
    318     template <typename arg_type>\
    319     class gmock_Impl : public ::testing::MatcherInterface<\
    320         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    321      public:\
    322       explicit gmock_Impl(p0##_type gmock_p0)\
    323            : p0(::std::move(gmock_p0)) {}\
    324       virtual bool MatchAndExplain(\
    325           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    326           ::testing::MatchResultListener* result_listener) const;\
    327       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    328         *gmock_os << FormatDescription(false);\
    329       }\
    330       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    331         *gmock_os << FormatDescription(true);\
    332       }\
    333       p0##_type const p0;\
    334      private:\
    335       ::std::string FormatDescription(bool negation) const {\
    336         ::std::string gmock_description = (description);\
    337         if (!gmock_description.empty()) {\
    338           return gmock_description;\
    339         }\
    340         return ::testing::internal::FormatMatcherDescription(\
    341             negation, #name, \
    342             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    343                 ::std::tuple<p0##_type>(p0)));\
    344       }\
    345     };\
    346     template <typename arg_type>\
    347     operator ::testing::Matcher<arg_type>() const {\
    348       return ::testing::Matcher<arg_type>(\
    349           new gmock_Impl<arg_type>(p0));\
    350     }\
    351     explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\
    352     }\
    353     p0##_type const p0;\
    354    private:\
    355   };\
    356   template <typename p0##_type>\
    357   inline name##MatcherP<p0##_type> name(p0##_type p0) {\
    358     return name##MatcherP<p0##_type>(p0);\
    359   }\
    360   template <typename p0##_type>\
    361   template <typename arg_type>\
    362   bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    363       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    364       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    365           const
    366 
    367 #define MATCHER_P2(name, p0, p1, description)\
    368   template <typename p0##_type, typename p1##_type>\
    369   class name##MatcherP2 {\
    370    public:\
    371     template <typename arg_type>\
    372     class gmock_Impl : public ::testing::MatcherInterface<\
    373         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    374      public:\
    375       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
    376            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)) {}\
    377       virtual bool MatchAndExplain(\
    378           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    379           ::testing::MatchResultListener* result_listener) const;\
    380       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    381         *gmock_os << FormatDescription(false);\
    382       }\
    383       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    384         *gmock_os << FormatDescription(true);\
    385       }\
    386       p0##_type const p0;\
    387       p1##_type const p1;\
    388      private:\
    389       ::std::string FormatDescription(bool negation) const {\
    390         ::std::string gmock_description = (description);\
    391         if (!gmock_description.empty()) {\
    392           return gmock_description;\
    393         }\
    394         return ::testing::internal::FormatMatcherDescription(\
    395             negation, #name, \
    396             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    397                 ::std::tuple<p0##_type, p1##_type>(p0, p1)));\
    398       }\
    399     };\
    400     template <typename arg_type>\
    401     operator ::testing::Matcher<arg_type>() const {\
    402       return ::testing::Matcher<arg_type>(\
    403           new gmock_Impl<arg_type>(p0, p1));\
    404     }\
    405     name##MatcherP2(p0##_type gmock_p0, \
    406         p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \
    407         p1(::std::move(gmock_p1)) {\
    408     }\
    409     p0##_type const p0;\
    410     p1##_type const p1;\
    411    private:\
    412   };\
    413   template <typename p0##_type, typename p1##_type>\
    414   inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \
    415       p1##_type p1) {\
    416     return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\
    417   }\
    418   template <typename p0##_type, typename p1##_type>\
    419   template <typename arg_type>\
    420   bool name##MatcherP2<p0##_type, \
    421       p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    422       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    423       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    424           const
    425 
    426 #define MATCHER_P3(name, p0, p1, p2, description)\
    427   template <typename p0##_type, typename p1##_type, typename p2##_type>\
    428   class name##MatcherP3 {\
    429    public:\
    430     template <typename arg_type>\
    431     class gmock_Impl : public ::testing::MatcherInterface<\
    432         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    433      public:\
    434       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
    435            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    436                p2(::std::move(gmock_p2)) {}\
    437       virtual bool MatchAndExplain(\
    438           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    439           ::testing::MatchResultListener* result_listener) const;\
    440       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    441         *gmock_os << FormatDescription(false);\
    442       }\
    443       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    444         *gmock_os << FormatDescription(true);\
    445       }\
    446       p0##_type const p0;\
    447       p1##_type const p1;\
    448       p2##_type const p2;\
    449      private:\
    450       ::std::string FormatDescription(bool negation) const {\
    451         ::std::string gmock_description = (description);\
    452         if (!gmock_description.empty()) {\
    453           return gmock_description;\
    454         }\
    455         return ::testing::internal::FormatMatcherDescription(\
    456             negation, #name, \
    457             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    458                 ::std::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, p2)));\
    459       }\
    460     };\
    461     template <typename arg_type>\
    462     operator ::testing::Matcher<arg_type>() const {\
    463       return ::testing::Matcher<arg_type>(\
    464           new gmock_Impl<arg_type>(p0, p1, p2));\
    465     }\
    466     name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \
    467         p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \
    468         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) {\
    469     }\
    470     p0##_type const p0;\
    471     p1##_type const p1;\
    472     p2##_type const p2;\
    473    private:\
    474   };\
    475   template <typename p0##_type, typename p1##_type, typename p2##_type>\
    476   inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
    477       p1##_type p1, p2##_type p2) {\
    478     return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
    479   }\
    480   template <typename p0##_type, typename p1##_type, typename p2##_type>\
    481   template <typename arg_type>\
    482   bool name##MatcherP3<p0##_type, p1##_type, \
    483       p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    484       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    485       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    486           const
    487 
    488 #define MATCHER_P4(name, p0, p1, p2, p3, description)\
    489   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    490       typename p3##_type>\
    491   class name##MatcherP4 {\
    492    public:\
    493     template <typename arg_type>\
    494     class gmock_Impl : public ::testing::MatcherInterface<\
    495         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    496      public:\
    497       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
    498           p3##_type gmock_p3)\
    499            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    500                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)) {}\
    501       virtual bool MatchAndExplain(\
    502           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    503           ::testing::MatchResultListener* result_listener) const;\
    504       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    505         *gmock_os << FormatDescription(false);\
    506       }\
    507       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    508         *gmock_os << FormatDescription(true);\
    509       }\
    510       p0##_type const p0;\
    511       p1##_type const p1;\
    512       p2##_type const p2;\
    513       p3##_type const p3;\
    514      private:\
    515       ::std::string FormatDescription(bool negation) const {\
    516         ::std::string gmock_description = (description);\
    517         if (!gmock_description.empty()) {\
    518           return gmock_description;\
    519         }\
    520         return ::testing::internal::FormatMatcherDescription(\
    521             negation, #name, \
    522             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    523                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
    524                     p1, p2, p3)));\
    525       }\
    526     };\
    527     template <typename arg_type>\
    528     operator ::testing::Matcher<arg_type>() const {\
    529       return ::testing::Matcher<arg_type>(\
    530           new gmock_Impl<arg_type>(p0, p1, p2, p3));\
    531     }\
    532     name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \
    533         p2##_type gmock_p2, p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \
    534         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
    535         p3(::std::move(gmock_p3)) {\
    536     }\
    537     p0##_type const p0;\
    538     p1##_type const p1;\
    539     p2##_type const p2;\
    540     p3##_type const p3;\
    541    private:\
    542   };\
    543   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    544       typename p3##_type>\
    545   inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \
    546       p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
    547       p3##_type p3) {\
    548     return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
    549         p1, p2, p3);\
    550   }\
    551   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    552       typename p3##_type>\
    553   template <typename arg_type>\
    554   bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
    555       p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    556       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    557       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    558           const
    559 
    560 #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\
    561   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    562       typename p3##_type, typename p4##_type>\
    563   class name##MatcherP5 {\
    564    public:\
    565     template <typename arg_type>\
    566     class gmock_Impl : public ::testing::MatcherInterface<\
    567         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    568      public:\
    569       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
    570           p3##_type gmock_p3, p4##_type gmock_p4)\
    571            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    572                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
    573                p4(::std::move(gmock_p4)) {}\
    574       virtual bool MatchAndExplain(\
    575           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    576           ::testing::MatchResultListener* result_listener) const;\
    577       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    578         *gmock_os << FormatDescription(false);\
    579       }\
    580       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    581         *gmock_os << FormatDescription(true);\
    582       }\
    583       p0##_type const p0;\
    584       p1##_type const p1;\
    585       p2##_type const p2;\
    586       p3##_type const p3;\
    587       p4##_type const p4;\
    588      private:\
    589       ::std::string FormatDescription(bool negation) const {\
    590         ::std::string gmock_description = (description);\
    591         if (!gmock_description.empty()) {\
    592           return gmock_description;\
    593         }\
    594         return ::testing::internal::FormatMatcherDescription(\
    595             negation, #name, \
    596             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    597                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
    598                     p4##_type>(p0, p1, p2, p3, p4)));\
    599       }\
    600     };\
    601     template <typename arg_type>\
    602     operator ::testing::Matcher<arg_type>() const {\
    603       return ::testing::Matcher<arg_type>(\
    604           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\
    605     }\
    606     name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \
    607         p2##_type gmock_p2, p3##_type gmock_p3, \
    608         p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \
    609         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
    610         p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) {\
    611     }\
    612     p0##_type const p0;\
    613     p1##_type const p1;\
    614     p2##_type const p2;\
    615     p3##_type const p3;\
    616     p4##_type const p4;\
    617    private:\
    618   };\
    619   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    620       typename p3##_type, typename p4##_type>\
    621   inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
    622       p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
    623       p4##_type p4) {\
    624     return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
    625         p4##_type>(p0, p1, p2, p3, p4);\
    626   }\
    627   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    628       typename p3##_type, typename p4##_type>\
    629   template <typename arg_type>\
    630   bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
    631       p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    632       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    633       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    634           const
    635 
    636 #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\
    637   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    638       typename p3##_type, typename p4##_type, typename p5##_type>\
    639   class name##MatcherP6 {\
    640    public:\
    641     template <typename arg_type>\
    642     class gmock_Impl : public ::testing::MatcherInterface<\
    643         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    644      public:\
    645       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
    646           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\
    647            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    648                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
    649                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)) {}\
    650       virtual bool MatchAndExplain(\
    651           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    652           ::testing::MatchResultListener* result_listener) const;\
    653       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    654         *gmock_os << FormatDescription(false);\
    655       }\
    656       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    657         *gmock_os << FormatDescription(true);\
    658       }\
    659       p0##_type const p0;\
    660       p1##_type const p1;\
    661       p2##_type const p2;\
    662       p3##_type const p3;\
    663       p4##_type const p4;\
    664       p5##_type const p5;\
    665      private:\
    666       ::std::string FormatDescription(bool negation) const {\
    667         ::std::string gmock_description = (description);\
    668         if (!gmock_description.empty()) {\
    669           return gmock_description;\
    670         }\
    671         return ::testing::internal::FormatMatcherDescription(\
    672             negation, #name, \
    673             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    674                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
    675                     p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
    676       }\
    677     };\
    678     template <typename arg_type>\
    679     operator ::testing::Matcher<arg_type>() const {\
    680       return ::testing::Matcher<arg_type>(\
    681           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\
    682     }\
    683     name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \
    684         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
    685         p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \
    686         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
    687         p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \
    688         p5(::std::move(gmock_p5)) {\
    689     }\
    690     p0##_type const p0;\
    691     p1##_type const p1;\
    692     p2##_type const p2;\
    693     p3##_type const p3;\
    694     p4##_type const p4;\
    695     p5##_type const p5;\
    696    private:\
    697   };\
    698   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    699       typename p3##_type, typename p4##_type, typename p5##_type>\
    700   inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
    701       p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
    702       p3##_type p3, p4##_type p4, p5##_type p5) {\
    703     return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
    704         p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
    705   }\
    706   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    707       typename p3##_type, typename p4##_type, typename p5##_type>\
    708   template <typename arg_type>\
    709   bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
    710       p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    711       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    712       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    713           const
    714 
    715 #define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\
    716   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    717       typename p3##_type, typename p4##_type, typename p5##_type, \
    718       typename p6##_type>\
    719   class name##MatcherP7 {\
    720    public:\
    721     template <typename arg_type>\
    722     class gmock_Impl : public ::testing::MatcherInterface<\
    723         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    724      public:\
    725       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
    726           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
    727           p6##_type gmock_p6)\
    728            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    729                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
    730                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
    731                p6(::std::move(gmock_p6)) {}\
    732       virtual bool MatchAndExplain(\
    733           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    734           ::testing::MatchResultListener* result_listener) const;\
    735       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    736         *gmock_os << FormatDescription(false);\
    737       }\
    738       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    739         *gmock_os << FormatDescription(true);\
    740       }\
    741       p0##_type const p0;\
    742       p1##_type const p1;\
    743       p2##_type const p2;\
    744       p3##_type const p3;\
    745       p4##_type const p4;\
    746       p5##_type const p5;\
    747       p6##_type const p6;\
    748      private:\
    749       ::std::string FormatDescription(bool negation) const {\
    750         ::std::string gmock_description = (description);\
    751         if (!gmock_description.empty()) {\
    752           return gmock_description;\
    753         }\
    754         return ::testing::internal::FormatMatcherDescription(\
    755             negation, #name, \
    756             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    757                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
    758                     p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
    759                     p6)));\
    760       }\
    761     };\
    762     template <typename arg_type>\
    763     operator ::testing::Matcher<arg_type>() const {\
    764       return ::testing::Matcher<arg_type>(\
    765           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\
    766     }\
    767     name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \
    768         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
    769         p5##_type gmock_p5, p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \
    770         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
    771         p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \
    772         p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) {\
    773     }\
    774     p0##_type const p0;\
    775     p1##_type const p1;\
    776     p2##_type const p2;\
    777     p3##_type const p3;\
    778     p4##_type const p4;\
    779     p5##_type const p5;\
    780     p6##_type const p6;\
    781    private:\
    782   };\
    783   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    784       typename p3##_type, typename p4##_type, typename p5##_type, \
    785       typename p6##_type>\
    786   inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
    787       p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
    788       p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
    789       p6##_type p6) {\
    790     return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
    791         p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
    792   }\
    793   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    794       typename p3##_type, typename p4##_type, typename p5##_type, \
    795       typename p6##_type>\
    796   template <typename arg_type>\
    797   bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
    798       p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    799       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    800       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    801           const
    802 
    803 #define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\
    804   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    805       typename p3##_type, typename p4##_type, typename p5##_type, \
    806       typename p6##_type, typename p7##_type>\
    807   class name##MatcherP8 {\
    808    public:\
    809     template <typename arg_type>\
    810     class gmock_Impl : public ::testing::MatcherInterface<\
    811         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    812      public:\
    813       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
    814           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
    815           p6##_type gmock_p6, p7##_type gmock_p7)\
    816            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    817                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
    818                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
    819                p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)) {}\
    820       virtual bool MatchAndExplain(\
    821           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    822           ::testing::MatchResultListener* result_listener) const;\
    823       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    824         *gmock_os << FormatDescription(false);\
    825       }\
    826       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    827         *gmock_os << FormatDescription(true);\
    828       }\
    829       p0##_type const p0;\
    830       p1##_type const p1;\
    831       p2##_type const p2;\
    832       p3##_type const p3;\
    833       p4##_type const p4;\
    834       p5##_type const p5;\
    835       p6##_type const p6;\
    836       p7##_type const p7;\
    837      private:\
    838       ::std::string FormatDescription(bool negation) const {\
    839         ::std::string gmock_description = (description);\
    840         if (!gmock_description.empty()) {\
    841           return gmock_description;\
    842         }\
    843         return ::testing::internal::FormatMatcherDescription(\
    844             negation, #name, \
    845             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    846                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
    847                     p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
    848                     p3, p4, p5, p6, p7)));\
    849       }\
    850     };\
    851     template <typename arg_type>\
    852     operator ::testing::Matcher<arg_type>() const {\
    853       return ::testing::Matcher<arg_type>(\
    854           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\
    855     }\
    856     name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \
    857         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
    858         p5##_type gmock_p5, p6##_type gmock_p6, \
    859         p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \
    860         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
    861         p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \
    862         p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \
    863         p7(::std::move(gmock_p7)) {\
    864     }\
    865     p0##_type const p0;\
    866     p1##_type const p1;\
    867     p2##_type const p2;\
    868     p3##_type const p3;\
    869     p4##_type const p4;\
    870     p5##_type const p5;\
    871     p6##_type const p6;\
    872     p7##_type const p7;\
    873    private:\
    874   };\
    875   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    876       typename p3##_type, typename p4##_type, typename p5##_type, \
    877       typename p6##_type, typename p7##_type>\
    878   inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
    879       p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
    880       p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
    881       p6##_type p6, p7##_type p7) {\
    882     return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
    883         p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
    884         p6, p7);\
    885   }\
    886   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    887       typename p3##_type, typename p4##_type, typename p5##_type, \
    888       typename p6##_type, typename p7##_type>\
    889   template <typename arg_type>\
    890   bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
    891       p5##_type, p6##_type, \
    892       p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    893       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    894       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    895           const
    896 
    897 #define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\
    898   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    899       typename p3##_type, typename p4##_type, typename p5##_type, \
    900       typename p6##_type, typename p7##_type, typename p8##_type>\
    901   class name##MatcherP9 {\
    902    public:\
    903     template <typename arg_type>\
    904     class gmock_Impl : public ::testing::MatcherInterface<\
    905         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
    906      public:\
    907       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
    908           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
    909           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\
    910            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
    911                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
    912                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
    913                p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \
    914                p8(::std::move(gmock_p8)) {}\
    915       virtual bool MatchAndExplain(\
    916           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    917           ::testing::MatchResultListener* result_listener) const;\
    918       virtual void DescribeTo(::std::ostream* gmock_os) const {\
    919         *gmock_os << FormatDescription(false);\
    920       }\
    921       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
    922         *gmock_os << FormatDescription(true);\
    923       }\
    924       p0##_type const p0;\
    925       p1##_type const p1;\
    926       p2##_type const p2;\
    927       p3##_type const p3;\
    928       p4##_type const p4;\
    929       p5##_type const p5;\
    930       p6##_type const p6;\
    931       p7##_type const p7;\
    932       p8##_type const p8;\
    933      private:\
    934       ::std::string FormatDescription(bool negation) const {\
    935         ::std::string gmock_description = (description);\
    936         if (!gmock_description.empty()) {\
    937           return gmock_description;\
    938         }\
    939         return ::testing::internal::FormatMatcherDescription(\
    940             negation, #name, \
    941             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
    942                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
    943                     p4##_type, p5##_type, p6##_type, p7##_type, \
    944                     p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\
    945       }\
    946     };\
    947     template <typename arg_type>\
    948     operator ::testing::Matcher<arg_type>() const {\
    949       return ::testing::Matcher<arg_type>(\
    950           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\
    951     }\
    952     name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \
    953         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
    954         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
    955         p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \
    956         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
    957         p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \
    958         p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \
    959         p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) {\
    960     }\
    961     p0##_type const p0;\
    962     p1##_type const p1;\
    963     p2##_type const p2;\
    964     p3##_type const p3;\
    965     p4##_type const p4;\
    966     p5##_type const p5;\
    967     p6##_type const p6;\
    968     p7##_type const p7;\
    969     p8##_type const p8;\
    970    private:\
    971   };\
    972   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    973       typename p3##_type, typename p4##_type, typename p5##_type, \
    974       typename p6##_type, typename p7##_type, typename p8##_type>\
    975   inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
    976       p4##_type, p5##_type, p6##_type, p7##_type, \
    977       p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
    978       p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
    979       p8##_type p8) {\
    980     return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
    981         p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
    982         p3, p4, p5, p6, p7, p8);\
    983   }\
    984   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    985       typename p3##_type, typename p4##_type, typename p5##_type, \
    986       typename p6##_type, typename p7##_type, typename p8##_type>\
    987   template <typename arg_type>\
    988   bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
    989       p5##_type, p6##_type, p7##_type, \
    990       p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
    991       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
    992       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
    993           const
    994 
    995 #define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\
    996   template <typename p0##_type, typename p1##_type, typename p2##_type, \
    997       typename p3##_type, typename p4##_type, typename p5##_type, \
    998       typename p6##_type, typename p7##_type, typename p8##_type, \
    999       typename p9##_type>\
   1000   class name##MatcherP10 {\
   1001    public:\
   1002     template <typename arg_type>\
   1003     class gmock_Impl : public ::testing::MatcherInterface<\
   1004         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
   1005      public:\
   1006       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
   1007           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
   1008           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
   1009           p9##_type gmock_p9)\
   1010            : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \
   1011                p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \
   1012                p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \
   1013                p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \
   1014                p8(::std::move(gmock_p8)), p9(::std::move(gmock_p9)) {}\
   1015       virtual bool MatchAndExplain(\
   1016           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
   1017           ::testing::MatchResultListener* result_listener) const;\
   1018       virtual void DescribeTo(::std::ostream* gmock_os) const {\
   1019         *gmock_os << FormatDescription(false);\
   1020       }\
   1021       virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
   1022         *gmock_os << FormatDescription(true);\
   1023       }\
   1024       p0##_type const p0;\
   1025       p1##_type const p1;\
   1026       p2##_type const p2;\
   1027       p3##_type const p3;\
   1028       p4##_type const p4;\
   1029       p5##_type const p5;\
   1030       p6##_type const p6;\
   1031       p7##_type const p7;\
   1032       p8##_type const p8;\
   1033       p9##_type const p9;\
   1034      private:\
   1035       ::std::string FormatDescription(bool negation) const {\
   1036         ::std::string gmock_description = (description);\
   1037         if (!gmock_description.empty()) {\
   1038           return gmock_description;\
   1039         }\
   1040         return ::testing::internal::FormatMatcherDescription(\
   1041             negation, #name, \
   1042             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
   1043                 ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
   1044                     p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
   1045                     p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\
   1046       }\
   1047     };\
   1048     template <typename arg_type>\
   1049     operator ::testing::Matcher<arg_type>() const {\
   1050       return ::testing::Matcher<arg_type>(\
   1051           new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\
   1052     }\
   1053     name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \
   1054         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
   1055         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
   1056         p8##_type gmock_p8, p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \
   1057         p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \
   1058         p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \
   1059         p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \
   1060         p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \
   1061         p9(::std::move(gmock_p9)) {\
   1062     }\
   1063     p0##_type const p0;\
   1064     p1##_type const p1;\
   1065     p2##_type const p2;\
   1066     p3##_type const p3;\
   1067     p4##_type const p4;\
   1068     p5##_type const p5;\
   1069     p6##_type const p6;\
   1070     p7##_type const p7;\
   1071     p8##_type const p8;\
   1072     p9##_type const p9;\
   1073    private:\
   1074   };\
   1075   template <typename p0##_type, typename p1##_type, typename p2##_type, \
   1076       typename p3##_type, typename p4##_type, typename p5##_type, \
   1077       typename p6##_type, typename p7##_type, typename p8##_type, \
   1078       typename p9##_type>\
   1079   inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
   1080       p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
   1081       p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
   1082       p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
   1083       p9##_type p9) {\
   1084     return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
   1085         p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
   1086         p1, p2, p3, p4, p5, p6, p7, p8, p9);\
   1087   }\
   1088   template <typename p0##_type, typename p1##_type, typename p2##_type, \
   1089       typename p3##_type, typename p4##_type, typename p5##_type, \
   1090       typename p6##_type, typename p7##_type, typename p8##_type, \
   1091       typename p9##_type>\
   1092   template <typename arg_type>\
   1093   bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
   1094       p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
   1095       p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
   1096       GTEST_REFERENCE_TO_CONST_(arg_type) arg,\
   1097       ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
   1098           const
   1099 
   1100 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
   1101