146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// This file was GENERATED by command:
246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     pump.py gmock-generated-matchers.h.pump
346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// DO NOT EDIT BY HAND!!!
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2008, Google Inc.
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved.
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Mock - a framework for writing C++ mock classes.
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file implements some commonly used variadic matchers.
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <sstream>
42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string>
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <vector>
4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock-matchers.h"
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The type of the i-th (0-based) field of Tuple.
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define GMOCK_FIELD_TYPE_(Tuple, i) \
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename ::std::tr1::tuple_element<i, Tuple>::type
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// tuple of type Tuple.  It has two members:
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   type: a tuple type whose i-th field is the ki-th field of Tuple.
57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   type is tuple<int, bool>, and
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k9 = -1>
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields;
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This generic version is used when there are 10 selectors.
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k7, int k8, int k9>
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields {
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
76dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
77dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k9)> type;
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The following specialization is used for 0 ~ 9 selectors.
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple>
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<> type;
9346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  static type GetSelectedFields(const Tuple& /* t */) {
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type();
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0>
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t));
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1>
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1)> type;
114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t));
117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2>
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;
125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t));
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3>
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3)> type;
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));
140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3, int k4>
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {
145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>
156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {
157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k5)> type;
162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        get<k5>(t));
166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>
170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;
176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        get<k5>(t), get<k6>(t));
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k7>
185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {
186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k7)> type;
192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        get<k5>(t), get<k6>(t), get<k7>(t));
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k7, int k8>
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef ::std::tr1::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static type GetSelectedFields(const Tuple& t) {
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    using ::std::tr1::get;
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#undef GMOCK_FIELD_TYPE_
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Implements the Args() matcher.
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k9 = -1>
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // ArgsTuple may have top-level const or reference modifiers.
22446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      k6, k7, k8, k9>::type SelectedArgs;
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename InnerMatcher>
230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
23346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  virtual bool MatchAndExplain(ArgsTuple args,
23446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                               MatchResultListener* listener) const {
23546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const SelectedArgs& selected_args = GetSelectedArgs(args);
23646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    if (!listener->IsInterested())
23746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      return inner_matcher_.Matches(selected_args);
23846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
23946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    PrintIndices(listener->stream());
24046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    *listener << "are " << PrintToString(selected_args);
24146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
24246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    StringMatchResultListener inner_listener;
24346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const bool match = inner_matcher_.MatchAndExplain(selected_args,
24446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                                      &inner_listener);
24546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    PrintIfNotEmpty(inner_listener.str(), listener->stream());
24646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return match;
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void DescribeTo(::std::ostream* os) const {
25046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    *os << "are a tuple ";
251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    PrintIndices(os);
252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    inner_matcher_.DescribeTo(os);
253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void DescribeNegationTo(::std::ostream* os) const {
25646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    *os << "are a tuple ";
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    PrintIndices(os);
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    inner_matcher_.DescribeNegationTo(os);
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static SelectedArgs GetSelectedArgs(ArgsTuple args) {
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        k9>::GetSelectedFields(args);
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Prints the indices of the selected fields.
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  static void PrintIndices(::std::ostream* os) {
26946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    *os << "whose fields (";
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for (int i = 0; i < 10; i++) {
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (indices[i] < 0)
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        break;
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if (i >= 1)
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        *os << ", ";
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      *os << "#" << indices[i];
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    *os << ") ";
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const MonomorphicInnerMatcher inner_matcher_;
28446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
28546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k8 = -1, int k9 = -1>
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ArgsMatcher {
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ArgsMatcher(const InnerMatcher& inner_matcher)
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      : inner_matcher_(inner_matcher) {}
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename ArgsTuple>
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<ArgsTuple>() const {
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        k6, k7, k8, k9>(inner_matcher_));
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
30346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const InnerMatcher inner_matcher_;
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
30546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
30846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Implements ElementsAre() of 1-10 arguments.
309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1>
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher1 {
312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  explicit ElementsAreMatcher1(const T1& e1) : e1_(e1) {}
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
31746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
32146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // Nokia's Symbian Compiler has a nasty bug where the object put
32246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // in a one-element local array is not destructed when the array
32346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // goes out of scope.  This leads to obvious badness as we've
32446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // added the linked_ptr in it to our other linked_ptrs list.
32546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // Hence we implement ElementsAreMatcher1 specially to avoid using
32646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    // a local array.
32746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    const Matcher<const Element&> matcher =
32846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        MatcherCast<const Element&>(e1_);
32946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return MakeMatcher(new ElementsAreMatcherImpl<Container>(&matcher, 1));
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
33446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
33546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher1);
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2>
339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher2 {
340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher2(const T1& e1, const T2& e2) : e1_(e1), e2_(e2) {}
342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
34546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 2));
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
36046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
36146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher2);
362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3>
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher3 {
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher3(const T1& e1, const T2& e2, const T3& e3) : e1_(e1),
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e2_(e2), e3_(e3) {}
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
37246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 3));
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
38946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
39046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher3);
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4>
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher4 {
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher4(const T1& e1, const T2& e2, const T3& e3,
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T4& e4) : e1_(e1), e2_(e2), e3_(e3), e4_(e4) {}
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
40146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 4));
413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
42046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
42146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher4);
422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher5 {
426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher5(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T5& e5) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5) {}
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
43246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e5_),
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 5));
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5& e5_;
45346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
45446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher5);
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6>
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher6 {
460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher6(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T5& e5, const T6& e6) : e1_(e1), e2_(e2), e3_(e3), e4_(e4),
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e5_(e5), e6_(e6) {}
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
46746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e5_),
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e6_),
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 6));
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5& e5_;
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6& e6_;
49046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
49146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher6);
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7>
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher7 {
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher7(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T5& e5, const T6& e6, const T7& e7) : e1_(e1), e2_(e2), e3_(e3),
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e4_(e4), e5_(e5), e6_(e6), e7_(e7) {}
501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
50446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e5_),
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e6_),
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e7_),
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 7));
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5& e5_;
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6& e6_;
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7& e7_;
52946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
53046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher7);
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8>
535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher8 {
536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher8(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T5& e5, const T6& e6, const T7& e7, const T8& e8) : e1_(e1),
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6), e7_(e7), e8_(e8) {}
540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
54346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e5_),
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e6_),
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e7_),
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e8_),
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 8));
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5& e5_;
567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6& e6_;
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7& e7_;
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8& e8_;
57046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
57146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher8);
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9>
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher9 {
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher9(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T5& e5, const T6& e6, const T7& e7, const T8& e8,
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T9& e9) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6),
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e7_(e7), e8_(e8), e9_(e9) {}
582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
58546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e5_),
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e6_),
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e7_),
597dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e8_),
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e9_),
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 9));
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5& e5_;
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6& e6_;
611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7& e7_;
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8& e8_;
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9& e9_;
61446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
61546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher9);
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10>
620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ElementsAreMatcher10 {
621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ElementsAreMatcher10(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      const T10& e10) : e1_(e1), e2_(e2), e3_(e3), e4_(e4), e5_(e5), e6_(e6),
625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e7_(e7), e8_(e8), e9_(e9), e10_(e10) {}
626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename Container>
628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  operator Matcher<Container>() const {
62946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typedef typename internal::StlContainerView<RawContainer>::type::value_type
631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        Element;
632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const Matcher<const Element&> matchers[] = {
634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e1_),
635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e2_),
636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e3_),
637dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e4_),
638dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e5_),
639dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e6_),
640dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e7_),
641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e8_),
642dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e9_),
643dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      MatcherCast<const Element&>(e10_),
644dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };
645dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 10));
647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter private:
650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T1& e1_;
651dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T2& e2_;
652dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T3& e3_;
653dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T4& e4_;
654dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T5& e5_;
655dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T6& e6_;
656dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T7& e7_;
657dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T8& e8_;
658dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T9& e9_;
659dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const T10& e10_;
66046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
66146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher10);
662dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
66446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A set of metafunctions for computing the result type of AllOf.
66546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// AllOf(m1, ..., mN) returns
66646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
66846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Although AllOf isn't defined for one argument, AllOfResult1 is defined
66946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// to simplify the implementation.
67046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1>
67146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult1 {
67246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef M1 type;
67346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
67546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2>
67646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult2 {
67746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
67846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult1<M1>::type,
67946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult1<M2>::type
68046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
68146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
68346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3>
68446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult3 {
68546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
68646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult1<M1>::type,
68746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult2<M2, M3>::type
68846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
68946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
69046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
69146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4>
69246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult4 {
69346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
69446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult2<M1, M2>::type,
69546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult2<M3, M4>::type
69646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
69746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
69846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
69946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
70046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult5 {
70146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
70246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult2<M1, M2>::type,
70346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult3<M3, M4, M5>::type
70446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
70546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
70646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
70746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
70846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6>
70946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult6 {
71046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
71146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult3<M1, M2, M3>::type,
71246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult3<M4, M5, M6>::type
71346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
71446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
71546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
71646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
71746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7>
71846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult7 {
71946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
72046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult3<M1, M2, M3>::type,
72146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult4<M4, M5, M6, M7>::type
72246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
72346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
72446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
72546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
72646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8>
72746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult8 {
72846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
72946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult4<M1, M2, M3, M4>::type,
73046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult4<M5, M6, M7, M8>::type
73146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
73246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
73346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
73446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
73546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9>
73646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult9 {
73746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
73846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult4<M1, M2, M3, M4>::type,
73946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult5<M5, M6, M7, M8, M9>::type
74046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
74146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
74246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
74346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
74446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9, typename M10>
74546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AllOfResult10 {
74646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef BothOfMatcher<
74746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult5<M1, M2, M3, M4, M5>::type,
74846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AllOfResult5<M6, M7, M8, M9, M10>::type
74946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
75046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
75146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
75246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// A set of metafunctions for computing the result type of AnyOf.
75346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// AnyOf(m1, ..., mN) returns
75446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
75546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
75646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
75746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// to simplify the implementation.
75846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1>
75946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult1 {
76046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef M1 type;
76146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
76246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
76346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2>
76446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult2 {
76546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
76646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult1<M1>::type,
76746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult1<M2>::type
76846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
76946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
77046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
77146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3>
77246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult3 {
77346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
77446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult1<M1>::type,
77546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult2<M2, M3>::type
77646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
77746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
77846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
77946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4>
78046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult4 {
78146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
78246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult2<M1, M2>::type,
78346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult2<M3, M4>::type
78446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
78546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
78646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
78746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
78846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult5 {
78946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
79046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult2<M1, M2>::type,
79146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult3<M3, M4, M5>::type
79246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
79346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
79446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
79546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
79646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6>
79746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult6 {
79846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
79946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult3<M1, M2, M3>::type,
80046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult3<M4, M5, M6>::type
80146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
80246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
80346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
80446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
80546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7>
80646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult7 {
80746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
80846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult3<M1, M2, M3>::type,
80946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult4<M4, M5, M6, M7>::type
81046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
81146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
81246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
81346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
81446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8>
81546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult8 {
81646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
81746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult4<M1, M2, M3, M4>::type,
81846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult4<M5, M6, M7, M8>::type
81946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
82046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
82146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
82246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
82346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9>
82446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult9 {
82546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
82646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult4<M1, M2, M3, M4>::type,
82746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult5<M5, M6, M7, M8, M9>::type
82846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
82946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
83046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
83146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
83246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9, typename M10>
83346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanstruct AnyOfResult10 {
83446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  typedef EitherOfMatcher<
83546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult5<M1, M2, M3, M4, M5>::type,
83646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      typename AnyOfResult5<M6, M7, M8, M9, M10>::type
83746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  > type;
838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// fields of it matches a_matcher.  C++ doesn't support default
844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// arguments for function templates, so we have to overload it.
845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename InnerMatcher>
846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher>
847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher>(matcher);
849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, typename InnerMatcher>
852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1>
853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1>(matcher);
855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, typename InnerMatcher>
858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2>
859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);
861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, typename InnerMatcher>
864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>
865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);
867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, typename InnerMatcher>
870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>
871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);
873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
875dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>
876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>
877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
878dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);
879dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
880dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
881dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>
882dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>
883dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
884dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);
885dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
886dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename InnerMatcher>
889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>
890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
891dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,
892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      k7>(matcher);
893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename InnerMatcher>
897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>
898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,
900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      k8>(matcher);
901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k9, typename InnerMatcher>
905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>
906dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      k9>(matcher);
909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    int k9, int k10, typename InnerMatcher>
913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,
914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    k10>
915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterArgs(const InnerMatcher& matcher) {
916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      k9, k10>(matcher);
918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ElementsAre(e0, e1, ..., e_n) matches an STL-style container with
921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (n + 1) elements, where the i-th element in the container must
922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// match the i-th argument in the list.  Each argument of
923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ElementsAre() can be either a value or a matcher.  We support up to
924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 10 arguments.
925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// NOTE: Since ElementsAre() cares about the order of the elements, it
927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// must not be used with containers whose elements's order is
928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// undefined (e.g. hash_map).
929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher0 ElementsAre() {
931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher0();
932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1>
935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher1<T1> ElementsAre(const T1& e1) {
936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher1<T1>(e1);
937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2>
940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher2<T1, T2> ElementsAre(const T1& e1,
941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T2& e2) {
942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher2<T1, T2>(e1, e2);
943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3>
946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher3<T1, T2, T3> ElementsAre(const T1& e1,
947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T2& e2, const T3& e3) {
948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher3<T1, T2, T3>(e1, e2, e3);
949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4>
952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher4<T1, T2, T3, T4> ElementsAre(const T1& e1,
953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T2& e2, const T3& e3, const T4& e4) {
954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher4<T1, T2, T3, T4>(e1, e2, e3, e4);
955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5>
958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher5<T1, T2, T3, T4,
959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T5> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T5& e5) {
961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher5<T1, T2, T3, T4, T5>(e1, e2, e3, e4, e5);
962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6>
966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher6<T1, T2, T3, T4, T5,
967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T6> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T5& e5, const T6& e6) {
969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher6<T1, T2, T3, T4, T5, T6>(e1, e2, e3, e4,
970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e5, e6);
971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7>
975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6,
976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T7> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T5& e5, const T6& e6, const T7& e7) {
978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher7<T1, T2, T3, T4, T5, T6, T7>(e1, e2, e3,
979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e4, e5, e6, e7);
980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8>
984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7,
985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T8> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher8<T1, T2, T3, T4, T5, T6, T7, T8>(e1, e2,
988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e3, e4, e5, e6, e7, e8);
989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9>
993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8,
994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T9> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(e1,
997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      e2, e3, e4, e5, e6, e7, e8, e9);
998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T1, typename T2, typename T3, typename T4, typename T5,
1001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    typename T6, typename T7, typename T8, typename T9, typename T10>
1002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
1003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    T10> ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
1004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
1005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T10& e10) {
1006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreMatcher10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
1007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      T10>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
1008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ElementsAreArray(array) and ElementAreArray(array, count) are like
1011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ElementsAre(), except that they take an array of values or
1012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matchers.  The former form infers the size of 'array', which must
1013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// be a static C-style array.  In the latter form, 'array' can either
1014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// be a static array or a pointer to a dynamically created array.
1015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T>
1017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
1018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    const T* first, size_t count) {
1019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreArrayMatcher<T>(first, count);
1020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtertemplate <typename T, size_t N>
1023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline internal::ElementsAreArrayMatcher<T>
1024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterElementsAreArray(const T (&array)[N]) {
1025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return internal::ElementsAreArrayMatcher<T>(array, N);
1026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
102846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
102946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.
103046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
103146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2>
103246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult2<M1, M2>::type
103346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2) {
103446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult2<M1, M2>::type(
103546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      m1,
103646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      m2);
103746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
103846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
103946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3>
104046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult3<M1, M2, M3>::type
104146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3) {
104246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult3<M1, M2, M3>::type(
104346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      m1,
104446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m2, m3));
104546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
104646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
104746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4>
104846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult4<M1, M2, M3, M4>::type
104946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4) {
105046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult4<M1, M2, M3, M4>::type(
105146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2),
105246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m3, m4));
105346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
105446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
105546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
105646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type
105746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
105846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(
105946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2),
106046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m3, m4, m5));
106146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
106246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
106346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
106446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6>
106546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type
106646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
106746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(
106846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2, m3),
106946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m4, m5, m6));
107046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
107146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
107246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
107346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7>
107446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
107546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
107646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
107746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2, m3),
107846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m4, m5, m6, m7));
107946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
108046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
108146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
108246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8>
108346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
108446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
108546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
108646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2, m3, m4),
108746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m5, m6, m7, m8));
108846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
108946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
109046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
109146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9>
109246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
109346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
109446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
109546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      M9>::type(
109646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2, m3, m4),
109746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m5, m6, m7, m8, m9));
109846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
109946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
110046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
110146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9, typename M10>
110246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
110346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    M10>::type
110446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
110546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
110646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      M10>::type(
110746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m1, m2, m3, m4, m5),
110846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AllOf(m6, m7, m8, m9, m10));
110946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
111046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
111146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
111246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.
111346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
111446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2>
111546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult2<M1, M2>::type
111646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2) {
111746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult2<M1, M2>::type(
111846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      m1,
111946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      m2);
112046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
112146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
112246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3>
112346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult3<M1, M2, M3>::type
112446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3) {
112546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult3<M1, M2, M3>::type(
112646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      m1,
112746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m2, m3));
112846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
112946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
113046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4>
113146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult4<M1, M2, M3, M4>::type
113246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {
113346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(
113446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2),
113546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m3, m4));
113646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
113746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
113846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5>
113946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type
114046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
114146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(
114246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2),
114346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m3, m4, m5));
114446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
114546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
114646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
114746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6>
114846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type
114946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
115046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(
115146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2, m3),
115246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m4, m5, m6));
115346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
115446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
115546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
115646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7>
115746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
115846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
115946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
116046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2, m3),
116146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m4, m5, m6, m7));
116246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
116346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
116446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
116546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8>
116646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
116746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
116846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
116946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2, m3, m4),
117046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m5, m6, m7, m8));
117146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
117246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
117346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
117446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9>
117546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
117646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
117746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
117846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      M9>::type(
117946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2, m3, m4),
118046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m5, m6, m7, m8, m9));
118146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
118246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
118346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chantemplate <typename M1, typename M2, typename M3, typename M4, typename M5,
118446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    typename M6, typename M7, typename M8, typename M9, typename M10>
118546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chaninline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
118646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    M10>::type
118746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanAnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
118846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
118946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      M10>::type(
119046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m1, m2, m3, m4, m5),
119146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::AnyOf(m6, m7, m8, m9, m10));
119246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
119346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
1195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
119646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The MATCHER* family of macros can be used in a namespace scope to
119846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// define custom matchers easily.
119946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
120046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Basic Usage
120146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ===========
120246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
120346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The syntax
1204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER(name, description_string) { statements; }
1206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
120746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// defines a matcher with the given name that executes the statements,
120846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// which must return a bool to indicate if the match succeeds.  Inside
120946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the statements, you can refer to the value being matched by 'arg',
121046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// and refer to its type by 'arg_type'.
1211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The description string documents what the matcher does, and is used
1213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// to generate the failure message when the match fails.  Since a
1214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// MATCHER() is usually defined in a header file shared by multiple
1215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// C++ source files, we require the description to be a C-string
1216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// literal to avoid possible side effects.  It can be empty, in which
1217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// case we'll use the sequence of words in the matcher name as the
1218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// description.
1219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For example:
1221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER(IsEven, "") { return (arg % 2) == 0; }
1223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// allows you to write
1225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   // Expects mock_foo.Bar(n) to be called where n is even.
1227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   EXPECT_CALL(mock_foo, Bar(IsEven()));
1228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// or,
1230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   // Verifies that the value of some_expression is even.
1232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   EXPECT_THAT(some_expression, IsEven());
1233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// If the above assertion fails, it will print something like:
1235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Value of: some_expression
1237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Expected: is even
1238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     Actual: 7
1239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// where the description "is even" is automatically calculated from the
1241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matcher name IsEven.
1242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
124346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Argument Type
124446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// =============
124546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
1246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Note that the type of the value being matched (arg_type) is
1247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// determined by the context in which you use the matcher and is
1248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// supplied to you by the compiler, so you don't need to worry about
1249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// declaring it (nor can you).  This allows the matcher to be
1250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// polymorphic.  For example, IsEven() can be used to match any type
1251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// where the value of "(arg % 2) == 0" can be implicitly converted to
1252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a bool.  In the "Bar(IsEven())" example above, if method Bar()
1253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// takes an int, 'arg_type' will be int; if it takes an unsigned long,
1254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 'arg_type' will be unsigned long; and so on.
1255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
125646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Parameterizing Matchers
125746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// =======================
125846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
1259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Sometimes you'll want to parameterize the matcher.  For that you
1260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// can use another macro:
1261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER_P(name, param_name, description_string) { statements; }
1263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For example:
1265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
1267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// will allow you to write:
1269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
1271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// which may lead to this message (assuming n is 10):
1273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Value of: Blah("a")
1275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Expected: has absolute value 10
1276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     Actual: -9
1277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Note that both the matcher description and its parameter are
1279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// printed, making the message human-friendly.
1280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// In the matcher definition body, you can write 'foo_type' to
1282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// reference the type of a parameter named 'foo'.  For example, in the
1283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// body of MATCHER_P(HasAbsoluteValue, value) above, you can write
1284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 'value_type' to refer to the type of 'value'.
1285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to
1287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// support multi-parameter matchers.
1288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
128946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Describing Parameterized Matchers
129046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// =================================
1291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
129246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The last argument to MATCHER*() is a string-typed expression.  The
129346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// expression can reference all of the matcher's parameters and a
129446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// special bool-typed variable named 'negation'.  When 'negation' is
129546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// false, the expression should evaluate to the matcher's description;
129646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// otherwise it should evaluate to the description of the negation of
129746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the matcher.  For example,
1298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
129946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   using testing::PrintToString;
1300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
130146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   MATCHER_P2(InClosedRange, low, hi,
130246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//       string(negation ? "is not" : "is") + " in range [" +
130346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//       PrintToString(low) + ", " + PrintToString(hi) + "]") {
1304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     return low <= arg && arg <= hi;
1305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   }
1306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   ...
1307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   EXPECT_THAT(3, InClosedRange(4, 6));
130846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
1309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
131046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// would generate two failures that contain the text:
1311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Expected: is in range [4, 6]
131346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   ...
131446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   Expected: is not in range [2, 4]
1315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// If you specify "" as the description, the failure message will
1317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contain the sequence of words in the matcher name followed by the
1318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// parameter values printed as a tuple.  For example,
1319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER_P2(InClosedRange, low, hi, "") { ... }
1321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   ...
1322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   EXPECT_THAT(3, InClosedRange(4, 6));
132346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
1324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
132546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// would generate two failures that contain the text:
1326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Expected: in closed range (4, 6)
132846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   ...
132946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   Expected: not (in closed range (2, 4))
133046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
133146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Types of Matcher Parameters
133246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ===========================
1333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// For the purpose of typing, you can view
1335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
1337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// as shorthand for
1339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   template <typename p1_type, ..., typename pk_type>
1341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   FooMatcherPk<p1_type, ..., pk_type>
1342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   Foo(p1_type p1, ..., pk_type pk) { ... }
1343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// When you write Foo(v1, ..., vk), the compiler infers the types of
1345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the parameters v1, ..., and vk for you.  If you are not happy with
1346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the result of the type inference, you can specify the types by
1347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// explicitly instantiating the template, as in Foo<long, bool>(5,
1348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// false).  As said earlier, you don't get to (or need to) specify
1349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// 'arg_type' as that's determined by the context in which the matcher
1350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is used.  You can assign the result of expression Foo(p1, ..., pk)
1351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
1352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// can be useful when composing matchers.
1353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// While you can instantiate a matcher template with reference types,
1355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// passing the parameters by pointer usually makes your code more
1356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// readable.  If, however, you still want to pass a parameter by
1357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// reference, be aware that in the failure message generated by the
1358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matcher you will see the value of the referenced object but not its
1359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// address.
1360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
136146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Explaining Match Results
136246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ========================
136346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
136446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Sometimes the matcher description alone isn't enough to explain why
136546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the match has failed or succeeded.  For example, when expecting a
136646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// long string, it can be very helpful to also print the diff between
136746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the expected string and the actual one.  To achieve that, you can
136846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// optionally stream additional information to a special variable
136946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// named result_listener, whose type is a pointer to class
137046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// MatchResultListener:
137146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
137246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   MATCHER_P(EqualsLongString, str, "") {
137346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     if (arg == str) return true;
137446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
137546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     *result_listener << "the difference: "
137646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan///                     << DiffStrings(str, arg);
137746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//     return false;
137846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//   }
137946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
138046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Overloading Matchers
138146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ====================
138246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan//
1383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// You can overload matchers with different numbers of parameters:
1384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER_P(Blah, a, description_string1) { ... }
1386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//   MATCHER_P2(Blah, a, b, description_string2) { ... }
1387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
138846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Caveats
138946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// =======
1390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
139146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// When defining a new matcher, you should also consider implementing
139246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// MatcherInterface or using MakePolymorphicMatcher().  These
139346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// approaches require more work than the MATCHER* macros, but also
139446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// give you more control on the types of the value being matched and
139546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// the matcher parameters, which may leads to better compiler error
139646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// messages when the matcher is used wrong.  They also allow
139746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// overloading matchers based on parameter types (as opposed to just
139846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// based on the number of parameters).
1399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// MATCHER*() can only be used in a namespace scope.  The reason is
1401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// that C++ doesn't yet allow function-local types to be used to
1402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// instantiate templates.  The up-coming C++0x standard will fix this.
1403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Once that's done, we'll consider supporting using MATCHER*() inside
1404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// a function.
1405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
140646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// More Information
140746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// ================
1408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
1409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// To learn more about using these macros, please search for 'MATCHER'
1410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// on http://code.google.com/p/googlemock/wiki/CookBook.
1411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER(name, description)\
1413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##Matcher {\
1414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
141846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      gmock_Impl()\
141946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan           {}\
142046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
142146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
142346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
142446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
142546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
142646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
142746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
142846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
142946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
143046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
143146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
143246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
143346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
143446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
1435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
143646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<>()));\
1437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
143846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
144346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>());\
1444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##Matcher() {\
1446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
144746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
144846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##Matcher);\
1449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##Matcher name() {\
1451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##Matcher();\
1452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
145446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
145546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
145646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
145746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P(name, p0, description)\
1460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type>\
1461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP {\
1462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
146646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      explicit gmock_Impl(p0##_type gmock_p0)\
146746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan           : p0(gmock_p0) {}\
146846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
146946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
147146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
147246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
147346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
147446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
147746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
147846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
147946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
148046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
148146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
148246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
148346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
148446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
148546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type>(p0)));\
148646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
148746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
149246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0));\
1493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\
1495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
149746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
149846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP);\
1499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type>\
1501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP<p0##_type> name(p0##_type p0) {\
1502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP<p0##_type>(p0);\
1503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type>\
1505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
150646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
150746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
150846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
150946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P2(name, p0, p1, description)\
1512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type>\
1513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP2 {\
1514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
151846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
151946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan           : p0(gmock_p0), p1(gmock_p1) {}\
152046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
152146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
152346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
152446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
152546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
152646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
153046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
153146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
153246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
153346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
153446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
153546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
153646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
153746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
153846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type>(p0, p1)));\
153946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
154046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
154546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1));\
1546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p1(gmock_p1) {\
1549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
155246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
155346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\
1554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type>\
1556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \
1557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1) {\
1558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\
1559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type>\
1561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
156246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool name##MatcherP2<p0##_type, \
156346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
156446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
156546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
156646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1567dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P3(name, p0, p1, p2, description)\
1569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP3 {\
1571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
157546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
157646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
157746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
157846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
158046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
158146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
158246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
158346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
1587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
158846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
158946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
159046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
159146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
159246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
159346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
159446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
159546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
159646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \
159746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p2)));\
159846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
159946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1603dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
160446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2));\
1605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\
1608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
1611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
161246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
161346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\
1614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1, p2##_type p2) {\
1618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
162246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool name##MatcherP3<p0##_type, p1##_type, \
162346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
162446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
162546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
162646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P4(name, p0, p1, p2, p3, description)\
1629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type>\
1631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP4 {\
1632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1635dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
1636dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
163746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p3##_type gmock_p3)\
163846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\
163946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
164046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1641dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
164246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
164346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
164446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
164546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1646dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1647dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1648dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
1649dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
1650dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
165146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
165246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
165346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
165446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
165546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
165646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
165746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
165846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
165946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, \
166046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p3##_type>(p0, p1, p2, p3)));\
166146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
166246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1663dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
166746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3));\
1668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2(gmock_p2), p3(gmock_p3) {\
1672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
1675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
1676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
167746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
167846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\
1679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type>\
1682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \
1683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3) {\
1685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
1686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p1, p2, p3);\
1687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type>\
1690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
169146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
169246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
169346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
169446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
169546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\
1698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type>\
1700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP5 {\
1701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
1705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
170646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p3##_type gmock_p3, p4##_type gmock_p4)\
1707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
170846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               p4(gmock_p4) {}\
170946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
171046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
171246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
171346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
171446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
171546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
1719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
1720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
1721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4;\
172246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
172346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
172446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
172546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
172646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
172746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
172846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
172946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
173046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
173146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p4##_type>(p0, p1, p2, p3, p4)));\
173246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
173346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
173846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\
1739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3, \
1742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p3(gmock_p3), p4(gmock_p4) {\
1744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
1747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
1748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
1749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p4##_type p4;\
175046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
175146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\
1752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type>\
1755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4) {\
1758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type>(p0, p1, p2, p3, p4);\
1760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type>\
1763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
176446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
176546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
176646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
176746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
176846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\
1771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type>\
1773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP6 {\
1774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
1778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
177946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\
1780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
178146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               p4(gmock_p4), p5(gmock_p5) {}\
178246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
178346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
178546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
178646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
178746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
178846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
1792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
1793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
1794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4;\
1795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p5##_type p5;\
179646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
179746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
179846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
179946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
180046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
180146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
180246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
180346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
180446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
180546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
180646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
180746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
181246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\
1813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\
1818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
1821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
1822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
1823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p4##_type p4;\
1824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p5##_type p5;\
182546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
182646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\
1827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type>\
1830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3, p4##_type p4, p5##_type p5) {\
1833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type>\
1838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
1839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
184046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
184146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
184246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
184346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\
1846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
1848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type>\
1849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP7 {\
1850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
1854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
185646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p6##_type gmock_p6)\
1857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
185846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
185946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
186046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
186246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
186346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
186446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
186546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
1869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
1870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
1871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4;\
1872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p5##_type p5;\
1873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p6##_type p6;\
187446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
187546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
187646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
187746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
187846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
187946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
188046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
188146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
188246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
188346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
188446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p6)));\
188546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
188646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1887dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1888dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1889dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
189146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\
1892dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p6(gmock_p6) {\
1898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1899dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
1901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
1902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
1903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p4##_type p4;\
1904dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p5##_type p5;\
1905dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p6##_type p6;\
190646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
190746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\
1908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
1911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type>\
1912dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p6##_type p6) {\
1916dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
1919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
1921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type>\
1922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
1923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
192446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
192546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
192646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
192746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
1928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\
1930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
1932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type>\
1933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP8 {\
1934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
1935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
1938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
194046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p6##_type gmock_p6, p7##_type gmock_p7)\
1941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
194246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
194346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
194446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
194646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
194746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
194846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
194946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
1950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
1951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
1952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
1953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
1954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
1955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4;\
1956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p5##_type p5;\
1957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p6##_type p6;\
1958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p7##_type p7;\
195946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
196046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
196146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
196246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
196346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
196446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
196546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
196646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
196746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
196846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
196946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p3, p4, p5, p6, p7)));\
197046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
197146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
1973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
1974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
1975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
197646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\
1977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p5##_type gmock_p5, p6##_type gmock_p6, \
1981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p7(gmock_p7) {\
1984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
1985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
1986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
1987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
1988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
1989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p4##_type p4;\
1990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p5##_type p5;\
1991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p6##_type p6;\
1992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p7##_type p7;\
199346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
199446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\
1995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
1996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
1998dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type>\
1999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
2001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
2002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p6##_type p6, p7##_type p7) {\
2003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
2005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p6, p7);\
2006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
2007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type>\
2010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
2011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
201246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p5##_type, p6##_type, \
201346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
201446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
201546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
201646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
2017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\
2019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type, typename p8##_type>\
2022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP9 {\
2023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
2024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
2025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
2026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
2027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
202946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\
2030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
2031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
203246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               p8(gmock_p8) {}\
203346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
203446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
2035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
203646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
203746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
203846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
203946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
2040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
2041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
2042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
2043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
2044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
2045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4;\
2046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p5##_type p5;\
2047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p6##_type p6;\
2048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p7##_type p7;\
2049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p8##_type p8;\
205046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
205146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
205246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
205346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
205446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
205546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
205646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
205746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
205846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
205946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p4##_type, p5##_type, p6##_type, p7##_type, \
206046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\
206146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
206246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
2064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
2065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
2066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
206746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\
2068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
2069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \
2070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p8(gmock_p8) {\
2075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
2076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
2077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
2078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
2079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
2080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p4##_type p4;\
2081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p5##_type p5;\
2082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p6##_type p6;\
2083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p7##_type p7;\
2084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p8##_type p8;\
208546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
208646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\
2087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
2088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2090dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type, typename p8##_type>\
2091dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type, p5##_type, p6##_type, p7##_type, \
2093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
2095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p8##_type p8) {\
2096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
2098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p3, p4, p5, p6, p7, p8);\
2099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
2100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type, typename p8##_type>\
2103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
2104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
210546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p5##_type, p6##_type, p7##_type, \
210646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
210746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
210846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
210946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
2110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\
2112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type, typename p8##_type, \
2115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p9##_type>\
2116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  class name##MatcherP10 {\
2117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter   public:\
2118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
2119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
2120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     public:\
2121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
212446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          p9##_type gmock_p9)\
2125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
2126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
212746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan               p8(gmock_p8), p9(gmock_p9) {}\
212846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual bool MatchAndExplain(\
212946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
2130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      virtual void DescribeTo(::std::ostream* gmock_os) const {\
213146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(false);\
213246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
213346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
213446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        *gmock_os << FormatDescription(true);\
2135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      }\
2136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p0##_type p0;\
2137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p1##_type p1;\
2138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p2##_type p2;\
2139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p3##_type p3;\
2140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4;\
2141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p5##_type p5;\
2142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p6##_type p6;\
2143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p7##_type p7;\
2144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p8##_type p8;\
2145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p9##_type p9;\
214646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     private:\
214746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::internal::string FormatDescription(bool negation) const {\
214846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        const ::testing::internal::string gmock_description = (description);\
214946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        if (!gmock_description.empty())\
215046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          return gmock_description;\
215146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        return ::testing::internal::FormatMatcherDescription(\
215246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            negation, #name, \
215346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
215446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                ::std::tr1::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
215546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
215646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\
215746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      }\
215846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    };\
2160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    template <typename arg_type>\
2161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    operator ::testing::Matcher<arg_type>() const {\
2162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return ::testing::Matcher<arg_type>(\
216346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\
2164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
2165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \
2166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
2169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\
2171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }\
2172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p0##_type p0;\
2173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p1##_type p1;\
2174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p2##_type p2;\
2175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p3##_type p3;\
2176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p4##_type p4;\
2177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p5##_type p5;\
2178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p6##_type p6;\
2179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p7##_type p7;\
2180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p8##_type p8;\
2181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    p9##_type p9;\
218246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan   private:\
218346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\
2184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  };\
2185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type, typename p8##_type, \
2188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p9##_type>\
2189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      p9##_type p9) {\
2194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }\
2198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p3##_type, typename p4##_type, typename p5##_type, \
2200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p6##_type, typename p7##_type, typename p8##_type, \
2201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      typename p9##_type>\
2202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  template <typename arg_type>\
2203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
220446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
220546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
220646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      arg_type arg, \
220746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
220846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          const
2209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
2211