[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / utils / unittest / googlemock / include / gmock / gmock-generated-actions.h
blobee00ad839d825b03c0f96b7ecefdda219fcce0d0
1 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
3 // Copyright 2007, Google Inc.
4 // All rights reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are
8 // met:
9 //
10 // * Redistributions of source code must retain the above copyright
11 // notice, this list of conditions and the following disclaimer.
12 // * Redistributions in binary form must reproduce the above
13 // copyright notice, this list of conditions and the following disclaimer
14 // in the documentation and/or other materials provided with the
15 // distribution.
16 // * Neither the name of Google Inc. nor the names of its
17 // contributors may be used to endorse or promote products derived from
18 // this software without specific prior written permission.
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 // Author: wan@google.com (Zhanyong Wan)
34 // Google Mock - a framework for writing C++ mock classes.
36 // This file implements some commonly used variadic actions.
38 // IWYU pragma: private, include "gmock/gmock.h"
40 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
41 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
43 #include "gmock/gmock-actions.h"
44 #include "gmock/internal/gmock-port.h"
46 namespace testing {
47 namespace internal {
49 // InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary
50 // function or method with the unpacked values, where F is a function
51 // type that takes N arguments.
52 template <typename Result, typename ArgumentTuple>
53 class InvokeHelper;
55 template <typename R>
56 class InvokeHelper<R, ::testing::tuple<> > {
57 public:
58 template <typename Function>
59 static R Invoke(Function function, const ::testing::tuple<>&) {
60 return function();
63 template <class Class, typename MethodPtr>
64 static R InvokeMethod(Class* obj_ptr,
65 MethodPtr method_ptr,
66 const ::testing::tuple<>&) {
67 return (obj_ptr->*method_ptr)();
71 template <typename R, typename A1>
72 class InvokeHelper<R, ::testing::tuple<A1> > {
73 public:
74 template <typename Function>
75 static R Invoke(Function function, const ::testing::tuple<A1>& args) {
76 return function(get<0>(args));
79 template <class Class, typename MethodPtr>
80 static R InvokeMethod(Class* obj_ptr,
81 MethodPtr method_ptr,
82 const ::testing::tuple<A1>& args) {
83 return (obj_ptr->*method_ptr)(get<0>(args));
87 template <typename R, typename A1, typename A2>
88 class InvokeHelper<R, ::testing::tuple<A1, A2> > {
89 public:
90 template <typename Function>
91 static R Invoke(Function function, const ::testing::tuple<A1, A2>& args) {
92 return function(get<0>(args), get<1>(args));
95 template <class Class, typename MethodPtr>
96 static R InvokeMethod(Class* obj_ptr,
97 MethodPtr method_ptr,
98 const ::testing::tuple<A1, A2>& args) {
99 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));
103 template <typename R, typename A1, typename A2, typename A3>
104 class InvokeHelper<R, ::testing::tuple<A1, A2, A3> > {
105 public:
106 template <typename Function>
107 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3>& args) {
108 return function(get<0>(args), get<1>(args), get<2>(args));
111 template <class Class, typename MethodPtr>
112 static R InvokeMethod(Class* obj_ptr,
113 MethodPtr method_ptr,
114 const ::testing::tuple<A1, A2, A3>& args) {
115 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
116 get<2>(args));
120 template <typename R, typename A1, typename A2, typename A3, typename A4>
121 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > {
122 public:
123 template <typename Function>
124 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3,
125 A4>& args) {
126 return function(get<0>(args), get<1>(args), get<2>(args),
127 get<3>(args));
130 template <class Class, typename MethodPtr>
131 static R InvokeMethod(Class* obj_ptr,
132 MethodPtr method_ptr,
133 const ::testing::tuple<A1, A2, A3, A4>& args) {
134 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
135 get<2>(args), get<3>(args));
139 template <typename R, typename A1, typename A2, typename A3, typename A4,
140 typename A5>
141 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > {
142 public:
143 template <typename Function>
144 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4,
145 A5>& args) {
146 return function(get<0>(args), get<1>(args), get<2>(args),
147 get<3>(args), get<4>(args));
150 template <class Class, typename MethodPtr>
151 static R InvokeMethod(Class* obj_ptr,
152 MethodPtr method_ptr,
153 const ::testing::tuple<A1, A2, A3, A4, A5>& args) {
154 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
155 get<2>(args), get<3>(args), get<4>(args));
159 template <typename R, typename A1, typename A2, typename A3, typename A4,
160 typename A5, typename A6>
161 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > {
162 public:
163 template <typename Function>
164 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
165 A6>& args) {
166 return function(get<0>(args), get<1>(args), get<2>(args),
167 get<3>(args), get<4>(args), get<5>(args));
170 template <class Class, typename MethodPtr>
171 static R InvokeMethod(Class* obj_ptr,
172 MethodPtr method_ptr,
173 const ::testing::tuple<A1, A2, A3, A4, A5, A6>& args) {
174 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
175 get<2>(args), get<3>(args), get<4>(args), get<5>(args));
179 template <typename R, typename A1, typename A2, typename A3, typename A4,
180 typename A5, typename A6, typename A7>
181 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {
182 public:
183 template <typename Function>
184 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
185 A6, A7>& args) {
186 return function(get<0>(args), get<1>(args), get<2>(args),
187 get<3>(args), get<4>(args), get<5>(args), get<6>(args));
190 template <class Class, typename MethodPtr>
191 static R InvokeMethod(Class* obj_ptr,
192 MethodPtr method_ptr,
193 const ::testing::tuple<A1, A2, A3, A4, A5, A6,
194 A7>& args) {
195 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
196 get<2>(args), get<3>(args), get<4>(args), get<5>(args),
197 get<6>(args));
201 template <typename R, typename A1, typename A2, typename A3, typename A4,
202 typename A5, typename A6, typename A7, typename A8>
203 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {
204 public:
205 template <typename Function>
206 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
207 A6, A7, A8>& args) {
208 return function(get<0>(args), get<1>(args), get<2>(args),
209 get<3>(args), get<4>(args), get<5>(args), get<6>(args),
210 get<7>(args));
213 template <class Class, typename MethodPtr>
214 static R InvokeMethod(Class* obj_ptr,
215 MethodPtr method_ptr,
216 const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7,
217 A8>& args) {
218 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
219 get<2>(args), get<3>(args), get<4>(args), get<5>(args),
220 get<6>(args), get<7>(args));
224 template <typename R, typename A1, typename A2, typename A3, typename A4,
225 typename A5, typename A6, typename A7, typename A8, typename A9>
226 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {
227 public:
228 template <typename Function>
229 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
230 A6, A7, A8, A9>& args) {
231 return function(get<0>(args), get<1>(args), get<2>(args),
232 get<3>(args), get<4>(args), get<5>(args), get<6>(args),
233 get<7>(args), get<8>(args));
236 template <class Class, typename MethodPtr>
237 static R InvokeMethod(Class* obj_ptr,
238 MethodPtr method_ptr,
239 const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
240 A9>& args) {
241 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
242 get<2>(args), get<3>(args), get<4>(args), get<5>(args),
243 get<6>(args), get<7>(args), get<8>(args));
247 template <typename R, typename A1, typename A2, typename A3, typename A4,
248 typename A5, typename A6, typename A7, typename A8, typename A9,
249 typename A10>
250 class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
251 A10> > {
252 public:
253 template <typename Function>
254 static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
255 A6, A7, A8, A9, A10>& args) {
256 return function(get<0>(args), get<1>(args), get<2>(args),
257 get<3>(args), get<4>(args), get<5>(args), get<6>(args),
258 get<7>(args), get<8>(args), get<9>(args));
261 template <class Class, typename MethodPtr>
262 static R InvokeMethod(Class* obj_ptr,
263 MethodPtr method_ptr,
264 const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
265 A9, A10>& args) {
266 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
267 get<2>(args), get<3>(args), get<4>(args), get<5>(args),
268 get<6>(args), get<7>(args), get<8>(args), get<9>(args));
272 // An INTERNAL macro for extracting the type of a tuple field. It's
273 // subject to change without notice - DO NOT USE IN USER CODE!
274 #define GMOCK_FIELD_(Tuple, N) \
275 typename ::testing::tuple_element<N, Tuple>::type
277 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
278 // type of an n-ary function whose i-th (1-based) argument type is the
279 // k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
280 // type, and whose return type is Result. For example,
281 // SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type
282 // is int(bool, long).
284 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
285 // returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
286 // For example,
287 // SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select(
288 // ::testing::make_tuple(true, 'a', 2.5))
289 // returns tuple (2.5, true).
291 // The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
292 // in the range [0, 10]. Duplicates are allowed and they don't have
293 // to be in an ascending or descending order.
295 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
296 int k4, int k5, int k6, int k7, int k8, int k9, int k10>
297 class SelectArgs {
298 public:
299 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
300 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
301 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
302 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
303 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),
304 GMOCK_FIELD_(ArgumentTuple, k10));
305 typedef typename Function<type>::ArgumentTuple SelectedArgs;
306 static SelectedArgs Select(const ArgumentTuple& args) {
307 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
308 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
309 get<k8>(args), get<k9>(args), get<k10>(args));
313 template <typename Result, typename ArgumentTuple>
314 class SelectArgs<Result, ArgumentTuple,
315 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
316 public:
317 typedef Result type();
318 typedef typename Function<type>::ArgumentTuple SelectedArgs;
319 static SelectedArgs Select(const ArgumentTuple& /* args */) {
320 return SelectedArgs();
324 template <typename Result, typename ArgumentTuple, int k1>
325 class SelectArgs<Result, ArgumentTuple,
326 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
327 public:
328 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));
329 typedef typename Function<type>::ArgumentTuple SelectedArgs;
330 static SelectedArgs Select(const ArgumentTuple& args) {
331 return SelectedArgs(get<k1>(args));
335 template <typename Result, typename ArgumentTuple, int k1, int k2>
336 class SelectArgs<Result, ArgumentTuple,
337 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {
338 public:
339 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
340 GMOCK_FIELD_(ArgumentTuple, k2));
341 typedef typename Function<type>::ArgumentTuple SelectedArgs;
342 static SelectedArgs Select(const ArgumentTuple& args) {
343 return SelectedArgs(get<k1>(args), get<k2>(args));
347 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
348 class SelectArgs<Result, ArgumentTuple,
349 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {
350 public:
351 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
352 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));
353 typedef typename Function<type>::ArgumentTuple SelectedArgs;
354 static SelectedArgs Select(const ArgumentTuple& args) {
355 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));
359 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
360 int k4>
361 class SelectArgs<Result, ArgumentTuple,
362 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {
363 public:
364 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
365 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
366 GMOCK_FIELD_(ArgumentTuple, k4));
367 typedef typename Function<type>::ArgumentTuple SelectedArgs;
368 static SelectedArgs Select(const ArgumentTuple& args) {
369 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
370 get<k4>(args));
374 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
375 int k4, int k5>
376 class SelectArgs<Result, ArgumentTuple,
377 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {
378 public:
379 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
380 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
381 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));
382 typedef typename Function<type>::ArgumentTuple SelectedArgs;
383 static SelectedArgs Select(const ArgumentTuple& args) {
384 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
385 get<k4>(args), get<k5>(args));
389 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
390 int k4, int k5, int k6>
391 class SelectArgs<Result, ArgumentTuple,
392 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {
393 public:
394 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
395 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
396 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
397 GMOCK_FIELD_(ArgumentTuple, k6));
398 typedef typename Function<type>::ArgumentTuple SelectedArgs;
399 static SelectedArgs Select(const ArgumentTuple& args) {
400 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
401 get<k4>(args), get<k5>(args), get<k6>(args));
405 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
406 int k4, int k5, int k6, int k7>
407 class SelectArgs<Result, ArgumentTuple,
408 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {
409 public:
410 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
411 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
412 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
413 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));
414 typedef typename Function<type>::ArgumentTuple SelectedArgs;
415 static SelectedArgs Select(const ArgumentTuple& args) {
416 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
417 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));
421 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
422 int k4, int k5, int k6, int k7, int k8>
423 class SelectArgs<Result, ArgumentTuple,
424 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {
425 public:
426 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
427 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
428 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
429 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
430 GMOCK_FIELD_(ArgumentTuple, k8));
431 typedef typename Function<type>::ArgumentTuple SelectedArgs;
432 static SelectedArgs Select(const ArgumentTuple& args) {
433 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
434 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
435 get<k8>(args));
439 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
440 int k4, int k5, int k6, int k7, int k8, int k9>
441 class SelectArgs<Result, ArgumentTuple,
442 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {
443 public:
444 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
445 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
446 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
447 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
448 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));
449 typedef typename Function<type>::ArgumentTuple SelectedArgs;
450 static SelectedArgs Select(const ArgumentTuple& args) {
451 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
452 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
453 get<k8>(args), get<k9>(args));
457 #undef GMOCK_FIELD_
459 // Implements the WithArgs action.
460 template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,
461 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
462 int k9 = -1, int k10 = -1>
463 class WithArgsAction {
464 public:
465 explicit WithArgsAction(const InnerAction& action) : action_(action) {}
467 template <typename F>
468 operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
470 private:
471 template <typename F>
472 class Impl : public ActionInterface<F> {
473 public:
474 typedef typename Function<F>::Result Result;
475 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
477 explicit Impl(const InnerAction& action) : action_(action) {}
479 virtual Result Perform(const ArgumentTuple& args) {
480 return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,
481 k5, k6, k7, k8, k9, k10>::Select(args));
484 private:
485 typedef typename SelectArgs<Result, ArgumentTuple,
486 k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;
488 Action<InnerFunctionType> action_;
491 const InnerAction action_;
493 GTEST_DISALLOW_ASSIGN_(WithArgsAction);
496 // A macro from the ACTION* family (defined later in this file)
497 // defines an action that can be used in a mock function. Typically,
498 // these actions only care about a subset of the arguments of the mock
499 // function. For example, if such an action only uses the second
500 // argument, it can be used in any mock function that takes >= 2
501 // arguments where the type of the second argument is compatible.
503 // Therefore, the action implementation must be prepared to take more
504 // arguments than it needs. The ExcessiveArg type is used to
505 // represent those excessive arguments. In order to keep the compiler
506 // error messages tractable, we define it in the testing namespace
507 // instead of testing::internal. However, this is an INTERNAL TYPE
508 // and subject to change without notice, so a user MUST NOT USE THIS
509 // TYPE DIRECTLY.
510 struct ExcessiveArg {};
512 // A helper class needed for implementing the ACTION* macros.
513 template <typename Result, class Impl>
514 class ActionHelper {
515 public:
516 static Result Perform(Impl* impl, const ::testing::tuple<>& args) {
517 return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
518 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
519 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
520 ExcessiveArg());
523 template <typename A0>
524 static Result Perform(Impl* impl, const ::testing::tuple<A0>& args) {
525 return impl->template gmock_PerformImpl<A0>(args, get<0>(args),
526 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
527 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
528 ExcessiveArg());
531 template <typename A0, typename A1>
532 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1>& args) {
533 return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),
534 get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
535 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
536 ExcessiveArg());
539 template <typename A0, typename A1, typename A2>
540 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2>& args) {
541 return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),
542 get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),
543 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
544 ExcessiveArg());
547 template <typename A0, typename A1, typename A2, typename A3>
548 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2,
549 A3>& args) {
550 return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),
551 get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),
552 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
553 ExcessiveArg());
556 template <typename A0, typename A1, typename A2, typename A3, typename A4>
557 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3,
558 A4>& args) {
559 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
560 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
561 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
562 ExcessiveArg());
565 template <typename A0, typename A1, typename A2, typename A3, typename A4,
566 typename A5>
567 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
568 A5>& args) {
569 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
570 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
571 get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
572 ExcessiveArg());
575 template <typename A0, typename A1, typename A2, typename A3, typename A4,
576 typename A5, typename A6>
577 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
578 A5, A6>& args) {
579 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
580 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
581 get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),
582 ExcessiveArg());
585 template <typename A0, typename A1, typename A2, typename A3, typename A4,
586 typename A5, typename A6, typename A7>
587 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
588 A5, A6, A7>& args) {
589 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
590 A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
591 get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),
592 ExcessiveArg());
595 template <typename A0, typename A1, typename A2, typename A3, typename A4,
596 typename A5, typename A6, typename A7, typename A8>
597 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
598 A5, A6, A7, A8>& args) {
599 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
600 A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
601 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
602 ExcessiveArg());
605 template <typename A0, typename A1, typename A2, typename A3, typename A4,
606 typename A5, typename A6, typename A7, typename A8, typename A9>
607 static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
608 A5, A6, A7, A8, A9>& args) {
609 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
610 A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
611 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
612 get<9>(args));
616 } // namespace internal
618 // Various overloads for Invoke().
620 // WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
621 // the selected arguments of the mock function to an_action and
622 // performs it. It serves as an adaptor between actions with
623 // different argument lists. C++ doesn't support default arguments for
624 // function templates, so we have to overload it.
625 template <int k1, typename InnerAction>
626 inline internal::WithArgsAction<InnerAction, k1>
627 WithArgs(const InnerAction& action) {
628 return internal::WithArgsAction<InnerAction, k1>(action);
631 template <int k1, int k2, typename InnerAction>
632 inline internal::WithArgsAction<InnerAction, k1, k2>
633 WithArgs(const InnerAction& action) {
634 return internal::WithArgsAction<InnerAction, k1, k2>(action);
637 template <int k1, int k2, int k3, typename InnerAction>
638 inline internal::WithArgsAction<InnerAction, k1, k2, k3>
639 WithArgs(const InnerAction& action) {
640 return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
643 template <int k1, int k2, int k3, int k4, typename InnerAction>
644 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
645 WithArgs(const InnerAction& action) {
646 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
649 template <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
650 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
651 WithArgs(const InnerAction& action) {
652 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
655 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
656 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
657 WithArgs(const InnerAction& action) {
658 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
661 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
662 typename InnerAction>
663 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
664 WithArgs(const InnerAction& action) {
665 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
666 k7>(action);
669 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
670 typename InnerAction>
671 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
672 WithArgs(const InnerAction& action) {
673 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
674 k8>(action);
677 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
678 int k9, typename InnerAction>
679 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
680 WithArgs(const InnerAction& action) {
681 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
682 k9>(action);
685 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
686 int k9, int k10, typename InnerAction>
687 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
688 k9, k10>
689 WithArgs(const InnerAction& action) {
690 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
691 k9, k10>(action);
694 // Creates an action that does actions a1, a2, ..., sequentially in
695 // each invocation.
696 template <typename Action1, typename Action2>
697 inline internal::DoBothAction<Action1, Action2>
698 DoAll(Action1 a1, Action2 a2) {
699 return internal::DoBothAction<Action1, Action2>(a1, a2);
702 template <typename Action1, typename Action2, typename Action3>
703 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
704 Action3> >
705 DoAll(Action1 a1, Action2 a2, Action3 a3) {
706 return DoAll(a1, DoAll(a2, a3));
709 template <typename Action1, typename Action2, typename Action3,
710 typename Action4>
711 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
712 internal::DoBothAction<Action3, Action4> > >
713 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
714 return DoAll(a1, DoAll(a2, a3, a4));
717 template <typename Action1, typename Action2, typename Action3,
718 typename Action4, typename Action5>
719 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
720 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
721 Action5> > > >
722 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
723 return DoAll(a1, DoAll(a2, a3, a4, a5));
726 template <typename Action1, typename Action2, typename Action3,
727 typename Action4, typename Action5, typename Action6>
728 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
729 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
730 internal::DoBothAction<Action5, Action6> > > > >
731 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
732 return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
735 template <typename Action1, typename Action2, typename Action3,
736 typename Action4, typename Action5, typename Action6, typename Action7>
737 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
738 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
739 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
740 Action7> > > > > >
741 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
742 Action7 a7) {
743 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));
746 template <typename Action1, typename Action2, typename Action3,
747 typename Action4, typename Action5, typename Action6, typename Action7,
748 typename Action8>
749 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
750 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
751 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
752 internal::DoBothAction<Action7, Action8> > > > > > >
753 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
754 Action7 a7, Action8 a8) {
755 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));
758 template <typename Action1, typename Action2, typename Action3,
759 typename Action4, typename Action5, typename Action6, typename Action7,
760 typename Action8, typename Action9>
761 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
762 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
763 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
764 internal::DoBothAction<Action7, internal::DoBothAction<Action8,
765 Action9> > > > > > > >
766 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
767 Action7 a7, Action8 a8, Action9 a9) {
768 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));
771 template <typename Action1, typename Action2, typename Action3,
772 typename Action4, typename Action5, typename Action6, typename Action7,
773 typename Action8, typename Action9, typename Action10>
774 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
775 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
776 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
777 internal::DoBothAction<Action7, internal::DoBothAction<Action8,
778 internal::DoBothAction<Action9, Action10> > > > > > > > >
779 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
780 Action7 a7, Action8 a8, Action9 a9, Action10 a10) {
781 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));
784 } // namespace testing
786 // The ACTION* family of macros can be used in a namespace scope to
787 // define custom actions easily. The syntax:
789 // ACTION(name) { statements; }
791 // will define an action with the given name that executes the
792 // statements. The value returned by the statements will be used as
793 // the return value of the action. Inside the statements, you can
794 // refer to the K-th (0-based) argument of the mock function by
795 // 'argK', and refer to its type by 'argK_type'. For example:
797 // ACTION(IncrementArg1) {
798 // arg1_type temp = arg1;
799 // return ++(*temp);
800 // }
802 // allows you to write
804 // ...WillOnce(IncrementArg1());
806 // You can also refer to the entire argument tuple and its type by
807 // 'args' and 'args_type', and refer to the mock function type and its
808 // return type by 'function_type' and 'return_type'.
810 // Note that you don't need to specify the types of the mock function
811 // arguments. However rest assured that your code is still type-safe:
812 // you'll get a compiler error if *arg1 doesn't support the ++
813 // operator, or if the type of ++(*arg1) isn't compatible with the
814 // mock function's return type, for example.
816 // Sometimes you'll want to parameterize the action. For that you can use
817 // another macro:
819 // ACTION_P(name, param_name) { statements; }
821 // For example:
823 // ACTION_P(Add, n) { return arg0 + n; }
825 // will allow you to write:
827 // ...WillOnce(Add(5));
829 // Note that you don't need to provide the type of the parameter
830 // either. If you need to reference the type of a parameter named
831 // 'foo', you can write 'foo_type'. For example, in the body of
832 // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
833 // of 'n'.
835 // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
836 // multi-parameter actions.
838 // For the purpose of typing, you can view
840 // ACTION_Pk(Foo, p1, ..., pk) { ... }
842 // as shorthand for
844 // template <typename p1_type, ..., typename pk_type>
845 // FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
847 // In particular, you can provide the template type arguments
848 // explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
849 // although usually you can rely on the compiler to infer the types
850 // for you automatically. You can assign the result of expression
851 // Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
852 // pk_type>. This can be useful when composing actions.
854 // You can also overload actions with different numbers of parameters:
856 // ACTION_P(Plus, a) { ... }
857 // ACTION_P2(Plus, a, b) { ... }
859 // While it's tempting to always use the ACTION* macros when defining
860 // a new action, you should also consider implementing ActionInterface
861 // or using MakePolymorphicAction() instead, especially if you need to
862 // use the action a lot. While these approaches require more work,
863 // they give you more control on the types of the mock function
864 // arguments and the action parameters, which in general leads to
865 // better compiler error messages that pay off in the long run. They
866 // also allow overloading actions based on parameter types (as opposed
867 // to just based on the number of parameters).
869 // CAVEAT:
871 // ACTION*() can only be used in a namespace scope. The reason is
872 // that C++ doesn't yet allow function-local types to be used to
873 // instantiate templates. The up-coming C++0x standard will fix this.
874 // Once that's done, we'll consider supporting using ACTION*() inside
875 // a function.
877 // MORE INFORMATION:
879 // To learn more about using these macros, please search for 'ACTION'
880 // on http://code.google.com/p/googlemock/wiki/CookBook.
882 // An internal macro needed for implementing ACTION*().
883 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
884 const args_type& args GTEST_ATTRIBUTE_UNUSED_, \
885 arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \
886 arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \
887 arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \
888 arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \
889 arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \
890 arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \
891 arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \
892 arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \
893 arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \
894 arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
896 // Sometimes you want to give an action explicit template parameters
897 // that cannot be inferred from its value parameters. ACTION() and
898 // ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that
899 // and can be viewed as an extension to ACTION() and ACTION_P*().
901 // The syntax:
903 // ACTION_TEMPLATE(ActionName,
904 // HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
905 // AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
907 // defines an action template that takes m explicit template
908 // parameters and n value parameters. name_i is the name of the i-th
909 // template parameter, and kind_i specifies whether it's a typename,
910 // an integral constant, or a template. p_i is the name of the i-th
911 // value parameter.
913 // Example:
915 // // DuplicateArg<k, T>(output) converts the k-th argument of the mock
916 // // function to type T and copies it to *output.
917 // ACTION_TEMPLATE(DuplicateArg,
918 // HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
919 // AND_1_VALUE_PARAMS(output)) {
920 // *output = T(::testing::get<k>(args));
921 // }
922 // ...
923 // int n;
924 // EXPECT_CALL(mock, Foo(_, _))
925 // .WillOnce(DuplicateArg<1, unsigned char>(&n));
927 // To create an instance of an action template, write:
929 // ActionName<t1, ..., t_m>(v1, ..., v_n)
931 // where the ts are the template arguments and the vs are the value
932 // arguments. The value argument types are inferred by the compiler.
933 // If you want to explicitly specify the value argument types, you can
934 // provide additional template arguments:
936 // ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
938 // where u_i is the desired type of v_i.
940 // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the
941 // number of value parameters, but not on the number of template
942 // parameters. Without the restriction, the meaning of the following
943 // is unclear:
945 // OverloadedAction<int, bool>(x);
947 // Are we using a single-template-parameter action where 'bool' refers
948 // to the type of x, or are we using a two-template-parameter action
949 // where the compiler is asked to infer the type of x?
951 // Implementation notes:
953 // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and
954 // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for
955 // implementing ACTION_TEMPLATE. The main trick we use is to create
956 // new macro invocations when expanding a macro. For example, we have
958 // #define ACTION_TEMPLATE(name, template_params, value_params)
959 // ... GMOCK_INTERNAL_DECL_##template_params ...
961 // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)
962 // to expand to
964 // ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...
966 // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the
967 // preprocessor will continue to expand it to
969 // ... typename T ...
971 // This technique conforms to the C++ standard and is portable. It
972 // allows us to implement action templates using O(N) code, where N is
973 // the maximum number of template/value parameters supported. Without
974 // using it, we'd have to devote O(N^2) amount of code to implement all
975 // combinations of m and n.
977 // Declares the template parameters.
978 #define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0
979 #define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
980 name1) kind0 name0, kind1 name1
981 #define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
982 kind2, name2) kind0 name0, kind1 name1, kind2 name2
983 #define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
984 kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \
985 kind3 name3
986 #define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
987 kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \
988 kind2 name2, kind3 name3, kind4 name4
989 #define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
990 kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \
991 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5
992 #define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
993 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
994 name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \
995 kind5 name5, kind6 name6
996 #define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
997 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
998 kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \
999 kind4 name4, kind5 name5, kind6 name6, kind7 name7
1000 #define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1001 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1002 kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \
1003 kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \
1004 kind8 name8
1005 #define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1006 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1007 name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \
1008 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \
1009 kind6 name6, kind7 name7, kind8 name8, kind9 name9
1011 // Lists the template parameters.
1012 #define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0
1013 #define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1014 name1) name0, name1
1015 #define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1016 kind2, name2) name0, name1, name2
1017 #define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1018 kind2, name2, kind3, name3) name0, name1, name2, name3
1019 #define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1020 kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \
1021 name4
1022 #define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1023 kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \
1024 name2, name3, name4, name5
1025 #define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1026 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1027 name6) name0, name1, name2, name3, name4, name5, name6
1028 #define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1029 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1030 kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7
1031 #define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1032 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1033 kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \
1034 name6, name7, name8
1035 #define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1036 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1037 name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \
1038 name3, name4, name5, name6, name7, name8, name9
1040 // Declares the types of value parameters.
1041 #define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()
1042 #define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type
1043 #define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \
1044 typename p0##_type, typename p1##_type
1045 #define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \
1046 typename p0##_type, typename p1##_type, typename p2##_type
1047 #define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1048 typename p0##_type, typename p1##_type, typename p2##_type, \
1049 typename p3##_type
1050 #define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1051 typename p0##_type, typename p1##_type, typename p2##_type, \
1052 typename p3##_type, typename p4##_type
1053 #define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1054 typename p0##_type, typename p1##_type, typename p2##_type, \
1055 typename p3##_type, typename p4##_type, typename p5##_type
1056 #define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1057 p6) , typename p0##_type, typename p1##_type, typename p2##_type, \
1058 typename p3##_type, typename p4##_type, typename p5##_type, \
1059 typename p6##_type
1060 #define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1061 p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \
1062 typename p3##_type, typename p4##_type, typename p5##_type, \
1063 typename p6##_type, typename p7##_type
1064 #define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1065 p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \
1066 typename p3##_type, typename p4##_type, typename p5##_type, \
1067 typename p6##_type, typename p7##_type, typename p8##_type
1068 #define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1069 p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \
1070 typename p2##_type, typename p3##_type, typename p4##_type, \
1071 typename p5##_type, typename p6##_type, typename p7##_type, \
1072 typename p8##_type, typename p9##_type
1074 // Initializes the value parameters.
1075 #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\
1077 #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\
1078 (p0##_type gmock_p0) : p0(gmock_p0)
1079 #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\
1080 (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1)
1081 #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\
1082 (p0##_type gmock_p0, p1##_type gmock_p1, \
1083 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2)
1084 #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\
1085 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1086 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1087 p3(gmock_p3)
1088 #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\
1089 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1090 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \
1091 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4)
1092 #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\
1093 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1094 p3##_type gmock_p3, p4##_type gmock_p4, \
1095 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1096 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5)
1097 #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\
1098 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1099 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1100 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1101 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6)
1102 #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\
1103 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1104 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1105 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \
1106 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1107 p7(gmock_p7)
1108 #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1109 p7, p8)\
1110 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1111 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1112 p6##_type gmock_p6, p7##_type gmock_p7, \
1113 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1114 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1115 p8(gmock_p8)
1116 #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1117 p7, p8, p9)\
1118 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1119 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1120 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
1121 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1122 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1123 p8(gmock_p8), p9(gmock_p9)
1125 // Declares the fields for storing the value parameters.
1126 #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()
1127 #define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;
1128 #define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \
1129 p1##_type p1;
1130 #define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \
1131 p1##_type p1; p2##_type p2;
1132 #define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \
1133 p1##_type p1; p2##_type p2; p3##_type p3;
1134 #define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1135 p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;
1136 #define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1137 p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1138 p5##_type p5;
1139 #define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1140 p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1141 p5##_type p5; p6##_type p6;
1142 #define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1143 p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1144 p5##_type p5; p6##_type p6; p7##_type p7;
1145 #define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1146 p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1147 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;
1148 #define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1149 p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1150 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \
1151 p9##_type p9;
1153 // Lists the value parameters.
1154 #define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()
1155 #define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0
1156 #define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1
1157 #define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2
1158 #define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3
1159 #define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \
1160 p2, p3, p4
1161 #define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \
1162 p1, p2, p3, p4, p5
1163 #define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1164 p6) p0, p1, p2, p3, p4, p5, p6
1165 #define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1166 p7) p0, p1, p2, p3, p4, p5, p6, p7
1167 #define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1168 p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8
1169 #define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1170 p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
1172 // Lists the value parameter types.
1173 #define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()
1174 #define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type
1175 #define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \
1176 p1##_type
1177 #define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \
1178 p1##_type, p2##_type
1179 #define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1180 p0##_type, p1##_type, p2##_type, p3##_type
1181 #define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1182 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type
1183 #define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1184 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type
1185 #define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1186 p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \
1187 p6##_type
1188 #define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1189 p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1190 p5##_type, p6##_type, p7##_type
1191 #define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1192 p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1193 p5##_type, p6##_type, p7##_type, p8##_type
1194 #define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1195 p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1196 p5##_type, p6##_type, p7##_type, p8##_type, p9##_type
1198 // Declares the value parameters.
1199 #define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()
1200 #define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0
1201 #define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \
1202 p1##_type p1
1203 #define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \
1204 p1##_type p1, p2##_type p2
1205 #define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \
1206 p1##_type p1, p2##_type p2, p3##_type p3
1207 #define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1208 p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4
1209 #define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1210 p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1211 p5##_type p5
1212 #define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1213 p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1214 p5##_type p5, p6##_type p6
1215 #define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1216 p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1217 p5##_type p5, p6##_type p6, p7##_type p7
1218 #define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1219 p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1220 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8
1221 #define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1222 p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1223 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
1224 p9##_type p9
1226 // The suffix of the class template implementing the action template.
1227 #define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()
1228 #define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P
1229 #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
1230 #define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3
1231 #define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4
1232 #define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5
1233 #define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6
1234 #define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7
1235 #define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1236 p7) P8
1237 #define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1238 p7, p8) P9
1239 #define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1240 p7, p8, p9) P10
1242 // The name of the class template implementing the action template.
1243 #define GMOCK_ACTION_CLASS_(name, value_params)\
1244 GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
1246 #define ACTION_TEMPLATE(name, template_params, value_params)\
1247 template <GMOCK_INTERNAL_DECL_##template_params\
1248 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1249 class GMOCK_ACTION_CLASS_(name, value_params) {\
1250 public:\
1251 explicit GMOCK_ACTION_CLASS_(name, value_params)\
1252 GMOCK_INTERNAL_INIT_##value_params {}\
1253 template <typename F>\
1254 class gmock_Impl : public ::testing::ActionInterface<F> {\
1255 public:\
1256 typedef F function_type;\
1257 typedef typename ::testing::internal::Function<F>::Result return_type;\
1258 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1259 args_type;\
1260 explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
1261 virtual return_type Perform(const args_type& args) {\
1262 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1263 Perform(this, args);\
1265 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1266 typename arg3_type, typename arg4_type, typename arg5_type, \
1267 typename arg6_type, typename arg7_type, typename arg8_type, \
1268 typename arg9_type>\
1269 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1270 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1271 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1272 arg9_type arg9) const;\
1273 GMOCK_INTERNAL_DEFN_##value_params\
1274 private:\
1275 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1277 template <typename F> operator ::testing::Action<F>() const {\
1278 return ::testing::Action<F>(\
1279 new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\
1281 GMOCK_INTERNAL_DEFN_##value_params\
1282 private:\
1283 GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\
1285 template <GMOCK_INTERNAL_DECL_##template_params\
1286 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1287 inline GMOCK_ACTION_CLASS_(name, value_params)<\
1288 GMOCK_INTERNAL_LIST_##template_params\
1289 GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\
1290 GMOCK_INTERNAL_DECL_##value_params) {\
1291 return GMOCK_ACTION_CLASS_(name, value_params)<\
1292 GMOCK_INTERNAL_LIST_##template_params\
1293 GMOCK_INTERNAL_LIST_TYPE_##value_params>(\
1294 GMOCK_INTERNAL_LIST_##value_params);\
1296 template <GMOCK_INTERNAL_DECL_##template_params\
1297 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1298 template <typename F>\
1299 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1300 typename arg3_type, typename arg4_type, typename arg5_type, \
1301 typename arg6_type, typename arg7_type, typename arg8_type, \
1302 typename arg9_type>\
1303 typename ::testing::internal::Function<F>::Result\
1304 GMOCK_ACTION_CLASS_(name, value_params)<\
1305 GMOCK_INTERNAL_LIST_##template_params\
1306 GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\
1307 gmock_PerformImpl(\
1308 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1310 #define ACTION(name)\
1311 class name##Action {\
1312 public:\
1313 name##Action() {}\
1314 template <typename F>\
1315 class gmock_Impl : public ::testing::ActionInterface<F> {\
1316 public:\
1317 typedef F function_type;\
1318 typedef typename ::testing::internal::Function<F>::Result return_type;\
1319 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1320 args_type;\
1321 gmock_Impl() {}\
1322 virtual return_type Perform(const args_type& args) {\
1323 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1324 Perform(this, args);\
1326 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1327 typename arg3_type, typename arg4_type, typename arg5_type, \
1328 typename arg6_type, typename arg7_type, typename arg8_type, \
1329 typename arg9_type>\
1330 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1331 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1332 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1333 arg9_type arg9) const;\
1334 private:\
1335 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1337 template <typename F> operator ::testing::Action<F>() const {\
1338 return ::testing::Action<F>(new gmock_Impl<F>());\
1340 private:\
1341 GTEST_DISALLOW_ASSIGN_(name##Action);\
1343 inline name##Action name() {\
1344 return name##Action();\
1346 template <typename F>\
1347 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1348 typename arg3_type, typename arg4_type, typename arg5_type, \
1349 typename arg6_type, typename arg7_type, typename arg8_type, \
1350 typename arg9_type>\
1351 typename ::testing::internal::Function<F>::Result\
1352 name##Action::gmock_Impl<F>::gmock_PerformImpl(\
1353 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1355 #define ACTION_P(name, p0)\
1356 template <typename p0##_type>\
1357 class name##ActionP {\
1358 public:\
1359 explicit name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\
1360 template <typename F>\
1361 class gmock_Impl : public ::testing::ActionInterface<F> {\
1362 public:\
1363 typedef F function_type;\
1364 typedef typename ::testing::internal::Function<F>::Result return_type;\
1365 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1366 args_type;\
1367 explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\
1368 virtual return_type Perform(const args_type& args) {\
1369 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1370 Perform(this, args);\
1372 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1373 typename arg3_type, typename arg4_type, typename arg5_type, \
1374 typename arg6_type, typename arg7_type, typename arg8_type, \
1375 typename arg9_type>\
1376 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1377 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1378 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1379 arg9_type arg9) const;\
1380 p0##_type p0;\
1381 private:\
1382 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1384 template <typename F> operator ::testing::Action<F>() const {\
1385 return ::testing::Action<F>(new gmock_Impl<F>(p0));\
1387 p0##_type p0;\
1388 private:\
1389 GTEST_DISALLOW_ASSIGN_(name##ActionP);\
1391 template <typename p0##_type>\
1392 inline name##ActionP<p0##_type> name(p0##_type p0) {\
1393 return name##ActionP<p0##_type>(p0);\
1395 template <typename p0##_type>\
1396 template <typename F>\
1397 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1398 typename arg3_type, typename arg4_type, typename arg5_type, \
1399 typename arg6_type, typename arg7_type, typename arg8_type, \
1400 typename arg9_type>\
1401 typename ::testing::internal::Function<F>::Result\
1402 name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1403 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1405 #define ACTION_P2(name, p0, p1)\
1406 template <typename p0##_type, typename p1##_type>\
1407 class name##ActionP2 {\
1408 public:\
1409 name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1410 p1(gmock_p1) {}\
1411 template <typename F>\
1412 class gmock_Impl : public ::testing::ActionInterface<F> {\
1413 public:\
1414 typedef F function_type;\
1415 typedef typename ::testing::internal::Function<F>::Result return_type;\
1416 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1417 args_type;\
1418 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1419 p1(gmock_p1) {}\
1420 virtual return_type Perform(const args_type& args) {\
1421 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1422 Perform(this, args);\
1424 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1425 typename arg3_type, typename arg4_type, typename arg5_type, \
1426 typename arg6_type, typename arg7_type, typename arg8_type, \
1427 typename arg9_type>\
1428 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1429 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1430 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1431 arg9_type arg9) const;\
1432 p0##_type p0;\
1433 p1##_type p1;\
1434 private:\
1435 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1437 template <typename F> operator ::testing::Action<F>() const {\
1438 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\
1440 p0##_type p0;\
1441 p1##_type p1;\
1442 private:\
1443 GTEST_DISALLOW_ASSIGN_(name##ActionP2);\
1445 template <typename p0##_type, typename p1##_type>\
1446 inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \
1447 p1##_type p1) {\
1448 return name##ActionP2<p0##_type, p1##_type>(p0, p1);\
1450 template <typename p0##_type, typename p1##_type>\
1451 template <typename F>\
1452 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1453 typename arg3_type, typename arg4_type, typename arg5_type, \
1454 typename arg6_type, typename arg7_type, typename arg8_type, \
1455 typename arg9_type>\
1456 typename ::testing::internal::Function<F>::Result\
1457 name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1458 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1460 #define ACTION_P3(name, p0, p1, p2)\
1461 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1462 class name##ActionP3 {\
1463 public:\
1464 name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1465 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1466 template <typename F>\
1467 class gmock_Impl : public ::testing::ActionInterface<F> {\
1468 public:\
1469 typedef F function_type;\
1470 typedef typename ::testing::internal::Function<F>::Result return_type;\
1471 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1472 args_type;\
1473 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \
1474 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1475 virtual return_type Perform(const args_type& args) {\
1476 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1477 Perform(this, args);\
1479 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1480 typename arg3_type, typename arg4_type, typename arg5_type, \
1481 typename arg6_type, typename arg7_type, typename arg8_type, \
1482 typename arg9_type>\
1483 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1484 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1485 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1486 arg9_type arg9) const;\
1487 p0##_type p0;\
1488 p1##_type p1;\
1489 p2##_type p2;\
1490 private:\
1491 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1493 template <typename F> operator ::testing::Action<F>() const {\
1494 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\
1496 p0##_type p0;\
1497 p1##_type p1;\
1498 p2##_type p2;\
1499 private:\
1500 GTEST_DISALLOW_ASSIGN_(name##ActionP3);\
1502 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1503 inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1504 p1##_type p1, p2##_type p2) {\
1505 return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1507 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1508 template <typename F>\
1509 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1510 typename arg3_type, typename arg4_type, typename arg5_type, \
1511 typename arg6_type, typename arg7_type, typename arg8_type, \
1512 typename arg9_type>\
1513 typename ::testing::internal::Function<F>::Result\
1514 name##ActionP3<p0##_type, p1##_type, \
1515 p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1516 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1518 #define ACTION_P4(name, p0, p1, p2, p3)\
1519 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1520 typename p3##_type>\
1521 class name##ActionP4 {\
1522 public:\
1523 name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1524 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1525 p2(gmock_p2), p3(gmock_p3) {}\
1526 template <typename F>\
1527 class gmock_Impl : public ::testing::ActionInterface<F> {\
1528 public:\
1529 typedef F function_type;\
1530 typedef typename ::testing::internal::Function<F>::Result return_type;\
1531 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1532 args_type;\
1533 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1534 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1535 p3(gmock_p3) {}\
1536 virtual return_type Perform(const args_type& args) {\
1537 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1538 Perform(this, args);\
1540 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1541 typename arg3_type, typename arg4_type, typename arg5_type, \
1542 typename arg6_type, typename arg7_type, typename arg8_type, \
1543 typename arg9_type>\
1544 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1545 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1546 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1547 arg9_type arg9) const;\
1548 p0##_type p0;\
1549 p1##_type p1;\
1550 p2##_type p2;\
1551 p3##_type p3;\
1552 private:\
1553 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1555 template <typename F> operator ::testing::Action<F>() const {\
1556 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\
1558 p0##_type p0;\
1559 p1##_type p1;\
1560 p2##_type p2;\
1561 p3##_type p3;\
1562 private:\
1563 GTEST_DISALLOW_ASSIGN_(name##ActionP4);\
1565 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1566 typename p3##_type>\
1567 inline name##ActionP4<p0##_type, p1##_type, p2##_type, \
1568 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1569 p3##_type p3) {\
1570 return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \
1571 p2, p3);\
1573 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1574 typename p3##_type>\
1575 template <typename F>\
1576 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1577 typename arg3_type, typename arg4_type, typename arg5_type, \
1578 typename arg6_type, typename arg7_type, typename arg8_type, \
1579 typename arg9_type>\
1580 typename ::testing::internal::Function<F>::Result\
1581 name##ActionP4<p0##_type, p1##_type, p2##_type, \
1582 p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1583 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1585 #define ACTION_P5(name, p0, p1, p2, p3, p4)\
1586 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1587 typename p3##_type, typename p4##_type>\
1588 class name##ActionP5 {\
1589 public:\
1590 name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1591 p2##_type gmock_p2, p3##_type gmock_p3, \
1592 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1593 p3(gmock_p3), p4(gmock_p4) {}\
1594 template <typename F>\
1595 class gmock_Impl : public ::testing::ActionInterface<F> {\
1596 public:\
1597 typedef F function_type;\
1598 typedef typename ::testing::internal::Function<F>::Result return_type;\
1599 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1600 args_type;\
1601 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1602 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \
1603 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\
1604 virtual return_type Perform(const args_type& args) {\
1605 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1606 Perform(this, args);\
1608 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1609 typename arg3_type, typename arg4_type, typename arg5_type, \
1610 typename arg6_type, typename arg7_type, typename arg8_type, \
1611 typename arg9_type>\
1612 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1613 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1614 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1615 arg9_type arg9) const;\
1616 p0##_type p0;\
1617 p1##_type p1;\
1618 p2##_type p2;\
1619 p3##_type p3;\
1620 p4##_type p4;\
1621 private:\
1622 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1624 template <typename F> operator ::testing::Action<F>() const {\
1625 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\
1627 p0##_type p0;\
1628 p1##_type p1;\
1629 p2##_type p2;\
1630 p3##_type p3;\
1631 p4##_type p4;\
1632 private:\
1633 GTEST_DISALLOW_ASSIGN_(name##ActionP5);\
1635 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1636 typename p3##_type, typename p4##_type>\
1637 inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1638 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1639 p4##_type p4) {\
1640 return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1641 p4##_type>(p0, p1, p2, p3, p4);\
1643 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1644 typename p3##_type, typename p4##_type>\
1645 template <typename F>\
1646 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1647 typename arg3_type, typename arg4_type, typename arg5_type, \
1648 typename arg6_type, typename arg7_type, typename arg8_type, \
1649 typename arg9_type>\
1650 typename ::testing::internal::Function<F>::Result\
1651 name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1652 p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1653 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1655 #define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\
1656 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1657 typename p3##_type, typename p4##_type, typename p5##_type>\
1658 class name##ActionP6 {\
1659 public:\
1660 name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1661 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1662 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1663 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1664 template <typename F>\
1665 class gmock_Impl : public ::testing::ActionInterface<F> {\
1666 public:\
1667 typedef F function_type;\
1668 typedef typename ::testing::internal::Function<F>::Result return_type;\
1669 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1670 args_type;\
1671 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1672 p3##_type gmock_p3, p4##_type gmock_p4, \
1673 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1674 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1675 virtual return_type Perform(const args_type& args) {\
1676 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1677 Perform(this, args);\
1679 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1680 typename arg3_type, typename arg4_type, typename arg5_type, \
1681 typename arg6_type, typename arg7_type, typename arg8_type, \
1682 typename arg9_type>\
1683 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1684 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1685 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1686 arg9_type arg9) const;\
1687 p0##_type p0;\
1688 p1##_type p1;\
1689 p2##_type p2;\
1690 p3##_type p3;\
1691 p4##_type p4;\
1692 p5##_type p5;\
1693 private:\
1694 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1696 template <typename F> operator ::testing::Action<F>() const {\
1697 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\
1699 p0##_type p0;\
1700 p1##_type p1;\
1701 p2##_type p2;\
1702 p3##_type p3;\
1703 p4##_type p4;\
1704 p5##_type p5;\
1705 private:\
1706 GTEST_DISALLOW_ASSIGN_(name##ActionP6);\
1708 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1709 typename p3##_type, typename p4##_type, typename p5##_type>\
1710 inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1711 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1712 p3##_type p3, p4##_type p4, p5##_type p5) {\
1713 return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1714 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1716 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1717 typename p3##_type, typename p4##_type, typename p5##_type>\
1718 template <typename F>\
1719 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1720 typename arg3_type, typename arg4_type, typename arg5_type, \
1721 typename arg6_type, typename arg7_type, typename arg8_type, \
1722 typename arg9_type>\
1723 typename ::testing::internal::Function<F>::Result\
1724 name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1725 p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1726 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1728 #define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\
1729 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1730 typename p3##_type, typename p4##_type, typename p5##_type, \
1731 typename p6##_type>\
1732 class name##ActionP7 {\
1733 public:\
1734 name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1735 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1736 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1737 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1738 p6(gmock_p6) {}\
1739 template <typename F>\
1740 class gmock_Impl : public ::testing::ActionInterface<F> {\
1741 public:\
1742 typedef F function_type;\
1743 typedef typename ::testing::internal::Function<F>::Result return_type;\
1744 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1745 args_type;\
1746 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1747 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1748 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1749 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
1750 virtual return_type Perform(const args_type& args) {\
1751 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1752 Perform(this, args);\
1754 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1755 typename arg3_type, typename arg4_type, typename arg5_type, \
1756 typename arg6_type, typename arg7_type, typename arg8_type, \
1757 typename arg9_type>\
1758 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1759 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1760 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1761 arg9_type arg9) const;\
1762 p0##_type p0;\
1763 p1##_type p1;\
1764 p2##_type p2;\
1765 p3##_type p3;\
1766 p4##_type p4;\
1767 p5##_type p5;\
1768 p6##_type p6;\
1769 private:\
1770 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1772 template <typename F> operator ::testing::Action<F>() const {\
1773 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1774 p6));\
1776 p0##_type p0;\
1777 p1##_type p1;\
1778 p2##_type p2;\
1779 p3##_type p3;\
1780 p4##_type p4;\
1781 p5##_type p5;\
1782 p6##_type p6;\
1783 private:\
1784 GTEST_DISALLOW_ASSIGN_(name##ActionP7);\
1786 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1787 typename p3##_type, typename p4##_type, typename p5##_type, \
1788 typename p6##_type>\
1789 inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1790 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1791 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1792 p6##_type p6) {\
1793 return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1794 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1796 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1797 typename p3##_type, typename p4##_type, typename p5##_type, \
1798 typename p6##_type>\
1799 template <typename F>\
1800 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1801 typename arg3_type, typename arg4_type, typename arg5_type, \
1802 typename arg6_type, typename arg7_type, typename arg8_type, \
1803 typename arg9_type>\
1804 typename ::testing::internal::Function<F>::Result\
1805 name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1806 p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1807 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1809 #define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\
1810 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1811 typename p3##_type, typename p4##_type, typename p5##_type, \
1812 typename p6##_type, typename p7##_type>\
1813 class name##ActionP8 {\
1814 public:\
1815 name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1816 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1817 p5##_type gmock_p5, p6##_type gmock_p6, \
1818 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1819 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1820 p7(gmock_p7) {}\
1821 template <typename F>\
1822 class gmock_Impl : public ::testing::ActionInterface<F> {\
1823 public:\
1824 typedef F function_type;\
1825 typedef typename ::testing::internal::Function<F>::Result return_type;\
1826 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1827 args_type;\
1828 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1829 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1830 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \
1831 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \
1832 p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
1833 virtual return_type Perform(const args_type& args) {\
1834 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1835 Perform(this, args);\
1837 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1838 typename arg3_type, typename arg4_type, typename arg5_type, \
1839 typename arg6_type, typename arg7_type, typename arg8_type, \
1840 typename arg9_type>\
1841 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1842 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1843 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1844 arg9_type arg9) const;\
1845 p0##_type p0;\
1846 p1##_type p1;\
1847 p2##_type p2;\
1848 p3##_type p3;\
1849 p4##_type p4;\
1850 p5##_type p5;\
1851 p6##_type p6;\
1852 p7##_type p7;\
1853 private:\
1854 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1856 template <typename F> operator ::testing::Action<F>() const {\
1857 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1858 p6, p7));\
1860 p0##_type p0;\
1861 p1##_type p1;\
1862 p2##_type p2;\
1863 p3##_type p3;\
1864 p4##_type p4;\
1865 p5##_type p5;\
1866 p6##_type p6;\
1867 p7##_type p7;\
1868 private:\
1869 GTEST_DISALLOW_ASSIGN_(name##ActionP8);\
1871 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1872 typename p3##_type, typename p4##_type, typename p5##_type, \
1873 typename p6##_type, typename p7##_type>\
1874 inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
1875 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
1876 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1877 p6##_type p6, p7##_type p7) {\
1878 return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
1879 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
1880 p6, p7);\
1882 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1883 typename p3##_type, typename p4##_type, typename p5##_type, \
1884 typename p6##_type, typename p7##_type>\
1885 template <typename F>\
1886 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1887 typename arg3_type, typename arg4_type, typename arg5_type, \
1888 typename arg6_type, typename arg7_type, typename arg8_type, \
1889 typename arg9_type>\
1890 typename ::testing::internal::Function<F>::Result\
1891 name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1892 p5##_type, p6##_type, \
1893 p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1894 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1896 #define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
1897 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1898 typename p3##_type, typename p4##_type, typename p5##_type, \
1899 typename p6##_type, typename p7##_type, typename p8##_type>\
1900 class name##ActionP9 {\
1901 public:\
1902 name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \
1903 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1904 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
1905 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1906 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1907 p8(gmock_p8) {}\
1908 template <typename F>\
1909 class gmock_Impl : public ::testing::ActionInterface<F> {\
1910 public:\
1911 typedef F function_type;\
1912 typedef typename ::testing::internal::Function<F>::Result return_type;\
1913 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1914 args_type;\
1915 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1916 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1917 p6##_type gmock_p6, p7##_type gmock_p7, \
1918 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1919 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1920 p7(gmock_p7), p8(gmock_p8) {}\
1921 virtual return_type Perform(const args_type& args) {\
1922 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1923 Perform(this, args);\
1925 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1926 typename arg3_type, typename arg4_type, typename arg5_type, \
1927 typename arg6_type, typename arg7_type, typename arg8_type, \
1928 typename arg9_type>\
1929 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1930 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1931 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1932 arg9_type arg9) const;\
1933 p0##_type p0;\
1934 p1##_type p1;\
1935 p2##_type p2;\
1936 p3##_type p3;\
1937 p4##_type p4;\
1938 p5##_type p5;\
1939 p6##_type p6;\
1940 p7##_type p7;\
1941 p8##_type p8;\
1942 private:\
1943 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1945 template <typename F> operator ::testing::Action<F>() const {\
1946 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1947 p6, p7, p8));\
1949 p0##_type p0;\
1950 p1##_type p1;\
1951 p2##_type p2;\
1952 p3##_type p3;\
1953 p4##_type p4;\
1954 p5##_type p5;\
1955 p6##_type p6;\
1956 p7##_type p7;\
1957 p8##_type p8;\
1958 private:\
1959 GTEST_DISALLOW_ASSIGN_(name##ActionP9);\
1961 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1962 typename p3##_type, typename p4##_type, typename p5##_type, \
1963 typename p6##_type, typename p7##_type, typename p8##_type>\
1964 inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
1965 p4##_type, p5##_type, p6##_type, p7##_type, \
1966 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1967 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
1968 p8##_type p8) {\
1969 return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
1970 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
1971 p3, p4, p5, p6, p7, p8);\
1973 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1974 typename p3##_type, typename p4##_type, typename p5##_type, \
1975 typename p6##_type, typename p7##_type, typename p8##_type>\
1976 template <typename F>\
1977 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1978 typename arg3_type, typename arg4_type, typename arg5_type, \
1979 typename arg6_type, typename arg7_type, typename arg8_type, \
1980 typename arg9_type>\
1981 typename ::testing::internal::Function<F>::Result\
1982 name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1983 p5##_type, p6##_type, p7##_type, \
1984 p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1985 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1987 #define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\
1988 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1989 typename p3##_type, typename p4##_type, typename p5##_type, \
1990 typename p6##_type, typename p7##_type, typename p8##_type, \
1991 typename p9##_type>\
1992 class name##ActionP10 {\
1993 public:\
1994 name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \
1995 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1996 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
1997 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
1998 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1999 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2000 template <typename F>\
2001 class gmock_Impl : public ::testing::ActionInterface<F> {\
2002 public:\
2003 typedef F function_type;\
2004 typedef typename ::testing::internal::Function<F>::Result return_type;\
2005 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2006 args_type;\
2007 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2008 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2009 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
2010 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2011 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2012 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2013 virtual return_type Perform(const args_type& args) {\
2014 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2015 Perform(this, args);\
2017 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2018 typename arg3_type, typename arg4_type, typename arg5_type, \
2019 typename arg6_type, typename arg7_type, typename arg8_type, \
2020 typename arg9_type>\
2021 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2022 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2023 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2024 arg9_type arg9) const;\
2025 p0##_type p0;\
2026 p1##_type p1;\
2027 p2##_type p2;\
2028 p3##_type p3;\
2029 p4##_type p4;\
2030 p5##_type p5;\
2031 p6##_type p6;\
2032 p7##_type p7;\
2033 p8##_type p8;\
2034 p9##_type p9;\
2035 private:\
2036 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2038 template <typename F> operator ::testing::Action<F>() const {\
2039 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2040 p6, p7, p8, p9));\
2042 p0##_type p0;\
2043 p1##_type p1;\
2044 p2##_type p2;\
2045 p3##_type p3;\
2046 p4##_type p4;\
2047 p5##_type p5;\
2048 p6##_type p6;\
2049 p7##_type p7;\
2050 p8##_type p8;\
2051 p9##_type p9;\
2052 private:\
2053 GTEST_DISALLOW_ASSIGN_(name##ActionP10);\
2055 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2056 typename p3##_type, typename p4##_type, typename p5##_type, \
2057 typename p6##_type, typename p7##_type, typename p8##_type, \
2058 typename p9##_type>\
2059 inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2060 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2061 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2062 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2063 p9##_type p9) {\
2064 return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2065 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2066 p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2068 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2069 typename p3##_type, typename p4##_type, typename p5##_type, \
2070 typename p6##_type, typename p7##_type, typename p8##_type, \
2071 typename p9##_type>\
2072 template <typename F>\
2073 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2074 typename arg3_type, typename arg4_type, typename arg5_type, \
2075 typename arg6_type, typename arg7_type, typename arg8_type, \
2076 typename arg9_type>\
2077 typename ::testing::internal::Function<F>::Result\
2078 name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2079 p5##_type, p6##_type, p7##_type, p8##_type, \
2080 p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2081 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2083 namespace testing {
2086 // The ACTION*() macros trigger warning C4100 (unreferenced formal
2087 // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
2088 // the macro definition, as the warnings are generated when the macro
2089 // is expanded and macro expansion cannot contain #pragma. Therefore
2090 // we suppress them here.
2091 #ifdef _MSC_VER
2092 # pragma warning(push)
2093 # pragma warning(disable:4100)
2094 #endif
2096 // Various overloads for InvokeArgument<N>().
2098 // The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
2099 // (0-based) argument, which must be a k-ary callable, of the mock
2100 // function, with arguments a1, a2, ..., a_k.
2102 // Notes:
2104 // 1. The arguments are passed by value by default. If you need to
2105 // pass an argument by reference, wrap it inside ByRef(). For
2106 // example,
2108 // InvokeArgument<1>(5, string("Hello"), ByRef(foo))
2110 // passes 5 and string("Hello") by value, and passes foo by
2111 // reference.
2113 // 2. If the callable takes an argument by reference but ByRef() is
2114 // not used, it will receive the reference to a copy of the value,
2115 // instead of the original value. For example, when the 0-th
2116 // argument of the mock function takes a const string&, the action
2118 // InvokeArgument<0>(string("Hello"))
2120 // makes a copy of the temporary string("Hello") object and passes a
2121 // reference of the copy, instead of the original temporary object,
2122 // to the callable. This makes it easy for a user to define an
2123 // InvokeArgument action from temporary values and have it performed
2124 // later.
2126 namespace internal {
2127 namespace invoke_argument {
2129 // Appears in InvokeArgumentAdl's argument list to help avoid
2130 // accidental calls to user functions of the same name.
2131 struct AdlTag {};
2133 // InvokeArgumentAdl - a helper for InvokeArgument.
2134 // The basic overloads are provided here for generic functors.
2135 // Overloads for other custom-callables are provided in the
2136 // internal/custom/callback-actions.h header.
2138 template <typename R, typename F>
2139 R InvokeArgumentAdl(AdlTag, F f) {
2140 return f();
2142 template <typename R, typename F, typename A1>
2143 R InvokeArgumentAdl(AdlTag, F f, A1 a1) {
2144 return f(a1);
2146 template <typename R, typename F, typename A1, typename A2>
2147 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2) {
2148 return f(a1, a2);
2150 template <typename R, typename F, typename A1, typename A2, typename A3>
2151 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3) {
2152 return f(a1, a2, a3);
2154 template <typename R, typename F, typename A1, typename A2, typename A3,
2155 typename A4>
2156 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4) {
2157 return f(a1, a2, a3, a4);
2159 template <typename R, typename F, typename A1, typename A2, typename A3,
2160 typename A4, typename A5>
2161 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
2162 return f(a1, a2, a3, a4, a5);
2164 template <typename R, typename F, typename A1, typename A2, typename A3,
2165 typename A4, typename A5, typename A6>
2166 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
2167 return f(a1, a2, a3, a4, a5, a6);
2169 template <typename R, typename F, typename A1, typename A2, typename A3,
2170 typename A4, typename A5, typename A6, typename A7>
2171 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
2172 A7 a7) {
2173 return f(a1, a2, a3, a4, a5, a6, a7);
2175 template <typename R, typename F, typename A1, typename A2, typename A3,
2176 typename A4, typename A5, typename A6, typename A7, typename A8>
2177 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
2178 A7 a7, A8 a8) {
2179 return f(a1, a2, a3, a4, a5, a6, a7, a8);
2181 template <typename R, typename F, typename A1, typename A2, typename A3,
2182 typename A4, typename A5, typename A6, typename A7, typename A8,
2183 typename A9>
2184 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
2185 A7 a7, A8 a8, A9 a9) {
2186 return f(a1, a2, a3, a4, a5, a6, a7, a8, a9);
2188 template <typename R, typename F, typename A1, typename A2, typename A3,
2189 typename A4, typename A5, typename A6, typename A7, typename A8,
2190 typename A9, typename A10>
2191 R InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
2192 A7 a7, A8 a8, A9 a9, A10 a10) {
2193 return f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
2195 } // namespace invoke_argument
2196 } // namespace internal
2198 ACTION_TEMPLATE(InvokeArgument,
2199 HAS_1_TEMPLATE_PARAMS(int, k),
2200 AND_0_VALUE_PARAMS()) {
2201 using internal::invoke_argument::InvokeArgumentAdl;
2202 return InvokeArgumentAdl<return_type>(
2203 internal::invoke_argument::AdlTag(),
2204 ::testing::get<k>(args));
2207 ACTION_TEMPLATE(InvokeArgument,
2208 HAS_1_TEMPLATE_PARAMS(int, k),
2209 AND_1_VALUE_PARAMS(p0)) {
2210 using internal::invoke_argument::InvokeArgumentAdl;
2211 return InvokeArgumentAdl<return_type>(
2212 internal::invoke_argument::AdlTag(),
2213 ::testing::get<k>(args), p0);
2216 ACTION_TEMPLATE(InvokeArgument,
2217 HAS_1_TEMPLATE_PARAMS(int, k),
2218 AND_2_VALUE_PARAMS(p0, p1)) {
2219 using internal::invoke_argument::InvokeArgumentAdl;
2220 return InvokeArgumentAdl<return_type>(
2221 internal::invoke_argument::AdlTag(),
2222 ::testing::get<k>(args), p0, p1);
2225 ACTION_TEMPLATE(InvokeArgument,
2226 HAS_1_TEMPLATE_PARAMS(int, k),
2227 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2228 using internal::invoke_argument::InvokeArgumentAdl;
2229 return InvokeArgumentAdl<return_type>(
2230 internal::invoke_argument::AdlTag(),
2231 ::testing::get<k>(args), p0, p1, p2);
2234 ACTION_TEMPLATE(InvokeArgument,
2235 HAS_1_TEMPLATE_PARAMS(int, k),
2236 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2237 using internal::invoke_argument::InvokeArgumentAdl;
2238 return InvokeArgumentAdl<return_type>(
2239 internal::invoke_argument::AdlTag(),
2240 ::testing::get<k>(args), p0, p1, p2, p3);
2243 ACTION_TEMPLATE(InvokeArgument,
2244 HAS_1_TEMPLATE_PARAMS(int, k),
2245 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2246 using internal::invoke_argument::InvokeArgumentAdl;
2247 return InvokeArgumentAdl<return_type>(
2248 internal::invoke_argument::AdlTag(),
2249 ::testing::get<k>(args), p0, p1, p2, p3, p4);
2252 ACTION_TEMPLATE(InvokeArgument,
2253 HAS_1_TEMPLATE_PARAMS(int, k),
2254 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2255 using internal::invoke_argument::InvokeArgumentAdl;
2256 return InvokeArgumentAdl<return_type>(
2257 internal::invoke_argument::AdlTag(),
2258 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5);
2261 ACTION_TEMPLATE(InvokeArgument,
2262 HAS_1_TEMPLATE_PARAMS(int, k),
2263 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2264 using internal::invoke_argument::InvokeArgumentAdl;
2265 return InvokeArgumentAdl<return_type>(
2266 internal::invoke_argument::AdlTag(),
2267 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6);
2270 ACTION_TEMPLATE(InvokeArgument,
2271 HAS_1_TEMPLATE_PARAMS(int, k),
2272 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2273 using internal::invoke_argument::InvokeArgumentAdl;
2274 return InvokeArgumentAdl<return_type>(
2275 internal::invoke_argument::AdlTag(),
2276 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);
2279 ACTION_TEMPLATE(InvokeArgument,
2280 HAS_1_TEMPLATE_PARAMS(int, k),
2281 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2282 using internal::invoke_argument::InvokeArgumentAdl;
2283 return InvokeArgumentAdl<return_type>(
2284 internal::invoke_argument::AdlTag(),
2285 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);
2288 ACTION_TEMPLATE(InvokeArgument,
2289 HAS_1_TEMPLATE_PARAMS(int, k),
2290 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2291 using internal::invoke_argument::InvokeArgumentAdl;
2292 return InvokeArgumentAdl<return_type>(
2293 internal::invoke_argument::AdlTag(),
2294 ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2297 // Various overloads for ReturnNew<T>().
2299 // The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
2300 // instance of type T, constructed on the heap with constructor arguments
2301 // a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
2302 ACTION_TEMPLATE(ReturnNew,
2303 HAS_1_TEMPLATE_PARAMS(typename, T),
2304 AND_0_VALUE_PARAMS()) {
2305 return new T();
2308 ACTION_TEMPLATE(ReturnNew,
2309 HAS_1_TEMPLATE_PARAMS(typename, T),
2310 AND_1_VALUE_PARAMS(p0)) {
2311 return new T(p0);
2314 ACTION_TEMPLATE(ReturnNew,
2315 HAS_1_TEMPLATE_PARAMS(typename, T),
2316 AND_2_VALUE_PARAMS(p0, p1)) {
2317 return new T(p0, p1);
2320 ACTION_TEMPLATE(ReturnNew,
2321 HAS_1_TEMPLATE_PARAMS(typename, T),
2322 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2323 return new T(p0, p1, p2);
2326 ACTION_TEMPLATE(ReturnNew,
2327 HAS_1_TEMPLATE_PARAMS(typename, T),
2328 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2329 return new T(p0, p1, p2, p3);
2332 ACTION_TEMPLATE(ReturnNew,
2333 HAS_1_TEMPLATE_PARAMS(typename, T),
2334 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2335 return new T(p0, p1, p2, p3, p4);
2338 ACTION_TEMPLATE(ReturnNew,
2339 HAS_1_TEMPLATE_PARAMS(typename, T),
2340 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2341 return new T(p0, p1, p2, p3, p4, p5);
2344 ACTION_TEMPLATE(ReturnNew,
2345 HAS_1_TEMPLATE_PARAMS(typename, T),
2346 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2347 return new T(p0, p1, p2, p3, p4, p5, p6);
2350 ACTION_TEMPLATE(ReturnNew,
2351 HAS_1_TEMPLATE_PARAMS(typename, T),
2352 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2353 return new T(p0, p1, p2, p3, p4, p5, p6, p7);
2356 ACTION_TEMPLATE(ReturnNew,
2357 HAS_1_TEMPLATE_PARAMS(typename, T),
2358 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2359 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
2362 ACTION_TEMPLATE(ReturnNew,
2363 HAS_1_TEMPLATE_PARAMS(typename, T),
2364 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2365 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2368 #ifdef _MSC_VER
2369 # pragma warning(pop)
2370 #endif
2372 } // namespace testing
2374 // Include any custom actions added by the local installation.
2375 // We must include this header at the end to make sure it can use the
2376 // declarations from this file.
2377 #include "gmock/internal/custom/gmock-generated-actions.h"
2379 #endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_