1$$ -*- mode: c++; -*-
2$$ This is a Pump source file.  Please use Pump to convert it to
3$$ gmock-generated-actions.h.
4$$
5$var n = 10  $$ The maximum arity we support.
6$$ }} This line fixes auto-indentation of the following code in Emacs.
7// Copyright 2008, Google Inc.
8// All rights reserved.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14//     * Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//     * Redistributions in binary form must reproduce the above
17// copyright notice, this list of conditions and the following disclaimer
18// in the documentation and/or other materials provided with the
19// distribution.
20//     * Neither the name of Google Inc. nor the names of its
21// contributors may be used to endorse or promote products derived from
22// this software without specific prior written permission.
23//
24// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
36// Google Mock - a framework for writing C++ mock classes.
37//
38// This file implements some commonly used variadic matchers.
39
40#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
41#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
42
43#include <sstream>
44#include <string>
45#include <vector>
46#include "gmock/gmock-matchers.h"
47
48namespace testing {
49namespace internal {
50
51$range i 0..n-1
52
53// The type of the i-th (0-based) field of Tuple.
54#define GMOCK_FIELD_TYPE_(Tuple, i) \
55    typename ::std::tr1::tuple_element<i, Tuple>::type
56
57// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
58// tuple of type Tuple.  It has two members:
59//
60//   type: a tuple type whose i-th field is the ki-th field of Tuple.
61//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
62//
63// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:
64//
65//   type is tuple<int, bool>, and
66//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).
67
68template <class Tuple$for i [[, int k$i = -1]]>
69class TupleFields;
70
71// This generic version is used when there are $n selectors.
72template <class Tuple$for i [[, int k$i]]>
73class TupleFields {
74 public:
75  typedef ::std::tr1::tuple<$for i, [[GMOCK_FIELD_TYPE_(Tuple, k$i)]]> type;
76  static type GetSelectedFields(const Tuple& t) {
77    using ::std::tr1::get;
78    return type($for i, [[get<k$i>(t)]]);
79  }
80};
81
82// The following specialization is used for 0 ~ $(n-1) selectors.
83
84$for i [[
85$$ }}}
86$range j 0..i-1
87$range k 0..n-1
88
89template <class Tuple$for j [[, int k$j]]>
90class TupleFields<Tuple, $for k, [[$if k < i [[k$k]] $else [[-1]]]]> {
91 public:
92  typedef ::std::tr1::tuple<$for j, [[GMOCK_FIELD_TYPE_(Tuple, k$j)]]> type;
93  static type GetSelectedFields(const Tuple& $if i==0 [[/* t */]] $else [[t]]) {
94    using ::std::tr1::get;
95    return type($for j, [[get<k$j>(t)]]);
96  }
97};
98
99]]
100
101#undef GMOCK_FIELD_TYPE_
102
103// Implements the Args() matcher.
104
105$var ks = [[$for i, [[k$i]]]]
106template <class ArgsTuple$for i [[, int k$i = -1]]>
107class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
108 public:
109  // ArgsTuple may have top-level const or reference modifiers.
110  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;
111  typedef typename internal::TupleFields<RawArgsTuple, $ks>::type SelectedArgs;
112  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;
113
114  template <typename InnerMatcher>
115  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
116      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
117
118  virtual bool MatchAndExplain(ArgsTuple args,
119                               MatchResultListener* listener) const {
120    const SelectedArgs& selected_args = GetSelectedArgs(args);
121    if (!listener->IsInterested())
122      return inner_matcher_.Matches(selected_args);
123
124    PrintIndices(listener->stream());
125    *listener << "are " << PrintToString(selected_args);
126
127    StringMatchResultListener inner_listener;
128    const bool match = inner_matcher_.MatchAndExplain(selected_args,
129                                                      &inner_listener);
130    PrintIfNotEmpty(inner_listener.str(), listener->stream());
131    return match;
132  }
133
134  virtual void DescribeTo(::std::ostream* os) const {
135    *os << "are a tuple ";
136    PrintIndices(os);
137    inner_matcher_.DescribeTo(os);
138  }
139
140  virtual void DescribeNegationTo(::std::ostream* os) const {
141    *os << "are a tuple ";
142    PrintIndices(os);
143    inner_matcher_.DescribeNegationTo(os);
144  }
145
146 private:
147  static SelectedArgs GetSelectedArgs(ArgsTuple args) {
148    return TupleFields<RawArgsTuple, $ks>::GetSelectedFields(args);
149  }
150
151  // Prints the indices of the selected fields.
152  static void PrintIndices(::std::ostream* os) {
153    *os << "whose fields (";
154    const int indices[$n] = { $ks };
155    for (int i = 0; i < $n; i++) {
156      if (indices[i] < 0)
157        break;
158
159      if (i >= 1)
160        *os << ", ";
161
162      *os << "#" << indices[i];
163    }
164    *os << ") ";
165  }
166
167  const MonomorphicInnerMatcher inner_matcher_;
168
169  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);
170};
171
172template <class InnerMatcher$for i [[, int k$i = -1]]>
173class ArgsMatcher {
174 public:
175  explicit ArgsMatcher(const InnerMatcher& inner_matcher)
176      : inner_matcher_(inner_matcher) {}
177
178  template <typename ArgsTuple>
179  operator Matcher<ArgsTuple>() const {
180    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, $ks>(inner_matcher_));
181  }
182
183 private:
184  const InnerMatcher inner_matcher_;
185
186  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);
187};
188
189// Implements ElementsAre() of 1-$n arguments.
190
191
192$range i 1..n
193$for i [[
194$range j 1..i
195template <$for j, [[typename T$j]]>
196class ElementsAreMatcher$i {
197 public:
198  $if i==1 [[explicit ]]ElementsAreMatcher$i($for j, [[const T$j& e$j]])$if i > 0 [[ : ]]
199      $for j, [[e$j[[]]_(e$j)]] {}
200
201  template <typename Container>
202  operator Matcher<Container>() const {
203    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
204    typedef typename internal::StlContainerView<RawContainer>::type::value_type
205        Element;
206
207$if i==1 [[
208
209    // Nokia's Symbian Compiler has a nasty bug where the object put
210    // in a one-element local array is not destructed when the array
211    // goes out of scope.  This leads to obvious badness as we've
212    // added the linked_ptr in it to our other linked_ptrs list.
213    // Hence we implement ElementsAreMatcher1 specially to avoid using
214    // a local array.
215    const Matcher<const Element&> matcher =
216        MatcherCast<const Element&>(e1_);
217    return MakeMatcher(new ElementsAreMatcherImpl<Container>(&matcher, 1));
218]] $else [[
219
220    const Matcher<const Element&> matchers[] = {
221
222$for j [[
223      MatcherCast<const Element&>(e$j[[]]_),
224
225]]
226    };
227
228    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, $i));
229]]
230
231  }
232
233 private:
234
235$for j [[
236  const T$j& e$j[[]]_;
237
238]]
239
240  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher$i);
241};
242
243
244]]
245// A set of metafunctions for computing the result type of AllOf.
246// AllOf(m1, ..., mN) returns
247// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
248
249// Although AllOf isn't defined for one argument, AllOfResult1 is defined
250// to simplify the implementation.
251template <typename M1>
252struct AllOfResult1 {
253  typedef M1 type;
254};
255
256$range i 1..n
257
258$range i 2..n
259$for i [[
260$range j 2..i
261$var m = i/2
262$range k 1..m
263$range t m+1..i
264
265template <typename M1$for j [[, typename M$j]]>
266struct AllOfResult$i {
267  typedef BothOfMatcher<
268      typename AllOfResult$m<$for k, [[M$k]]>::type,
269      typename AllOfResult$(i-m)<$for t, [[M$t]]>::type
270  > type;
271};
272
273]]
274
275// A set of metafunctions for computing the result type of AnyOf.
276// AnyOf(m1, ..., mN) returns
277// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
278
279// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
280// to simplify the implementation.
281template <typename M1>
282struct AnyOfResult1 {
283  typedef M1 type;
284};
285
286$range i 1..n
287
288$range i 2..n
289$for i [[
290$range j 2..i
291$var m = i/2
292$range k 1..m
293$range t m+1..i
294
295template <typename M1$for j [[, typename M$j]]>
296struct AnyOfResult$i {
297  typedef EitherOfMatcher<
298      typename AnyOfResult$m<$for k, [[M$k]]>::type,
299      typename AnyOfResult$(i-m)<$for t, [[M$t]]>::type
300  > type;
301};
302
303]]
304
305}  // namespace internal
306
307// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
308// fields of it matches a_matcher.  C++ doesn't support default
309// arguments for function templates, so we have to overload it.
310
311$range i 0..n
312$for i [[
313$range j 1..i
314template <$for j [[int k$j, ]]typename InnerMatcher>
315inline internal::ArgsMatcher<InnerMatcher$for j [[, k$j]]>
316Args(const InnerMatcher& matcher) {
317  return internal::ArgsMatcher<InnerMatcher$for j [[, k$j]]>(matcher);
318}
319
320
321]]
322// ElementsAre(e0, e1, ..., e_n) matches an STL-style container with
323// (n + 1) elements, where the i-th element in the container must
324// match the i-th argument in the list.  Each argument of
325// ElementsAre() can be either a value or a matcher.  We support up to
326// $n arguments.
327//
328// NOTE: Since ElementsAre() cares about the order of the elements, it
329// must not be used with containers whose elements's order is
330// undefined (e.g. hash_map).
331
332inline internal::ElementsAreMatcher0 ElementsAre() {
333  return internal::ElementsAreMatcher0();
334}
335
336$range i 1..n
337$for i [[
338$range j 1..i
339
340template <$for j, [[typename T$j]]>
341inline internal::ElementsAreMatcher$i<$for j, [[T$j]]> ElementsAre($for j, [[const T$j& e$j]]) {
342  return internal::ElementsAreMatcher$i<$for j, [[T$j]]>($for j, [[e$j]]);
343}
344
345]]
346
347// ElementsAreArray(array) and ElementAreArray(array, count) are like
348// ElementsAre(), except that they take an array of values or
349// matchers.  The former form infers the size of 'array', which must
350// be a static C-style array.  In the latter form, 'array' can either
351// be a static array or a pointer to a dynamically created array.
352
353template <typename T>
354inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
355    const T* first, size_t count) {
356  return internal::ElementsAreArrayMatcher<T>(first, count);
357}
358
359template <typename T, size_t N>
360inline internal::ElementsAreArrayMatcher<T>
361ElementsAreArray(const T (&array)[N]) {
362  return internal::ElementsAreArrayMatcher<T>(array, N);
363}
364
365// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
366// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.
367
368$range i 2..n
369$for i [[
370$range j 1..i
371$var m = i/2
372$range k 1..m
373$range t m+1..i
374
375template <$for j, [[typename M$j]]>
376inline typename internal::AllOfResult$i<$for j, [[M$j]]>::type
377AllOf($for j, [[M$j m$j]]) {
378  return typename internal::AllOfResult$i<$for j, [[M$j]]>::type(
379      $if m == 1 [[m1]] $else [[::testing::AllOf($for k, [[m$k]])]],
380      $if m+1 == i [[m$i]] $else [[::testing::AllOf($for t, [[m$t]])]]);
381}
382
383]]
384
385// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
386// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.
387
388$range i 2..n
389$for i [[
390$range j 1..i
391$var m = i/2
392$range k 1..m
393$range t m+1..i
394
395template <$for j, [[typename M$j]]>
396inline typename internal::AnyOfResult$i<$for j, [[M$j]]>::type
397AnyOf($for j, [[M$j m$j]]) {
398  return typename internal::AnyOfResult$i<$for j, [[M$j]]>::type(
399      $if m == 1 [[m1]] $else [[::testing::AnyOf($for k, [[m$k]])]],
400      $if m+1 == i [[m$i]] $else [[::testing::AnyOf($for t, [[m$t]])]]);
401}
402
403]]
404
405}  // namespace testing
406$$ } // This Pump meta comment fixes auto-indentation in Emacs. It will not
407$$   // show up in the generated code.
408
409
410// The MATCHER* family of macros can be used in a namespace scope to
411// define custom matchers easily.
412//
413// Basic Usage
414// ===========
415//
416// The syntax
417//
418//   MATCHER(name, description_string) { statements; }
419//
420// defines a matcher with the given name that executes the statements,
421// which must return a bool to indicate if the match succeeds.  Inside
422// the statements, you can refer to the value being matched by 'arg',
423// and refer to its type by 'arg_type'.
424//
425// The description string documents what the matcher does, and is used
426// to generate the failure message when the match fails.  Since a
427// MATCHER() is usually defined in a header file shared by multiple
428// C++ source files, we require the description to be a C-string
429// literal to avoid possible side effects.  It can be empty, in which
430// case we'll use the sequence of words in the matcher name as the
431// description.
432//
433// For example:
434//
435//   MATCHER(IsEven, "") { return (arg % 2) == 0; }
436//
437// allows you to write
438//
439//   // Expects mock_foo.Bar(n) to be called where n is even.
440//   EXPECT_CALL(mock_foo, Bar(IsEven()));
441//
442// or,
443//
444//   // Verifies that the value of some_expression is even.
445//   EXPECT_THAT(some_expression, IsEven());
446//
447// If the above assertion fails, it will print something like:
448//
449//   Value of: some_expression
450//   Expected: is even
451//     Actual: 7
452//
453// where the description "is even" is automatically calculated from the
454// matcher name IsEven.
455//
456// Argument Type
457// =============
458//
459// Note that the type of the value being matched (arg_type) is
460// determined by the context in which you use the matcher and is
461// supplied to you by the compiler, so you don't need to worry about
462// declaring it (nor can you).  This allows the matcher to be
463// polymorphic.  For example, IsEven() can be used to match any type
464// where the value of "(arg % 2) == 0" can be implicitly converted to
465// a bool.  In the "Bar(IsEven())" example above, if method Bar()
466// takes an int, 'arg_type' will be int; if it takes an unsigned long,
467// 'arg_type' will be unsigned long; and so on.
468//
469// Parameterizing Matchers
470// =======================
471//
472// Sometimes you'll want to parameterize the matcher.  For that you
473// can use another macro:
474//
475//   MATCHER_P(name, param_name, description_string) { statements; }
476//
477// For example:
478//
479//   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
480//
481// will allow you to write:
482//
483//   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
484//
485// which may lead to this message (assuming n is 10):
486//
487//   Value of: Blah("a")
488//   Expected: has absolute value 10
489//     Actual: -9
490//
491// Note that both the matcher description and its parameter are
492// printed, making the message human-friendly.
493//
494// In the matcher definition body, you can write 'foo_type' to
495// reference the type of a parameter named 'foo'.  For example, in the
496// body of MATCHER_P(HasAbsoluteValue, value) above, you can write
497// 'value_type' to refer to the type of 'value'.
498//
499// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P$n to
500// support multi-parameter matchers.
501//
502// Describing Parameterized Matchers
503// =================================
504//
505// The last argument to MATCHER*() is a string-typed expression.  The
506// expression can reference all of the matcher's parameters and a
507// special bool-typed variable named 'negation'.  When 'negation' is
508// false, the expression should evaluate to the matcher's description;
509// otherwise it should evaluate to the description of the negation of
510// the matcher.  For example,
511//
512//   using testing::PrintToString;
513//
514//   MATCHER_P2(InClosedRange, low, hi,
515//       string(negation ? "is not" : "is") + " in range [" +
516//       PrintToString(low) + ", " + PrintToString(hi) + "]") {
517//     return low <= arg && arg <= hi;
518//   }
519//   ...
520//   EXPECT_THAT(3, InClosedRange(4, 6));
521//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
522//
523// would generate two failures that contain the text:
524//
525//   Expected: is in range [4, 6]
526//   ...
527//   Expected: is not in range [2, 4]
528//
529// If you specify "" as the description, the failure message will
530// contain the sequence of words in the matcher name followed by the
531// parameter values printed as a tuple.  For example,
532//
533//   MATCHER_P2(InClosedRange, low, hi, "") { ... }
534//   ...
535//   EXPECT_THAT(3, InClosedRange(4, 6));
536//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
537//
538// would generate two failures that contain the text:
539//
540//   Expected: in closed range (4, 6)
541//   ...
542//   Expected: not (in closed range (2, 4))
543//
544// Types of Matcher Parameters
545// ===========================
546//
547// For the purpose of typing, you can view
548//
549//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
550//
551// as shorthand for
552//
553//   template <typename p1_type, ..., typename pk_type>
554//   FooMatcherPk<p1_type, ..., pk_type>
555//   Foo(p1_type p1, ..., pk_type pk) { ... }
556//
557// When you write Foo(v1, ..., vk), the compiler infers the types of
558// the parameters v1, ..., and vk for you.  If you are not happy with
559// the result of the type inference, you can specify the types by
560// explicitly instantiating the template, as in Foo<long, bool>(5,
561// false).  As said earlier, you don't get to (or need to) specify
562// 'arg_type' as that's determined by the context in which the matcher
563// is used.  You can assign the result of expression Foo(p1, ..., pk)
564// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
565// can be useful when composing matchers.
566//
567// While you can instantiate a matcher template with reference types,
568// passing the parameters by pointer usually makes your code more
569// readable.  If, however, you still want to pass a parameter by
570// reference, be aware that in the failure message generated by the
571// matcher you will see the value of the referenced object but not its
572// address.
573//
574// Explaining Match Results
575// ========================
576//
577// Sometimes the matcher description alone isn't enough to explain why
578// the match has failed or succeeded.  For example, when expecting a
579// long string, it can be very helpful to also print the diff between
580// the expected string and the actual one.  To achieve that, you can
581// optionally stream additional information to a special variable
582// named result_listener, whose type is a pointer to class
583// MatchResultListener:
584//
585//   MATCHER_P(EqualsLongString, str, "") {
586//     if (arg == str) return true;
587//
588//     *result_listener << "the difference: "
589///                     << DiffStrings(str, arg);
590//     return false;
591//   }
592//
593// Overloading Matchers
594// ====================
595//
596// You can overload matchers with different numbers of parameters:
597//
598//   MATCHER_P(Blah, a, description_string1) { ... }
599//   MATCHER_P2(Blah, a, b, description_string2) { ... }
600//
601// Caveats
602// =======
603//
604// When defining a new matcher, you should also consider implementing
605// MatcherInterface or using MakePolymorphicMatcher().  These
606// approaches require more work than the MATCHER* macros, but also
607// give you more control on the types of the value being matched and
608// the matcher parameters, which may leads to better compiler error
609// messages when the matcher is used wrong.  They also allow
610// overloading matchers based on parameter types (as opposed to just
611// based on the number of parameters).
612//
613// MATCHER*() can only be used in a namespace scope.  The reason is
614// that C++ doesn't yet allow function-local types to be used to
615// instantiate templates.  The up-coming C++0x standard will fix this.
616// Once that's done, we'll consider supporting using MATCHER*() inside
617// a function.
618//
619// More Information
620// ================
621//
622// To learn more about using these macros, please search for 'MATCHER'
623// on http://code.google.com/p/googlemock/wiki/CookBook.
624
625$range i 0..n
626$for i
627
628[[
629$var macro_name = [[$if i==0 [[MATCHER]] $elif i==1 [[MATCHER_P]]
630                                         $else [[MATCHER_P$i]]]]
631$var class_name = [[name##Matcher[[$if i==0 [[]] $elif i==1 [[P]]
632                                                 $else [[P$i]]]]]]
633$range j 0..i-1
634$var template = [[$if i==0 [[]] $else [[
635
636  template <$for j, [[typename p$j##_type]]>\
637]]]]
638$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]
639$var impl_ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]
640$var impl_inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]]
641$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]]
642$var params = [[$for j, [[p$j]]]]
643$var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]]
644$var param_types_and_names = [[$for j, [[p$j##_type p$j]]]]
645$var param_field_decls = [[$for j
646[[
647
648      p$j##_type p$j;\
649]]]]
650$var param_field_decls2 = [[$for j
651[[
652
653    p$j##_type p$j;\
654]]]]
655
656#define $macro_name(name$for j [[, p$j]], description)\$template
657  class $class_name {\
658   public:\
659    template <typename arg_type>\
660    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
661     public:\
662      [[$if i==1 [[explicit ]]]]gmock_Impl($impl_ctor_param_list)\
663          $impl_inits {}\
664      virtual bool MatchAndExplain(\
665          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
666      virtual void DescribeTo(::std::ostream* gmock_os) const {\
667        *gmock_os << FormatDescription(false);\
668      }\
669      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
670        *gmock_os << FormatDescription(true);\
671      }\$param_field_decls
672     private:\
673      ::testing::internal::string FormatDescription(bool negation) const {\
674        const ::testing::internal::string gmock_description = (description);\
675        if (!gmock_description.empty())\
676          return gmock_description;\
677        return ::testing::internal::FormatMatcherDescription(\
678            negation, #name, \
679            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
680                ::std::tr1::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\
681      }\
682      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
683    };\
684    template <typename arg_type>\
685    operator ::testing::Matcher<arg_type>() const {\
686      return ::testing::Matcher<arg_type>(\
687          new gmock_Impl<arg_type>($params));\
688    }\
689    $class_name($ctor_param_list)$inits {\
690    }\$param_field_decls2
691   private:\
692    GTEST_DISALLOW_ASSIGN_($class_name);\
693  };\$template
694  inline $class_name$param_types name($param_types_and_names) {\
695    return $class_name$param_types($params);\
696  }\$template
697  template <typename arg_type>\
698  bool $class_name$param_types::gmock_Impl<arg_type>::MatchAndExplain(\
699      arg_type arg, \
700      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
701          const
702]]
703
704
705#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
706