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