cmake: avoid de-duplication of user's CXXFLAGS
[quassel.git] / 3rdparty / googletest-1.8.1 / googlemock / include / gmock / gmock-generated-function-mockers.h
1 // This file was GENERATED by command:
2 //     pump.py gmock-generated-function-mockers.h.pump
3 // DO NOT EDIT BY HAND!!!
4
5 // Copyright 2007, Google Inc.
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 //
12 //     * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 //     * Redistributions in binary form must reproduce the above
15 // copyright notice, this list of conditions and the following disclaimer
16 // in the documentation and/or other materials provided with the
17 // distribution.
18 //     * Neither the name of Google Inc. nor the names of its
19 // contributors may be used to endorse or promote products derived from
20 // this software without specific prior written permission.
21 //
22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34
35 // Google Mock - a framework for writing C++ mock classes.
36 //
37 // This file implements function mockers of various arities.
38
39 // GOOGLETEST_CM0002 DO NOT DELETE
40
41 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
42 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
43
44 #include "gmock/gmock-spec-builders.h"
45 #include "gmock/internal/gmock-internal-utils.h"
46
47 #if GTEST_HAS_STD_FUNCTION_
48 # include <functional>
49 #endif
50
51 namespace testing {
52 namespace internal {
53
54 template <typename F>
55 class FunctionMockerBase;
56
57 // Note: class FunctionMocker really belongs to the ::testing
58 // namespace.  However if we define it in ::testing, MSVC will
59 // complain when classes in ::testing::internal declare it as a
60 // friend class template.  To workaround this compiler bug, we define
61 // FunctionMocker in ::testing::internal and import it into ::testing.
62 template <typename F>
63 class FunctionMocker;
64
65 template <typename R>
66 class FunctionMocker<R()> : public
67     internal::FunctionMockerBase<R()> {
68  public:
69   typedef R F();
70   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
71
72   MockSpec<F> With() {
73     return MockSpec<F>(this, ::testing::make_tuple());
74   }
75
76   R Invoke() {
77     // Even though gcc and MSVC don't enforce it, 'this->' is required
78     // by the C++ standard [14.6.4] here, as the base class type is
79     // dependent on the template argument (and thus shouldn't be
80     // looked into when resolving InvokeWith).
81     return this->InvokeWith(ArgumentTuple());
82   }
83 };
84
85 template <typename R, typename A1>
86 class FunctionMocker<R(A1)> : public
87     internal::FunctionMockerBase<R(A1)> {
88  public:
89   typedef R F(A1);
90   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
91
92   MockSpec<F> With(const Matcher<A1>& m1) {
93     return MockSpec<F>(this, ::testing::make_tuple(m1));
94   }
95
96   R Invoke(A1 a1) {
97     // Even though gcc and MSVC don't enforce it, 'this->' is required
98     // by the C++ standard [14.6.4] here, as the base class type is
99     // dependent on the template argument (and thus shouldn't be
100     // looked into when resolving InvokeWith).
101     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1)));
102   }
103 };
104
105 template <typename R, typename A1, typename A2>
106 class FunctionMocker<R(A1, A2)> : public
107     internal::FunctionMockerBase<R(A1, A2)> {
108  public:
109   typedef R F(A1, A2);
110   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
111
112   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2) {
113     return MockSpec<F>(this, ::testing::make_tuple(m1, m2));
114   }
115
116   R Invoke(A1 a1, A2 a2) {
117     // Even though gcc and MSVC don't enforce it, 'this->' is required
118     // by the C++ standard [14.6.4] here, as the base class type is
119     // dependent on the template argument (and thus shouldn't be
120     // looked into when resolving InvokeWith).
121     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
122         internal::forward<A2>(a2)));
123   }
124 };
125
126 template <typename R, typename A1, typename A2, typename A3>
127 class FunctionMocker<R(A1, A2, A3)> : public
128     internal::FunctionMockerBase<R(A1, A2, A3)> {
129  public:
130   typedef R F(A1, A2, A3);
131   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
132
133   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
134       const Matcher<A3>& m3) {
135     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3));
136   }
137
138   R Invoke(A1 a1, A2 a2, A3 a3) {
139     // Even though gcc and MSVC don't enforce it, 'this->' is required
140     // by the C++ standard [14.6.4] here, as the base class type is
141     // dependent on the template argument (and thus shouldn't be
142     // looked into when resolving InvokeWith).
143     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
144         internal::forward<A2>(a2), internal::forward<A3>(a3)));
145   }
146 };
147
148 template <typename R, typename A1, typename A2, typename A3, typename A4>
149 class FunctionMocker<R(A1, A2, A3, A4)> : public
150     internal::FunctionMockerBase<R(A1, A2, A3, A4)> {
151  public:
152   typedef R F(A1, A2, A3, A4);
153   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
154
155   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
156       const Matcher<A3>& m3, const Matcher<A4>& m4) {
157     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4));
158   }
159
160   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) {
161     // Even though gcc and MSVC don't enforce it, 'this->' is required
162     // by the C++ standard [14.6.4] here, as the base class type is
163     // dependent on the template argument (and thus shouldn't be
164     // looked into when resolving InvokeWith).
165     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
166         internal::forward<A2>(a2), internal::forward<A3>(a3),
167         internal::forward<A4>(a4)));
168   }
169 };
170
171 template <typename R, typename A1, typename A2, typename A3, typename A4,
172     typename A5>
173 class FunctionMocker<R(A1, A2, A3, A4, A5)> : public
174     internal::FunctionMockerBase<R(A1, A2, A3, A4, A5)> {
175  public:
176   typedef R F(A1, A2, A3, A4, A5);
177   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
178
179   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
180       const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) {
181     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5));
182   }
183
184   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
185     // Even though gcc and MSVC don't enforce it, 'this->' is required
186     // by the C++ standard [14.6.4] here, as the base class type is
187     // dependent on the template argument (and thus shouldn't be
188     // looked into when resolving InvokeWith).
189     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
190         internal::forward<A2>(a2), internal::forward<A3>(a3),
191         internal::forward<A4>(a4), internal::forward<A5>(a5)));
192   }
193 };
194
195 template <typename R, typename A1, typename A2, typename A3, typename A4,
196     typename A5, typename A6>
197 class FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public
198     internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6)> {
199  public:
200   typedef R F(A1, A2, A3, A4, A5, A6);
201   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
202
203   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
204       const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
205       const Matcher<A6>& m6) {
206     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6));
207   }
208
209   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
210     // Even though gcc and MSVC don't enforce it, 'this->' is required
211     // by the C++ standard [14.6.4] here, as the base class type is
212     // dependent on the template argument (and thus shouldn't be
213     // looked into when resolving InvokeWith).
214     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
215         internal::forward<A2>(a2), internal::forward<A3>(a3),
216         internal::forward<A4>(a4), internal::forward<A5>(a5),
217         internal::forward<A6>(a6)));
218   }
219 };
220
221 template <typename R, typename A1, typename A2, typename A3, typename A4,
222     typename A5, typename A6, typename A7>
223 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public
224     internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7)> {
225  public:
226   typedef R F(A1, A2, A3, A4, A5, A6, A7);
227   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
228
229   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
230       const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
231       const Matcher<A6>& m6, const Matcher<A7>& m7) {
232     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7));
233   }
234
235   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
236     // Even though gcc and MSVC don't enforce it, 'this->' is required
237     // by the C++ standard [14.6.4] here, as the base class type is
238     // dependent on the template argument (and thus shouldn't be
239     // looked into when resolving InvokeWith).
240     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
241         internal::forward<A2>(a2), internal::forward<A3>(a3),
242         internal::forward<A4>(a4), internal::forward<A5>(a5),
243         internal::forward<A6>(a6), internal::forward<A7>(a7)));
244   }
245 };
246
247 template <typename R, typename A1, typename A2, typename A3, typename A4,
248     typename A5, typename A6, typename A7, typename A8>
249 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public
250     internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8)> {
251  public:
252   typedef R F(A1, A2, A3, A4, A5, A6, A7, A8);
253   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
254
255   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
256       const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
257       const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) {
258     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,
259         m8));
260   }
261
262   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
263     // Even though gcc and MSVC don't enforce it, 'this->' is required
264     // by the C++ standard [14.6.4] here, as the base class type is
265     // dependent on the template argument (and thus shouldn't be
266     // looked into when resolving InvokeWith).
267     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
268         internal::forward<A2>(a2), internal::forward<A3>(a3),
269         internal::forward<A4>(a4), internal::forward<A5>(a5),
270         internal::forward<A6>(a6), internal::forward<A7>(a7),
271         internal::forward<A8>(a8)));
272   }
273 };
274
275 template <typename R, typename A1, typename A2, typename A3, typename A4,
276     typename A5, typename A6, typename A7, typename A8, typename A9>
277 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public
278     internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
279  public:
280   typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9);
281   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
282
283   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
284       const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
285       const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,
286       const Matcher<A9>& m9) {
287     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,
288         m8, m9));
289   }
290
291   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {
292     // Even though gcc and MSVC don't enforce it, 'this->' is required
293     // by the C++ standard [14.6.4] here, as the base class type is
294     // dependent on the template argument (and thus shouldn't be
295     // looked into when resolving InvokeWith).
296     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
297         internal::forward<A2>(a2), internal::forward<A3>(a3),
298         internal::forward<A4>(a4), internal::forward<A5>(a5),
299         internal::forward<A6>(a6), internal::forward<A7>(a7),
300         internal::forward<A8>(a8), internal::forward<A9>(a9)));
301   }
302 };
303
304 template <typename R, typename A1, typename A2, typename A3, typename A4,
305     typename A5, typename A6, typename A7, typename A8, typename A9,
306     typename A10>
307 class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public
308     internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> {
309  public:
310   typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
311   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
312
313   MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,
314       const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
315       const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,
316       const Matcher<A9>& m9, const Matcher<A10>& m10) {
317     return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,
318         m8, m9, m10));
319   }
320
321   R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9,
322       A10 a10) {
323     // Even though gcc and MSVC don't enforce it, 'this->' is required
324     // by the C++ standard [14.6.4] here, as the base class type is
325     // dependent on the template argument (and thus shouldn't be
326     // looked into when resolving InvokeWith).
327     return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),
328         internal::forward<A2>(a2), internal::forward<A3>(a3),
329         internal::forward<A4>(a4), internal::forward<A5>(a5),
330         internal::forward<A6>(a6), internal::forward<A7>(a7),
331         internal::forward<A8>(a8), internal::forward<A9>(a9),
332         internal::forward<A10>(a10)));
333   }
334 };
335
336 // Removes the given pointer; this is a helper for the expectation setter method
337 // for parameterless matchers.
338 //
339 // We want to make sure that the user cannot set a parameterless expectation on
340 // overloaded methods, including methods which are overloaded on const. Example:
341 //
342 //   class MockClass {
343 //     MOCK_METHOD0(GetName, string&());
344 //     MOCK_CONST_METHOD0(GetName, const string&());
345 //   };
346 //
347 //   TEST() {
348 //     // This should be an error, as it's not clear which overload is expected.
349 //     EXPECT_CALL(mock, GetName).WillOnce(ReturnRef(value));
350 //   }
351 //
352 // Here are the generated expectation-setter methods:
353 //
354 //   class MockClass {
355 //     // Overload 1
356 //     MockSpec<string&()> gmock_GetName() { ... }
357 //     // Overload 2. Declared const so that the compiler will generate an
358 //     // error when trying to resolve between this and overload 4 in
359 //     // 'gmock_GetName(WithoutMatchers(), nullptr)'.
360 //     MockSpec<string&()> gmock_GetName(
361 //         const WithoutMatchers&, const Function<string&()>*) const {
362 //       // Removes const from this, calls overload 1
363 //       return AdjustConstness_(this)->gmock_GetName();
364 //     }
365 //
366 //     // Overload 3
367 //     const string& gmock_GetName() const { ... }
368 //     // Overload 4
369 //     MockSpec<const string&()> gmock_GetName(
370 //         const WithoutMatchers&, const Function<const string&()>*) const {
371 //       // Does not remove const, calls overload 3
372 //       return AdjustConstness_const(this)->gmock_GetName();
373 //     }
374 //   }
375 //
376 template <typename MockType>
377 const MockType* AdjustConstness_const(const MockType* mock) {
378   return mock;
379 }
380
381 // Removes const from and returns the given pointer; this is a helper for the
382 // expectation setter method for parameterless matchers.
383 template <typename MockType>
384 MockType* AdjustConstness_(const MockType* mock) {
385   return const_cast<MockType*>(mock);
386 }
387
388 }  // namespace internal
389
390 // The style guide prohibits "using" statements in a namespace scope
391 // inside a header file.  However, the FunctionMocker class template
392 // is meant to be defined in the ::testing namespace.  The following
393 // line is just a trick for working around a bug in MSVC 8.0, which
394 // cannot handle it if we define FunctionMocker in ::testing.
395 using internal::FunctionMocker;
396
397 // GMOCK_RESULT_(tn, F) expands to the result type of function type F.
398 // We define this as a variadic macro in case F contains unprotected
399 // commas (the same reason that we use variadic macros in other places
400 // in this file).
401 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
402 #define GMOCK_RESULT_(tn, ...) \
403     tn ::testing::internal::Function<__VA_ARGS__>::Result
404
405 // The type of argument N of the given function type.
406 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
407 #define GMOCK_ARG_(tn, N, ...) \
408     tn ::testing::internal::Function<__VA_ARGS__>::Argument##N
409
410 // The matcher type for argument N of the given function type.
411 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
412 #define GMOCK_MATCHER_(tn, N, ...) \
413     const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&
414
415 // The variable for mocking the given method.
416 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
417 #define GMOCK_MOCKER_(arity, constness, Method) \
418     GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
419
420 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
421 #define GMOCK_METHOD0_(tn, constness, ct, Method, ...)                       \
422   GMOCK_RESULT_(tn, __VA_ARGS__) ct Method() constness {                     \
423     GTEST_COMPILE_ASSERT_(                                                   \
424         (::testing::tuple_size<tn ::testing::internal::Function<             \
425              __VA_ARGS__>::ArgumentTuple>::value == 0),                      \
426         this_method_does_not_take_0_arguments);                              \
427     GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method);      \
428     return GMOCK_MOCKER_(0, constness, Method).Invoke();                     \
429   }                                                                          \
430   ::testing::MockSpec<__VA_ARGS__> gmock_##Method() constness {              \
431     GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this);                 \
432     return GMOCK_MOCKER_(0, constness, Method).With();                       \
433   }                                                                          \
434   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                           \
435       const ::testing::internal::WithoutMatchers&,                           \
436       constness ::testing::internal::Function<__VA_ARGS__>*) const {         \
437     return ::testing::internal::AdjustConstness_##constness(this)            \
438         ->gmock_##Method();                                                  \
439   }                                                                          \
440   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \
441                                                                Method)
442
443 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
444 #define GMOCK_METHOD1_(tn, constness, ct, Method, ...)                        \
445   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
446   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness {              \
447     GTEST_COMPILE_ASSERT_(                                                    \
448         (::testing::tuple_size<tn ::testing::internal::Function<              \
449              __VA_ARGS__>::ArgumentTuple>::value == 1),                       \
450         this_method_does_not_take_1_argument);                                \
451     GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method);       \
452     return GMOCK_MOCKER_(1, constness, Method)                                \
453         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
454             gmock_a1));                                                       \
455   }                                                                           \
456   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
457       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness {                \
458     GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this);                  \
459     return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1);                \
460   }                                                                           \
461   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
462       const ::testing::internal::WithoutMatchers&,                            \
463       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
464     return ::testing::internal::AdjustConstness_##constness(this)             \
465         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>());     \
466   }                                                                           \
467   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness,  \
468                                                                Method)
469
470 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
471 #define GMOCK_METHOD2_(tn, constness, ct, Method, ...)                        \
472   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
473   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
474             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness {              \
475     GTEST_COMPILE_ASSERT_(                                                    \
476         (::testing::tuple_size<tn ::testing::internal::Function<              \
477              __VA_ARGS__>::ArgumentTuple>::value == 2),                       \
478         this_method_does_not_take_2_arguments);                               \
479     GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method);       \
480     return GMOCK_MOCKER_(2, constness, Method)                                \
481         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
482                     gmock_a1),                                                \
483                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
484                     gmock_a2));                                               \
485   }                                                                           \
486   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
487       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
488       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness {                \
489     GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this);                  \
490     return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2);      \
491   }                                                                           \
492   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
493       const ::testing::internal::WithoutMatchers&,                            \
494       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
495     return ::testing::internal::AdjustConstness_##constness(this)             \
496         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
497                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>());     \
498   }                                                                           \
499   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness,  \
500                                                                Method)
501
502 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
503 #define GMOCK_METHOD3_(tn, constness, ct, Method, ...)                        \
504   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
505   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
506             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
507             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness {              \
508     GTEST_COMPILE_ASSERT_(                                                    \
509         (::testing::tuple_size<tn ::testing::internal::Function<              \
510              __VA_ARGS__>::ArgumentTuple>::value == 3),                       \
511         this_method_does_not_take_3_arguments);                               \
512     GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method);       \
513     return GMOCK_MOCKER_(3, constness, Method)                                \
514         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
515                     gmock_a1),                                                \
516                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
517                     gmock_a2),                                                \
518                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
519                     gmock_a3));                                               \
520   }                                                                           \
521   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
522       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
523       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
524       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness {                \
525     GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this);                  \
526     return GMOCK_MOCKER_(3, constness, Method)                                \
527         .With(gmock_a1, gmock_a2, gmock_a3);                                  \
528   }                                                                           \
529   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
530       const ::testing::internal::WithoutMatchers&,                            \
531       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
532     return ::testing::internal::AdjustConstness_##constness(this)             \
533         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
534                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
535                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>());     \
536   }                                                                           \
537   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness,  \
538                                                                Method)
539
540 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
541 #define GMOCK_METHOD4_(tn, constness, ct, Method, ...)                        \
542   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
543   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
544             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
545             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \
546             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness {              \
547     GTEST_COMPILE_ASSERT_(                                                    \
548         (::testing::tuple_size<tn ::testing::internal::Function<              \
549              __VA_ARGS__>::ArgumentTuple>::value == 4),                       \
550         this_method_does_not_take_4_arguments);                               \
551     GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method);       \
552     return GMOCK_MOCKER_(4, constness, Method)                                \
553         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
554                     gmock_a1),                                                \
555                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
556                     gmock_a2),                                                \
557                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
558                     gmock_a3),                                                \
559                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
560                     gmock_a4));                                               \
561   }                                                                           \
562   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
563       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
564       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
565       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \
566       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness {                \
567     GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this);                  \
568     return GMOCK_MOCKER_(4, constness, Method)                                \
569         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4);                        \
570   }                                                                           \
571   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
572       const ::testing::internal::WithoutMatchers&,                            \
573       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
574     return ::testing::internal::AdjustConstness_##constness(this)             \
575         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
576                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
577                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \
578                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>());     \
579   }                                                                           \
580   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness,  \
581                                                                Method)
582
583 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
584 #define GMOCK_METHOD5_(tn, constness, ct, Method, ...)                        \
585   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
586   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
587             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
588             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \
589             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \
590             GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness {              \
591     GTEST_COMPILE_ASSERT_(                                                    \
592         (::testing::tuple_size<tn ::testing::internal::Function<              \
593              __VA_ARGS__>::ArgumentTuple>::value == 5),                       \
594         this_method_does_not_take_5_arguments);                               \
595     GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method);       \
596     return GMOCK_MOCKER_(5, constness, Method)                                \
597         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
598                     gmock_a1),                                                \
599                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
600                     gmock_a2),                                                \
601                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
602                     gmock_a3),                                                \
603                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
604                     gmock_a4),                                                \
605                 ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
606                     gmock_a5));                                               \
607   }                                                                           \
608   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
609       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
610       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
611       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \
612       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \
613       GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness {                \
614     GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this);                  \
615     return GMOCK_MOCKER_(5, constness, Method)                                \
616         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5);              \
617   }                                                                           \
618   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
619       const ::testing::internal::WithoutMatchers&,                            \
620       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
621     return ::testing::internal::AdjustConstness_##constness(this)             \
622         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
623                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
624                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \
625                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \
626                          ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>());     \
627   }                                                                           \
628   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness,  \
629                                                                Method)
630
631 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
632 #define GMOCK_METHOD6_(tn, constness, ct, Method, ...)                        \
633   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
634   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
635             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
636             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \
637             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \
638             GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \
639             GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness {              \
640     GTEST_COMPILE_ASSERT_(                                                    \
641         (::testing::tuple_size<tn ::testing::internal::Function<              \
642              __VA_ARGS__>::ArgumentTuple>::value == 6),                       \
643         this_method_does_not_take_6_arguments);                               \
644     GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method);       \
645     return GMOCK_MOCKER_(6, constness, Method)                                \
646         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
647                     gmock_a1),                                                \
648                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
649                     gmock_a2),                                                \
650                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
651                     gmock_a3),                                                \
652                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
653                     gmock_a4),                                                \
654                 ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
655                     gmock_a5),                                                \
656                 ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
657                     gmock_a6));                                               \
658   }                                                                           \
659   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
660       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
661       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
662       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \
663       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \
664       GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \
665       GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness {                \
666     GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this);                  \
667     return GMOCK_MOCKER_(6, constness, Method)                                \
668         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6);    \
669   }                                                                           \
670   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
671       const ::testing::internal::WithoutMatchers&,                            \
672       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
673     return ::testing::internal::AdjustConstness_##constness(this)             \
674         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
675                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
676                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \
677                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \
678                          ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \
679                          ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>());     \
680   }                                                                           \
681   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness,  \
682                                                                Method)
683
684 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
685 #define GMOCK_METHOD7_(tn, constness, ct, Method, ...)                        \
686   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
687   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
688             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
689             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \
690             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \
691             GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \
692             GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \
693             GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness {              \
694     GTEST_COMPILE_ASSERT_(                                                    \
695         (::testing::tuple_size<tn ::testing::internal::Function<              \
696              __VA_ARGS__>::ArgumentTuple>::value == 7),                       \
697         this_method_does_not_take_7_arguments);                               \
698     GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method);       \
699     return GMOCK_MOCKER_(7, constness, Method)                                \
700         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
701                     gmock_a1),                                                \
702                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
703                     gmock_a2),                                                \
704                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
705                     gmock_a3),                                                \
706                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
707                     gmock_a4),                                                \
708                 ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
709                     gmock_a5),                                                \
710                 ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
711                     gmock_a6),                                                \
712                 ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
713                     gmock_a7));                                               \
714   }                                                                           \
715   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
716       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
717       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
718       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \
719       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \
720       GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \
721       GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \
722       GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness {                \
723     GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this);                  \
724     return GMOCK_MOCKER_(7, constness, Method)                                \
725         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \
726               gmock_a7);                                                      \
727   }                                                                           \
728   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
729       const ::testing::internal::WithoutMatchers&,                            \
730       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
731     return ::testing::internal::AdjustConstness_##constness(this)             \
732         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
733                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
734                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \
735                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \
736                          ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \
737                          ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \
738                          ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>());     \
739   }                                                                           \
740   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness,  \
741                                                                Method)
742
743 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
744 #define GMOCK_METHOD8_(tn, constness, ct, Method, ...)                        \
745   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
746   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
747             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
748             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \
749             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \
750             GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \
751             GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \
752             GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                          \
753             GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness {              \
754     GTEST_COMPILE_ASSERT_(                                                    \
755         (::testing::tuple_size<tn ::testing::internal::Function<              \
756              __VA_ARGS__>::ArgumentTuple>::value == 8),                       \
757         this_method_does_not_take_8_arguments);                               \
758     GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method);       \
759     return GMOCK_MOCKER_(8, constness, Method)                                \
760         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
761                     gmock_a1),                                                \
762                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
763                     gmock_a2),                                                \
764                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
765                     gmock_a3),                                                \
766                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
767                     gmock_a4),                                                \
768                 ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
769                     gmock_a5),                                                \
770                 ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
771                     gmock_a6),                                                \
772                 ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
773                     gmock_a7),                                                \
774                 ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \
775                     gmock_a8));                                               \
776   }                                                                           \
777   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
778       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
779       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
780       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \
781       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \
782       GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \
783       GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \
784       GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                            \
785       GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness {                \
786     GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this);                  \
787     return GMOCK_MOCKER_(8, constness, Method)                                \
788         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \
789               gmock_a7, gmock_a8);                                            \
790   }                                                                           \
791   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
792       const ::testing::internal::WithoutMatchers&,                            \
793       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
794     return ::testing::internal::AdjustConstness_##constness(this)             \
795         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
796                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
797                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \
798                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \
799                          ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \
800                          ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \
801                          ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),      \
802                          ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>());     \
803   }                                                                           \
804   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness,  \
805                                                                Method)
806
807 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
808 #define GMOCK_METHOD9_(tn, constness, ct, Method, ...)                        \
809   GMOCK_RESULT_(tn, __VA_ARGS__)                                              \
810   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \
811             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \
812             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \
813             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \
814             GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \
815             GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \
816             GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                          \
817             GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8,                          \
818             GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness {              \
819     GTEST_COMPILE_ASSERT_(                                                    \
820         (::testing::tuple_size<tn ::testing::internal::Function<              \
821              __VA_ARGS__>::ArgumentTuple>::value == 9),                       \
822         this_method_does_not_take_9_arguments);                               \
823     GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method);       \
824     return GMOCK_MOCKER_(9, constness, Method)                                \
825         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \
826                     gmock_a1),                                                \
827                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \
828                     gmock_a2),                                                \
829                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \
830                     gmock_a3),                                                \
831                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \
832                     gmock_a4),                                                \
833                 ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \
834                     gmock_a5),                                                \
835                 ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \
836                     gmock_a6),                                                \
837                 ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \
838                     gmock_a7),                                                \
839                 ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \
840                     gmock_a8),                                                \
841                 ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \
842                     gmock_a9));                                               \
843   }                                                                           \
844   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
845       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \
846       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \
847       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \
848       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \
849       GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \
850       GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \
851       GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                            \
852       GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8,                            \
853       GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness {                \
854     GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this);                  \
855     return GMOCK_MOCKER_(9, constness, Method)                                \
856         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \
857               gmock_a7, gmock_a8, gmock_a9);                                  \
858   }                                                                           \
859   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \
860       const ::testing::internal::WithoutMatchers&,                            \
861       constness ::testing::internal::Function<__VA_ARGS__>*) const {          \
862     return ::testing::internal::AdjustConstness_##constness(this)             \
863         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \
864                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \
865                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \
866                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \
867                          ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \
868                          ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \
869                          ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),      \
870                          ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(),      \
871                          ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>());     \
872   }                                                                           \
873   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness,  \
874                                                                Method)
875
876 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
877 #define GMOCK_METHOD10_(tn, constness, ct, Method, ...)                        \
878   GMOCK_RESULT_(tn, __VA_ARGS__)                                               \
879   ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                           \
880             GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                           \
881             GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                           \
882             GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                           \
883             GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                           \
884             GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                           \
885             GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                           \
886             GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8,                           \
887             GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9,                           \
888             GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness {             \
889     GTEST_COMPILE_ASSERT_(                                                     \
890         (::testing::tuple_size<tn ::testing::internal::Function<               \
891              __VA_ARGS__>::ArgumentTuple>::value == 10),                       \
892         this_method_does_not_take_10_arguments);                               \
893     GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method);       \
894     return GMOCK_MOCKER_(10, constness, Method)                                \
895         .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(  \
896                     gmock_a1),                                                 \
897                 ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(  \
898                     gmock_a2),                                                 \
899                 ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(  \
900                     gmock_a3),                                                 \
901                 ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(  \
902                     gmock_a4),                                                 \
903                 ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(  \
904                     gmock_a5),                                                 \
905                 ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(  \
906                     gmock_a6),                                                 \
907                 ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(  \
908                     gmock_a7),                                                 \
909                 ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(  \
910                     gmock_a8),                                                 \
911                 ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(  \
912                     gmock_a9),                                                 \
913                 ::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>( \
914                     gmock_a10));                                               \
915   }                                                                            \
916   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                             \
917       GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                             \
918       GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                             \
919       GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                             \
920       GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                             \
921       GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                             \
922       GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                             \
923       GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                             \
924       GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8,                             \
925       GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9,                             \
926       GMOCK_MATCHER_(tn, 10, __VA_ARGS__) gmock_a10) constness {               \
927     GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this);                  \
928     return GMOCK_MOCKER_(10, constness, Method)                                \
929         .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,      \
930               gmock_a7, gmock_a8, gmock_a9, gmock_a10);                        \
931   }                                                                            \
932   ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                             \
933       const ::testing::internal::WithoutMatchers&,                             \
934       constness ::testing::internal::Function<__VA_ARGS__>*) const {           \
935     return ::testing::internal::AdjustConstness_##constness(this)              \
936         ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),       \
937                          ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),       \
938                          ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),       \
939                          ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),       \
940                          ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),       \
941                          ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),       \
942                          ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),       \
943                          ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(),       \
944                          ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(),       \
945                          ::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>());     \
946   }                                                                            \
947   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness,  \
948                                                                Method)
949
950 #define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)
951 #define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)
952 #define MOCK_METHOD2(m, ...) GMOCK_METHOD2_(, , , m, __VA_ARGS__)
953 #define MOCK_METHOD3(m, ...) GMOCK_METHOD3_(, , , m, __VA_ARGS__)
954 #define MOCK_METHOD4(m, ...) GMOCK_METHOD4_(, , , m, __VA_ARGS__)
955 #define MOCK_METHOD5(m, ...) GMOCK_METHOD5_(, , , m, __VA_ARGS__)
956 #define MOCK_METHOD6(m, ...) GMOCK_METHOD6_(, , , m, __VA_ARGS__)
957 #define MOCK_METHOD7(m, ...) GMOCK_METHOD7_(, , , m, __VA_ARGS__)
958 #define MOCK_METHOD8(m, ...) GMOCK_METHOD8_(, , , m, __VA_ARGS__)
959 #define MOCK_METHOD9(m, ...) GMOCK_METHOD9_(, , , m, __VA_ARGS__)
960 #define MOCK_METHOD10(m, ...) GMOCK_METHOD10_(, , , m, __VA_ARGS__)
961
962 #define MOCK_CONST_METHOD0(m, ...) GMOCK_METHOD0_(, const, , m, __VA_ARGS__)
963 #define MOCK_CONST_METHOD1(m, ...) GMOCK_METHOD1_(, const, , m, __VA_ARGS__)
964 #define MOCK_CONST_METHOD2(m, ...) GMOCK_METHOD2_(, const, , m, __VA_ARGS__)
965 #define MOCK_CONST_METHOD3(m, ...) GMOCK_METHOD3_(, const, , m, __VA_ARGS__)
966 #define MOCK_CONST_METHOD4(m, ...) GMOCK_METHOD4_(, const, , m, __VA_ARGS__)
967 #define MOCK_CONST_METHOD5(m, ...) GMOCK_METHOD5_(, const, , m, __VA_ARGS__)
968 #define MOCK_CONST_METHOD6(m, ...) GMOCK_METHOD6_(, const, , m, __VA_ARGS__)
969 #define MOCK_CONST_METHOD7(m, ...) GMOCK_METHOD7_(, const, , m, __VA_ARGS__)
970 #define MOCK_CONST_METHOD8(m, ...) GMOCK_METHOD8_(, const, , m, __VA_ARGS__)
971 #define MOCK_CONST_METHOD9(m, ...) GMOCK_METHOD9_(, const, , m, __VA_ARGS__)
972 #define MOCK_CONST_METHOD10(m, ...) GMOCK_METHOD10_(, const, , m, __VA_ARGS__)
973
974 #define MOCK_METHOD0_T(m, ...) GMOCK_METHOD0_(typename, , , m, __VA_ARGS__)
975 #define MOCK_METHOD1_T(m, ...) GMOCK_METHOD1_(typename, , , m, __VA_ARGS__)
976 #define MOCK_METHOD2_T(m, ...) GMOCK_METHOD2_(typename, , , m, __VA_ARGS__)
977 #define MOCK_METHOD3_T(m, ...) GMOCK_METHOD3_(typename, , , m, __VA_ARGS__)
978 #define MOCK_METHOD4_T(m, ...) GMOCK_METHOD4_(typename, , , m, __VA_ARGS__)
979 #define MOCK_METHOD5_T(m, ...) GMOCK_METHOD5_(typename, , , m, __VA_ARGS__)
980 #define MOCK_METHOD6_T(m, ...) GMOCK_METHOD6_(typename, , , m, __VA_ARGS__)
981 #define MOCK_METHOD7_T(m, ...) GMOCK_METHOD7_(typename, , , m, __VA_ARGS__)
982 #define MOCK_METHOD8_T(m, ...) GMOCK_METHOD8_(typename, , , m, __VA_ARGS__)
983 #define MOCK_METHOD9_T(m, ...) GMOCK_METHOD9_(typename, , , m, __VA_ARGS__)
984 #define MOCK_METHOD10_T(m, ...) GMOCK_METHOD10_(typename, , , m, __VA_ARGS__)
985
986 #define MOCK_CONST_METHOD0_T(m, ...) \
987     GMOCK_METHOD0_(typename, const, , m, __VA_ARGS__)
988 #define MOCK_CONST_METHOD1_T(m, ...) \
989     GMOCK_METHOD1_(typename, const, , m, __VA_ARGS__)
990 #define MOCK_CONST_METHOD2_T(m, ...) \
991     GMOCK_METHOD2_(typename, const, , m, __VA_ARGS__)
992 #define MOCK_CONST_METHOD3_T(m, ...) \
993     GMOCK_METHOD3_(typename, const, , m, __VA_ARGS__)
994 #define MOCK_CONST_METHOD4_T(m, ...) \
995     GMOCK_METHOD4_(typename, const, , m, __VA_ARGS__)
996 #define MOCK_CONST_METHOD5_T(m, ...) \
997     GMOCK_METHOD5_(typename, const, , m, __VA_ARGS__)
998 #define MOCK_CONST_METHOD6_T(m, ...) \
999     GMOCK_METHOD6_(typename, const, , m, __VA_ARGS__)
1000 #define MOCK_CONST_METHOD7_T(m, ...) \
1001     GMOCK_METHOD7_(typename, const, , m, __VA_ARGS__)
1002 #define MOCK_CONST_METHOD8_T(m, ...) \
1003     GMOCK_METHOD8_(typename, const, , m, __VA_ARGS__)
1004 #define MOCK_CONST_METHOD9_T(m, ...) \
1005     GMOCK_METHOD9_(typename, const, , m, __VA_ARGS__)
1006 #define MOCK_CONST_METHOD10_T(m, ...) \
1007     GMOCK_METHOD10_(typename, const, , m, __VA_ARGS__)
1008
1009 #define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \
1010     GMOCK_METHOD0_(, , ct, m, __VA_ARGS__)
1011 #define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \
1012     GMOCK_METHOD1_(, , ct, m, __VA_ARGS__)
1013 #define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \
1014     GMOCK_METHOD2_(, , ct, m, __VA_ARGS__)
1015 #define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \
1016     GMOCK_METHOD3_(, , ct, m, __VA_ARGS__)
1017 #define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \
1018     GMOCK_METHOD4_(, , ct, m, __VA_ARGS__)
1019 #define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \
1020     GMOCK_METHOD5_(, , ct, m, __VA_ARGS__)
1021 #define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \
1022     GMOCK_METHOD6_(, , ct, m, __VA_ARGS__)
1023 #define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \
1024     GMOCK_METHOD7_(, , ct, m, __VA_ARGS__)
1025 #define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \
1026     GMOCK_METHOD8_(, , ct, m, __VA_ARGS__)
1027 #define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \
1028     GMOCK_METHOD9_(, , ct, m, __VA_ARGS__)
1029 #define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \
1030     GMOCK_METHOD10_(, , ct, m, __VA_ARGS__)
1031
1032 #define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \
1033     GMOCK_METHOD0_(, const, ct, m, __VA_ARGS__)
1034 #define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \
1035     GMOCK_METHOD1_(, const, ct, m, __VA_ARGS__)
1036 #define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \
1037     GMOCK_METHOD2_(, const, ct, m, __VA_ARGS__)
1038 #define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \
1039     GMOCK_METHOD3_(, const, ct, m, __VA_ARGS__)
1040 #define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \
1041     GMOCK_METHOD4_(, const, ct, m, __VA_ARGS__)
1042 #define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \
1043     GMOCK_METHOD5_(, const, ct, m, __VA_ARGS__)
1044 #define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \
1045     GMOCK_METHOD6_(, const, ct, m, __VA_ARGS__)
1046 #define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \
1047     GMOCK_METHOD7_(, const, ct, m, __VA_ARGS__)
1048 #define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \
1049     GMOCK_METHOD8_(, const, ct, m, __VA_ARGS__)
1050 #define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \
1051     GMOCK_METHOD9_(, const, ct, m, __VA_ARGS__)
1052 #define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \
1053     GMOCK_METHOD10_(, const, ct, m, __VA_ARGS__)
1054
1055 #define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \
1056     GMOCK_METHOD0_(typename, , ct, m, __VA_ARGS__)
1057 #define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \
1058     GMOCK_METHOD1_(typename, , ct, m, __VA_ARGS__)
1059 #define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \
1060     GMOCK_METHOD2_(typename, , ct, m, __VA_ARGS__)
1061 #define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \
1062     GMOCK_METHOD3_(typename, , ct, m, __VA_ARGS__)
1063 #define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \
1064     GMOCK_METHOD4_(typename, , ct, m, __VA_ARGS__)
1065 #define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \
1066     GMOCK_METHOD5_(typename, , ct, m, __VA_ARGS__)
1067 #define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \
1068     GMOCK_METHOD6_(typename, , ct, m, __VA_ARGS__)
1069 #define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \
1070     GMOCK_METHOD7_(typename, , ct, m, __VA_ARGS__)
1071 #define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \
1072     GMOCK_METHOD8_(typename, , ct, m, __VA_ARGS__)
1073 #define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \
1074     GMOCK_METHOD9_(typename, , ct, m, __VA_ARGS__)
1075 #define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \
1076     GMOCK_METHOD10_(typename, , ct, m, __VA_ARGS__)
1077
1078 #define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \
1079     GMOCK_METHOD0_(typename, const, ct, m, __VA_ARGS__)
1080 #define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \
1081     GMOCK_METHOD1_(typename, const, ct, m, __VA_ARGS__)
1082 #define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \
1083     GMOCK_METHOD2_(typename, const, ct, m, __VA_ARGS__)
1084 #define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \
1085     GMOCK_METHOD3_(typename, const, ct, m, __VA_ARGS__)
1086 #define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \
1087     GMOCK_METHOD4_(typename, const, ct, m, __VA_ARGS__)
1088 #define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \
1089     GMOCK_METHOD5_(typename, const, ct, m, __VA_ARGS__)
1090 #define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \
1091     GMOCK_METHOD6_(typename, const, ct, m, __VA_ARGS__)
1092 #define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \
1093     GMOCK_METHOD7_(typename, const, ct, m, __VA_ARGS__)
1094 #define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \
1095     GMOCK_METHOD8_(typename, const, ct, m, __VA_ARGS__)
1096 #define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \
1097     GMOCK_METHOD9_(typename, const, ct, m, __VA_ARGS__)
1098 #define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \
1099     GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__)
1100
1101 // A MockFunction<F> class has one mock method whose type is F.  It is
1102 // useful when you just want your test code to emit some messages and
1103 // have Google Mock verify the right messages are sent (and perhaps at
1104 // the right times).  For example, if you are exercising code:
1105 //
1106 //   Foo(1);
1107 //   Foo(2);
1108 //   Foo(3);
1109 //
1110 // and want to verify that Foo(1) and Foo(3) both invoke
1111 // mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:
1112 //
1113 // TEST(FooTest, InvokesBarCorrectly) {
1114 //   MyMock mock;
1115 //   MockFunction<void(string check_point_name)> check;
1116 //   {
1117 //     InSequence s;
1118 //
1119 //     EXPECT_CALL(mock, Bar("a"));
1120 //     EXPECT_CALL(check, Call("1"));
1121 //     EXPECT_CALL(check, Call("2"));
1122 //     EXPECT_CALL(mock, Bar("a"));
1123 //   }
1124 //   Foo(1);
1125 //   check.Call("1");
1126 //   Foo(2);
1127 //   check.Call("2");
1128 //   Foo(3);
1129 // }
1130 //
1131 // The expectation spec says that the first Bar("a") must happen
1132 // before check point "1", the second Bar("a") must happen after check
1133 // point "2", and nothing should happen between the two check
1134 // points. The explicit check points make it easy to tell which
1135 // Bar("a") is called by which call to Foo().
1136 //
1137 // MockFunction<F> can also be used to exercise code that accepts
1138 // std::function<F> callbacks. To do so, use AsStdFunction() method
1139 // to create std::function proxy forwarding to original object's Call.
1140 // Example:
1141 //
1142 // TEST(FooTest, RunsCallbackWithBarArgument) {
1143 //   MockFunction<int(string)> callback;
1144 //   EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));
1145 //   Foo(callback.AsStdFunction());
1146 // }
1147 template <typename F>
1148 class MockFunction;
1149
1150 template <typename R>
1151 class MockFunction<R()> {
1152  public:
1153   MockFunction() {}
1154
1155   MOCK_METHOD0_T(Call, R());
1156
1157 #if GTEST_HAS_STD_FUNCTION_
1158   ::std::function<R()> AsStdFunction() {
1159     return [this]() -> R {
1160       return this->Call();
1161     };
1162   }
1163 #endif  // GTEST_HAS_STD_FUNCTION_
1164
1165  private:
1166   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1167 };
1168
1169 template <typename R, typename A0>
1170 class MockFunction<R(A0)> {
1171  public:
1172   MockFunction() {}
1173
1174   MOCK_METHOD1_T(Call, R(A0));
1175
1176 #if GTEST_HAS_STD_FUNCTION_
1177   ::std::function<R(A0)> AsStdFunction() {
1178     return [this](A0 a0) -> R {
1179       return this->Call(::std::move(a0));
1180     };
1181   }
1182 #endif  // GTEST_HAS_STD_FUNCTION_
1183
1184  private:
1185   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1186 };
1187
1188 template <typename R, typename A0, typename A1>
1189 class MockFunction<R(A0, A1)> {
1190  public:
1191   MockFunction() {}
1192
1193   MOCK_METHOD2_T(Call, R(A0, A1));
1194
1195 #if GTEST_HAS_STD_FUNCTION_
1196   ::std::function<R(A0, A1)> AsStdFunction() {
1197     return [this](A0 a0, A1 a1) -> R {
1198       return this->Call(::std::move(a0), ::std::move(a1));
1199     };
1200   }
1201 #endif  // GTEST_HAS_STD_FUNCTION_
1202
1203  private:
1204   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1205 };
1206
1207 template <typename R, typename A0, typename A1, typename A2>
1208 class MockFunction<R(A0, A1, A2)> {
1209  public:
1210   MockFunction() {}
1211
1212   MOCK_METHOD3_T(Call, R(A0, A1, A2));
1213
1214 #if GTEST_HAS_STD_FUNCTION_
1215   ::std::function<R(A0, A1, A2)> AsStdFunction() {
1216     return [this](A0 a0, A1 a1, A2 a2) -> R {
1217       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2));
1218     };
1219   }
1220 #endif  // GTEST_HAS_STD_FUNCTION_
1221
1222  private:
1223   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1224 };
1225
1226 template <typename R, typename A0, typename A1, typename A2, typename A3>
1227 class MockFunction<R(A0, A1, A2, A3)> {
1228  public:
1229   MockFunction() {}
1230
1231   MOCK_METHOD4_T(Call, R(A0, A1, A2, A3));
1232
1233 #if GTEST_HAS_STD_FUNCTION_
1234   ::std::function<R(A0, A1, A2, A3)> AsStdFunction() {
1235     return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R {
1236       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1237           ::std::move(a3));
1238     };
1239   }
1240 #endif  // GTEST_HAS_STD_FUNCTION_
1241
1242  private:
1243   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1244 };
1245
1246 template <typename R, typename A0, typename A1, typename A2, typename A3,
1247     typename A4>
1248 class MockFunction<R(A0, A1, A2, A3, A4)> {
1249  public:
1250   MockFunction() {}
1251
1252   MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4));
1253
1254 #if GTEST_HAS_STD_FUNCTION_
1255   ::std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() {
1256     return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R {
1257       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1258           ::std::move(a3), ::std::move(a4));
1259     };
1260   }
1261 #endif  // GTEST_HAS_STD_FUNCTION_
1262
1263  private:
1264   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1265 };
1266
1267 template <typename R, typename A0, typename A1, typename A2, typename A3,
1268     typename A4, typename A5>
1269 class MockFunction<R(A0, A1, A2, A3, A4, A5)> {
1270  public:
1271   MockFunction() {}
1272
1273   MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5));
1274
1275 #if GTEST_HAS_STD_FUNCTION_
1276   ::std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() {
1277     return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R {
1278       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1279           ::std::move(a3), ::std::move(a4), ::std::move(a5));
1280     };
1281   }
1282 #endif  // GTEST_HAS_STD_FUNCTION_
1283
1284  private:
1285   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1286 };
1287
1288 template <typename R, typename A0, typename A1, typename A2, typename A3,
1289     typename A4, typename A5, typename A6>
1290 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> {
1291  public:
1292   MockFunction() {}
1293
1294   MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6));
1295
1296 #if GTEST_HAS_STD_FUNCTION_
1297   ::std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() {
1298     return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R {
1299       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1300           ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6));
1301     };
1302   }
1303 #endif  // GTEST_HAS_STD_FUNCTION_
1304
1305  private:
1306   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1307 };
1308
1309 template <typename R, typename A0, typename A1, typename A2, typename A3,
1310     typename A4, typename A5, typename A6, typename A7>
1311 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> {
1312  public:
1313   MockFunction() {}
1314
1315   MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7));
1316
1317 #if GTEST_HAS_STD_FUNCTION_
1318   ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() {
1319     return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R {
1320       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1321           ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),
1322           ::std::move(a7));
1323     };
1324   }
1325 #endif  // GTEST_HAS_STD_FUNCTION_
1326
1327  private:
1328   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1329 };
1330
1331 template <typename R, typename A0, typename A1, typename A2, typename A3,
1332     typename A4, typename A5, typename A6, typename A7, typename A8>
1333 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> {
1334  public:
1335   MockFunction() {}
1336
1337   MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8));
1338
1339 #if GTEST_HAS_STD_FUNCTION_
1340   ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() {
1341     return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,
1342         A8 a8) -> R {
1343       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1344           ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),
1345           ::std::move(a7), ::std::move(a8));
1346     };
1347   }
1348 #endif  // GTEST_HAS_STD_FUNCTION_
1349
1350  private:
1351   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1352 };
1353
1354 template <typename R, typename A0, typename A1, typename A2, typename A3,
1355     typename A4, typename A5, typename A6, typename A7, typename A8,
1356     typename A9>
1357 class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
1358  public:
1359   MockFunction() {}
1360
1361   MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9));
1362
1363 #if GTEST_HAS_STD_FUNCTION_
1364   ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() {
1365     return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,
1366         A8 a8, A9 a9) -> R {
1367       return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),
1368           ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),
1369           ::std::move(a7), ::std::move(a8), ::std::move(a9));
1370     };
1371   }
1372 #endif  // GTEST_HAS_STD_FUNCTION_
1373
1374  private:
1375   GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
1376 };
1377
1378 }  // namespace testing
1379
1380 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_