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