blob: 635bb595375d3c0376a56ce8a62e8a721a17d387 [file] [log] [blame]
shiqiane35fdd92008-12-10 05:08:54 +00001// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
2
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.
19//
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.
31//
32// Author: wan@google.com (Zhanyong Wan)
33
34// Google Mock - a framework for writing C++ mock classes.
35//
36// This file implements some commonly used variadic actions.
37
38#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
39#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
40
zhanyong.wan53e08c42010-09-14 05:38:21 +000041#include "gmock/gmock-actions.h"
42#include "gmock/internal/gmock-port.h"
shiqiane35fdd92008-12-10 05:08:54 +000043
44namespace testing {
45namespace internal {
46
47// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary
48// function or method with the unpacked values, where F is a function
49// type that takes N arguments.
50template <typename Result, typename ArgumentTuple>
51class InvokeHelper;
52
53template <typename R>
54class InvokeHelper<R, ::std::tr1::tuple<> > {
55 public:
56 template <typename Function>
57 static R Invoke(Function function, const ::std::tr1::tuple<>&) {
58 return function();
59 }
60
61 template <class Class, typename MethodPtr>
62 static R InvokeMethod(Class* obj_ptr,
63 MethodPtr method_ptr,
64 const ::std::tr1::tuple<>&) {
65 return (obj_ptr->*method_ptr)();
66 }
67};
68
69template <typename R, typename A1>
70class InvokeHelper<R, ::std::tr1::tuple<A1> > {
71 public:
72 template <typename Function>
73 static R Invoke(Function function, const ::std::tr1::tuple<A1>& args) {
74 using ::std::tr1::get;
75 return function(get<0>(args));
76 }
77
78 template <class Class, typename MethodPtr>
79 static R InvokeMethod(Class* obj_ptr,
80 MethodPtr method_ptr,
81 const ::std::tr1::tuple<A1>& args) {
82 using ::std::tr1::get;
83 return (obj_ptr->*method_ptr)(get<0>(args));
84 }
85};
86
87template <typename R, typename A1, typename A2>
88class InvokeHelper<R, ::std::tr1::tuple<A1, A2> > {
89 public:
90 template <typename Function>
91 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2>& args) {
92 using ::std::tr1::get;
93 return function(get<0>(args), get<1>(args));
94 }
95
96 template <class Class, typename MethodPtr>
97 static R InvokeMethod(Class* obj_ptr,
98 MethodPtr method_ptr,
99 const ::std::tr1::tuple<A1, A2>& args) {
100 using ::std::tr1::get;
101 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));
102 }
103};
104
105template <typename R, typename A1, typename A2, typename A3>
106class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3> > {
107 public:
108 template <typename Function>
109 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2,
110 A3>& args) {
111 using ::std::tr1::get;
112 return function(get<0>(args), get<1>(args), get<2>(args));
113 }
114
115 template <class Class, typename MethodPtr>
116 static R InvokeMethod(Class* obj_ptr,
117 MethodPtr method_ptr,
118 const ::std::tr1::tuple<A1, A2, A3>& args) {
119 using ::std::tr1::get;
120 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args));
121 }
122};
123
124template <typename R, typename A1, typename A2, typename A3, typename A4>
125class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4> > {
126 public:
127 template <typename Function>
128 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3,
129 A4>& args) {
130 using ::std::tr1::get;
131 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args));
132 }
133
134 template <class Class, typename MethodPtr>
135 static R InvokeMethod(Class* obj_ptr,
136 MethodPtr method_ptr,
137 const ::std::tr1::tuple<A1, A2, A3, A4>& args) {
138 using ::std::tr1::get;
139 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
140 get<3>(args));
141 }
142};
143
144template <typename R, typename A1, typename A2, typename A3, typename A4,
145 typename A5>
146class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5> > {
147 public:
148 template <typename Function>
149 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
150 A5>& args) {
151 using ::std::tr1::get;
152 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
153 get<4>(args));
154 }
155
156 template <class Class, typename MethodPtr>
157 static R InvokeMethod(Class* obj_ptr,
158 MethodPtr method_ptr,
159 const ::std::tr1::tuple<A1, A2, A3, A4, A5>& args) {
160 using ::std::tr1::get;
161 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
162 get<3>(args), get<4>(args));
163 }
164};
165
166template <typename R, typename A1, typename A2, typename A3, typename A4,
167 typename A5, typename A6>
168class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> > {
169 public:
170 template <typename Function>
171 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
172 A5, A6>& args) {
173 using ::std::tr1::get;
174 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
175 get<4>(args), get<5>(args));
176 }
177
178 template <class Class, typename MethodPtr>
179 static R InvokeMethod(Class* obj_ptr,
180 MethodPtr method_ptr,
181 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6>& args) {
182 using ::std::tr1::get;
183 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
184 get<3>(args), get<4>(args), get<5>(args));
185 }
186};
187
188template <typename R, typename A1, typename A2, typename A3, typename A4,
189 typename A5, typename A6, typename A7>
190class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> > {
191 public:
192 template <typename Function>
193 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
194 A5, A6, A7>& args) {
195 using ::std::tr1::get;
196 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
197 get<4>(args), get<5>(args), get<6>(args));
198 }
199
200 template <class Class, typename MethodPtr>
201 static R InvokeMethod(Class* obj_ptr,
202 MethodPtr method_ptr,
203 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6,
204 A7>& args) {
205 using ::std::tr1::get;
206 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
207 get<3>(args), get<4>(args), get<5>(args), get<6>(args));
208 }
209};
210
211template <typename R, typename A1, typename A2, typename A3, typename A4,
212 typename A5, typename A6, typename A7, typename A8>
213class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {
214 public:
215 template <typename Function>
216 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
217 A5, A6, A7, A8>& args) {
218 using ::std::tr1::get;
219 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
220 get<4>(args), get<5>(args), get<6>(args), get<7>(args));
221 }
222
223 template <class Class, typename MethodPtr>
224 static R InvokeMethod(Class* obj_ptr,
225 MethodPtr method_ptr,
226 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7,
227 A8>& args) {
228 using ::std::tr1::get;
229 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
230 get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args));
231 }
232};
233
234template <typename R, typename A1, typename A2, typename A3, typename A4,
235 typename A5, typename A6, typename A7, typename A8, typename A9>
236class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {
237 public:
238 template <typename Function>
239 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
240 A5, A6, A7, A8, A9>& args) {
241 using ::std::tr1::get;
242 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
243 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args));
244 }
245
246 template <class Class, typename MethodPtr>
247 static R InvokeMethod(Class* obj_ptr,
248 MethodPtr method_ptr,
249 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
250 A9>& args) {
251 using ::std::tr1::get;
252 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
253 get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args),
254 get<8>(args));
255 }
256};
257
258template <typename R, typename A1, typename A2, typename A3, typename A4,
259 typename A5, typename A6, typename A7, typename A8, typename A9,
260 typename A10>
261class InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
262 A10> > {
263 public:
264 template <typename Function>
265 static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
266 A5, A6, A7, A8, A9, A10>& args) {
267 using ::std::tr1::get;
268 return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
269 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
270 get<9>(args));
271 }
272
273 template <class Class, typename MethodPtr>
274 static R InvokeMethod(Class* obj_ptr,
275 MethodPtr method_ptr,
276 const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
277 A9, A10>& args) {
278 using ::std::tr1::get;
279 return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
280 get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args),
281 get<8>(args), get<9>(args));
282 }
283};
284
shiqiane35fdd92008-12-10 05:08:54 +0000285// CallableHelper has static methods for invoking "callables",
286// i.e. function pointers and functors. It uses overloading to
287// provide a uniform interface for invoking different kinds of
288// callables. In particular, you can use:
289//
290// CallableHelper<R>::Call(callable, a1, a2, ..., an)
291//
292// to invoke an n-ary callable, where R is its return type. If an
293// argument, say a2, needs to be passed by reference, you should write
294// ByRef(a2) instead of a2 in the above expression.
295template <typename R>
296class CallableHelper {
297 public:
298 // Calls a nullary callable.
299 template <typename Function>
300 static R Call(Function function) { return function(); }
301
302 // Calls a unary callable.
303
304 // We deliberately pass a1 by value instead of const reference here
305 // in case it is a C-string literal. If we had declared the
306 // parameter as 'const A1& a1' and write Call(function, "Hi"), the
307 // compiler would've thought A1 is 'char[3]', which causes trouble
308 // when you need to copy a value of type A1. By declaring the
309 // parameter as 'A1 a1', the compiler will correctly infer that A1
310 // is 'const char*' when it sees Call(function, "Hi").
311 //
312 // Since this function is defined inline, the compiler can get rid
313 // of the copying of the arguments. Therefore the performance won't
314 // be hurt.
315 template <typename Function, typename A1>
316 static R Call(Function function, A1 a1) { return function(a1); }
317
318 // Calls a binary callable.
319 template <typename Function, typename A1, typename A2>
320 static R Call(Function function, A1 a1, A2 a2) {
321 return function(a1, a2);
322 }
323
324 // Calls a ternary callable.
325 template <typename Function, typename A1, typename A2, typename A3>
326 static R Call(Function function, A1 a1, A2 a2, A3 a3) {
327 return function(a1, a2, a3);
328 }
329
330 // Calls a 4-ary callable.
331 template <typename Function, typename A1, typename A2, typename A3,
332 typename A4>
333 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4) {
334 return function(a1, a2, a3, a4);
335 }
336
337 // Calls a 5-ary callable.
338 template <typename Function, typename A1, typename A2, typename A3,
339 typename A4, typename A5>
340 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
341 return function(a1, a2, a3, a4, a5);
342 }
343
344 // Calls a 6-ary callable.
345 template <typename Function, typename A1, typename A2, typename A3,
346 typename A4, typename A5, typename A6>
347 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
348 return function(a1, a2, a3, a4, a5, a6);
349 }
350
351 // Calls a 7-ary callable.
352 template <typename Function, typename A1, typename A2, typename A3,
353 typename A4, typename A5, typename A6, typename A7>
354 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
355 A7 a7) {
356 return function(a1, a2, a3, a4, a5, a6, a7);
357 }
358
359 // Calls a 8-ary callable.
360 template <typename Function, typename A1, typename A2, typename A3,
361 typename A4, typename A5, typename A6, typename A7, typename A8>
362 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
363 A7 a7, A8 a8) {
364 return function(a1, a2, a3, a4, a5, a6, a7, a8);
365 }
366
367 // Calls a 9-ary callable.
368 template <typename Function, typename A1, typename A2, typename A3,
369 typename A4, typename A5, typename A6, typename A7, typename A8,
370 typename A9>
371 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
372 A7 a7, A8 a8, A9 a9) {
373 return function(a1, a2, a3, a4, a5, a6, a7, a8, a9);
374 }
375
376 // Calls a 10-ary callable.
377 template <typename Function, typename A1, typename A2, typename A3,
378 typename A4, typename A5, typename A6, typename A7, typename A8,
379 typename A9, typename A10>
380 static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
381 A7 a7, A8 a8, A9 a9, A10 a10) {
382 return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
383 }
384
385}; // class CallableHelper
386
shiqiane35fdd92008-12-10 05:08:54 +0000387// An INTERNAL macro for extracting the type of a tuple field. It's
388// subject to change without notice - DO NOT USE IN USER CODE!
zhanyong.wane0d051e2009-02-19 00:33:37 +0000389#define GMOCK_FIELD_(Tuple, N) \
shiqiane35fdd92008-12-10 05:08:54 +0000390 typename ::std::tr1::tuple_element<N, Tuple>::type
391
392// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
393// type of an n-ary function whose i-th (1-based) argument type is the
394// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
395// type, and whose return type is Result. For example,
396// SelectArgs<int, ::std::tr1::tuple<bool, char, double, long>, 0, 3>::type
397// is int(bool, long).
398//
399// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
400// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
401// For example,
402// SelectArgs<int, ::std::tr1::tuple<bool, char, double>, 2, 0>::Select(
403// ::std::tr1::make_tuple(true, 'a', 2.5))
404// returns ::std::tr1::tuple (2.5, true).
405//
406// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
407// in the range [0, 10]. Duplicates are allowed and they don't have
408// to be in an ascending or descending order.
409
410template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
411 int k4, int k5, int k6, int k7, int k8, int k9, int k10>
412class SelectArgs {
413 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000414 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
415 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
416 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
417 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
418 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),
419 GMOCK_FIELD_(ArgumentTuple, k10));
shiqiane35fdd92008-12-10 05:08:54 +0000420 typedef typename Function<type>::ArgumentTuple SelectedArgs;
421 static SelectedArgs Select(const ArgumentTuple& args) {
422 using ::std::tr1::get;
423 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
424 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
425 get<k8>(args), get<k9>(args), get<k10>(args));
426 }
427};
428
429template <typename Result, typename ArgumentTuple>
430class SelectArgs<Result, ArgumentTuple,
431 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
432 public:
433 typedef Result type();
434 typedef typename Function<type>::ArgumentTuple SelectedArgs;
zhanyong.wan3fbd2dd2009-03-26 19:06:45 +0000435 static SelectedArgs Select(const ArgumentTuple& /* args */) {
shiqiane35fdd92008-12-10 05:08:54 +0000436 using ::std::tr1::get;
437 return SelectedArgs();
438 }
439};
440
441template <typename Result, typename ArgumentTuple, int k1>
442class SelectArgs<Result, ArgumentTuple,
443 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
444 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000445 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));
shiqiane35fdd92008-12-10 05:08:54 +0000446 typedef typename Function<type>::ArgumentTuple SelectedArgs;
447 static SelectedArgs Select(const ArgumentTuple& args) {
448 using ::std::tr1::get;
449 return SelectedArgs(get<k1>(args));
450 }
451};
452
453template <typename Result, typename ArgumentTuple, int k1, int k2>
454class SelectArgs<Result, ArgumentTuple,
455 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {
456 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000457 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
458 GMOCK_FIELD_(ArgumentTuple, k2));
shiqiane35fdd92008-12-10 05:08:54 +0000459 typedef typename Function<type>::ArgumentTuple SelectedArgs;
460 static SelectedArgs Select(const ArgumentTuple& args) {
461 using ::std::tr1::get;
462 return SelectedArgs(get<k1>(args), get<k2>(args));
463 }
464};
465
466template <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
467class SelectArgs<Result, ArgumentTuple,
468 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {
469 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000470 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
471 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));
shiqiane35fdd92008-12-10 05:08:54 +0000472 typedef typename Function<type>::ArgumentTuple SelectedArgs;
473 static SelectedArgs Select(const ArgumentTuple& args) {
474 using ::std::tr1::get;
475 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));
476 }
477};
478
479template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
480 int k4>
481class SelectArgs<Result, ArgumentTuple,
482 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {
483 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000484 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
485 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
486 GMOCK_FIELD_(ArgumentTuple, k4));
shiqiane35fdd92008-12-10 05:08:54 +0000487 typedef typename Function<type>::ArgumentTuple SelectedArgs;
488 static SelectedArgs Select(const ArgumentTuple& args) {
489 using ::std::tr1::get;
490 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
491 get<k4>(args));
492 }
493};
494
495template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
496 int k4, int k5>
497class SelectArgs<Result, ArgumentTuple,
498 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {
499 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000500 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
501 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
502 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));
shiqiane35fdd92008-12-10 05:08:54 +0000503 typedef typename Function<type>::ArgumentTuple SelectedArgs;
504 static SelectedArgs Select(const ArgumentTuple& args) {
505 using ::std::tr1::get;
506 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
507 get<k4>(args), get<k5>(args));
508 }
509};
510
511template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
512 int k4, int k5, int k6>
513class SelectArgs<Result, ArgumentTuple,
514 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {
515 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000516 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
517 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
518 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
519 GMOCK_FIELD_(ArgumentTuple, k6));
shiqiane35fdd92008-12-10 05:08:54 +0000520 typedef typename Function<type>::ArgumentTuple SelectedArgs;
521 static SelectedArgs Select(const ArgumentTuple& args) {
522 using ::std::tr1::get;
523 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
524 get<k4>(args), get<k5>(args), get<k6>(args));
525 }
526};
527
528template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
529 int k4, int k5, int k6, int k7>
530class SelectArgs<Result, ArgumentTuple,
531 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {
532 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000533 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
534 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
535 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
536 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));
shiqiane35fdd92008-12-10 05:08:54 +0000537 typedef typename Function<type>::ArgumentTuple SelectedArgs;
538 static SelectedArgs Select(const ArgumentTuple& args) {
539 using ::std::tr1::get;
540 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
541 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));
542 }
543};
544
545template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
546 int k4, int k5, int k6, int k7, int k8>
547class SelectArgs<Result, ArgumentTuple,
548 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {
549 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000550 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
551 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
552 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
553 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
554 GMOCK_FIELD_(ArgumentTuple, k8));
shiqiane35fdd92008-12-10 05:08:54 +0000555 typedef typename Function<type>::ArgumentTuple SelectedArgs;
556 static SelectedArgs Select(const ArgumentTuple& args) {
557 using ::std::tr1::get;
558 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
559 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
560 get<k8>(args));
561 }
562};
563
564template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
565 int k4, int k5, int k6, int k7, int k8, int k9>
566class SelectArgs<Result, ArgumentTuple,
567 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {
568 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000569 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
570 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
571 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
572 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
573 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));
shiqiane35fdd92008-12-10 05:08:54 +0000574 typedef typename Function<type>::ArgumentTuple SelectedArgs;
575 static SelectedArgs Select(const ArgumentTuple& args) {
576 using ::std::tr1::get;
577 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
578 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
579 get<k8>(args), get<k9>(args));
580 }
581};
582
zhanyong.wane0d051e2009-02-19 00:33:37 +0000583#undef GMOCK_FIELD_
shiqiane35fdd92008-12-10 05:08:54 +0000584
585// Implements the WithArgs action.
586template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,
587 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
588 int k9 = -1, int k10 = -1>
589class WithArgsAction {
590 public:
591 explicit WithArgsAction(const InnerAction& action) : action_(action) {}
592
593 template <typename F>
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000594 operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
595
596 private:
597 template <typename F>
598 class Impl : public ActionInterface<F> {
599 public:
shiqiane35fdd92008-12-10 05:08:54 +0000600 typedef typename Function<F>::Result Result;
601 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000602
603 explicit Impl(const InnerAction& action) : action_(action) {}
604
605 virtual Result Perform(const ArgumentTuple& args) {
606 return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,
607 k5, k6, k7, k8, k9, k10>::Select(args));
608 }
609
610 private:
shiqiane35fdd92008-12-10 05:08:54 +0000611 typedef typename SelectArgs<Result, ArgumentTuple,
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000612 k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;
shiqiane35fdd92008-12-10 05:08:54 +0000613
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000614 Action<InnerFunctionType> action_;
615 };
shiqiane35fdd92008-12-10 05:08:54 +0000616
shiqiane35fdd92008-12-10 05:08:54 +0000617 const InnerAction action_;
zhanyong.wan32de5f52009-12-23 00:13:23 +0000618
619 GTEST_DISALLOW_ASSIGN_(WithArgsAction);
shiqiane35fdd92008-12-10 05:08:54 +0000620};
621
shiqian326aa562009-01-09 21:43:57 +0000622// A macro from the ACTION* family (defined later in this file)
623// defines an action that can be used in a mock function. Typically,
624// these actions only care about a subset of the arguments of the mock
625// function. For example, if such an action only uses the second
626// argument, it can be used in any mock function that takes >= 2
627// arguments where the type of the second argument is compatible.
628//
629// Therefore, the action implementation must be prepared to take more
630// arguments than it needs. The ExcessiveArg type is used to
631// represent those excessive arguments. In order to keep the compiler
632// error messages tractable, we define it in the testing namespace
633// instead of testing::internal. However, this is an INTERNAL TYPE
634// and subject to change without notice, so a user MUST NOT USE THIS
635// TYPE DIRECTLY.
636struct ExcessiveArg {};
637
638// A helper class needed for implementing the ACTION* macros.
639template <typename Result, class Impl>
640class ActionHelper {
641 public:
642 static Result Perform(Impl* impl, const ::std::tr1::tuple<>& args) {
643 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000644 return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
shiqian326aa562009-01-09 21:43:57 +0000645 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000646 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
647 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000648 }
649
650 template <typename A0>
651 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0>& args) {
652 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000653 return impl->template gmock_PerformImpl<A0>(args, get<0>(args),
shiqian326aa562009-01-09 21:43:57 +0000654 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000655 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
656 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000657 }
658
659 template <typename A0, typename A1>
660 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1>& args) {
661 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000662 return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),
663 get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
shiqian326aa562009-01-09 21:43:57 +0000664 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000665 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000666 }
667
668 template <typename A0, typename A1, typename A2>
669 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2>& args) {
670 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000671 return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),
672 get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),
673 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
674 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000675 }
676
677 template <typename A0, typename A1, typename A2, typename A3>
678 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2,
679 A3>& args) {
680 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000681 return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),
682 get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),
683 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
684 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000685 }
686
687 template <typename A0, typename A1, typename A2, typename A3, typename A4>
688 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3,
689 A4>& args) {
690 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000691 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
692 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
693 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
694 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000695 }
696
697 template <typename A0, typename A1, typename A2, typename A3, typename A4,
698 typename A5>
699 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
700 A5>& args) {
701 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000702 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
703 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
704 get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
705 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000706 }
707
708 template <typename A0, typename A1, typename A2, typename A3, typename A4,
709 typename A5, typename A6>
710 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
711 A5, A6>& args) {
712 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000713 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
714 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
715 get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),
716 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000717 }
718
719 template <typename A0, typename A1, typename A2, typename A3, typename A4,
720 typename A5, typename A6, typename A7>
721 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
722 A5, A6, A7>& args) {
723 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000724 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
725 A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
726 get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),
727 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000728 }
729
730 template <typename A0, typename A1, typename A2, typename A3, typename A4,
731 typename A5, typename A6, typename A7, typename A8>
732 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
733 A5, A6, A7, A8>& args) {
734 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000735 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
736 A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
737 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
738 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000739 }
740
741 template <typename A0, typename A1, typename A2, typename A3, typename A4,
742 typename A5, typename A6, typename A7, typename A8, typename A9>
743 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
744 A5, A6, A7, A8, A9>& args) {
745 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000746 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
747 A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
748 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
749 get<9>(args));
shiqian326aa562009-01-09 21:43:57 +0000750 }
751};
752
shiqiane35fdd92008-12-10 05:08:54 +0000753} // namespace internal
754
755// Various overloads for Invoke().
756
shiqiane35fdd92008-12-10 05:08:54 +0000757// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
758// the selected arguments of the mock function to an_action and
759// performs it. It serves as an adaptor between actions with
760// different argument lists. C++ doesn't support default arguments for
761// function templates, so we have to overload it.
762template <int k1, typename InnerAction>
763inline internal::WithArgsAction<InnerAction, k1>
764WithArgs(const InnerAction& action) {
765 return internal::WithArgsAction<InnerAction, k1>(action);
766}
767
768template <int k1, int k2, typename InnerAction>
769inline internal::WithArgsAction<InnerAction, k1, k2>
770WithArgs(const InnerAction& action) {
771 return internal::WithArgsAction<InnerAction, k1, k2>(action);
772}
773
774template <int k1, int k2, int k3, typename InnerAction>
775inline internal::WithArgsAction<InnerAction, k1, k2, k3>
776WithArgs(const InnerAction& action) {
777 return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
778}
779
780template <int k1, int k2, int k3, int k4, typename InnerAction>
781inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
782WithArgs(const InnerAction& action) {
783 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
784}
785
786template <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
787inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
788WithArgs(const InnerAction& action) {
789 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
790}
791
792template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
793inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
794WithArgs(const InnerAction& action) {
795 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
796}
797
798template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
799 typename InnerAction>
800inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
801WithArgs(const InnerAction& action) {
802 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
803 k7>(action);
804}
805
806template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
807 typename InnerAction>
808inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
809WithArgs(const InnerAction& action) {
810 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
811 k8>(action);
812}
813
814template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
815 int k9, typename InnerAction>
816inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
817WithArgs(const InnerAction& action) {
818 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
819 k9>(action);
820}
821
822template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
823 int k9, int k10, typename InnerAction>
824inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
825 k9, k10>
826WithArgs(const InnerAction& action) {
827 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
828 k9, k10>(action);
829}
830
831// Creates an action that does actions a1, a2, ..., sequentially in
832// each invocation.
833template <typename Action1, typename Action2>
834inline internal::DoBothAction<Action1, Action2>
835DoAll(Action1 a1, Action2 a2) {
836 return internal::DoBothAction<Action1, Action2>(a1, a2);
837}
838
839template <typename Action1, typename Action2, typename Action3>
840inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
841 Action3> >
842DoAll(Action1 a1, Action2 a2, Action3 a3) {
843 return DoAll(a1, DoAll(a2, a3));
844}
845
846template <typename Action1, typename Action2, typename Action3,
847 typename Action4>
848inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
849 internal::DoBothAction<Action3, Action4> > >
850DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
851 return DoAll(a1, DoAll(a2, a3, a4));
852}
853
854template <typename Action1, typename Action2, typename Action3,
855 typename Action4, typename Action5>
856inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
857 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
858 Action5> > > >
859DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
860 return DoAll(a1, DoAll(a2, a3, a4, a5));
861}
862
863template <typename Action1, typename Action2, typename Action3,
864 typename Action4, typename Action5, typename Action6>
865inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
866 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
867 internal::DoBothAction<Action5, Action6> > > > >
868DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
869 return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
870}
871
872template <typename Action1, typename Action2, typename Action3,
873 typename Action4, typename Action5, typename Action6, typename Action7>
874inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
875 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
876 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
877 Action7> > > > > >
878DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
879 Action7 a7) {
880 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));
881}
882
883template <typename Action1, typename Action2, typename Action3,
884 typename Action4, typename Action5, typename Action6, typename Action7,
885 typename Action8>
886inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
887 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
888 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
889 internal::DoBothAction<Action7, Action8> > > > > > >
890DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
891 Action7 a7, Action8 a8) {
892 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));
893}
894
895template <typename Action1, typename Action2, typename Action3,
896 typename Action4, typename Action5, typename Action6, typename Action7,
897 typename Action8, typename Action9>
898inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
899 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
900 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
901 internal::DoBothAction<Action7, internal::DoBothAction<Action8,
902 Action9> > > > > > > >
903DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
904 Action7 a7, Action8 a8, Action9 a9) {
905 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));
906}
907
908template <typename Action1, typename Action2, typename Action3,
909 typename Action4, typename Action5, typename Action6, typename Action7,
910 typename Action8, typename Action9, typename Action10>
911inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
912 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
913 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
914 internal::DoBothAction<Action7, internal::DoBothAction<Action8,
915 internal::DoBothAction<Action9, Action10> > > > > > > > >
916DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
917 Action7 a7, Action8 a8, Action9 a9, Action10 a10) {
918 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));
919}
920
921} // namespace testing
922
shiqian326aa562009-01-09 21:43:57 +0000923// The ACTION* family of macros can be used in a namespace scope to
924// define custom actions easily. The syntax:
925//
926// ACTION(name) { statements; }
927//
928// will define an action with the given name that executes the
929// statements. The value returned by the statements will be used as
930// the return value of the action. Inside the statements, you can
931// refer to the K-th (0-based) argument of the mock function by
932// 'argK', and refer to its type by 'argK_type'. For example:
933//
934// ACTION(IncrementArg1) {
935// arg1_type temp = arg1;
936// return ++(*temp);
937// }
938//
939// allows you to write
940//
941// ...WillOnce(IncrementArg1());
942//
943// You can also refer to the entire argument tuple and its type by
944// 'args' and 'args_type', and refer to the mock function type and its
945// return type by 'function_type' and 'return_type'.
946//
947// Note that you don't need to specify the types of the mock function
948// arguments. However rest assured that your code is still type-safe:
949// you'll get a compiler error if *arg1 doesn't support the ++
950// operator, or if the type of ++(*arg1) isn't compatible with the
951// mock function's return type, for example.
952//
953// Sometimes you'll want to parameterize the action. For that you can use
954// another macro:
955//
956// ACTION_P(name, param_name) { statements; }
957//
958// For example:
959//
960// ACTION_P(Add, n) { return arg0 + n; }
961//
962// will allow you to write:
963//
964// ...WillOnce(Add(5));
965//
966// Note that you don't need to provide the type of the parameter
967// either. If you need to reference the type of a parameter named
968// 'foo', you can write 'foo_type'. For example, in the body of
969// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
970// of 'n'.
971//
972// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
973// multi-parameter actions.
974//
975// For the purpose of typing, you can view
976//
977// ACTION_Pk(Foo, p1, ..., pk) { ... }
978//
979// as shorthand for
980//
981// template <typename p1_type, ..., typename pk_type>
982// FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
983//
984// In particular, you can provide the template type arguments
985// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
986// although usually you can rely on the compiler to infer the types
987// for you automatically. You can assign the result of expression
988// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
989// pk_type>. This can be useful when composing actions.
990//
991// You can also overload actions with different numbers of parameters:
992//
993// ACTION_P(Plus, a) { ... }
994// ACTION_P2(Plus, a, b) { ... }
995//
996// While it's tempting to always use the ACTION* macros when defining
997// a new action, you should also consider implementing ActionInterface
998// or using MakePolymorphicAction() instead, especially if you need to
999// use the action a lot. While these approaches require more work,
1000// they give you more control on the types of the mock function
1001// arguments and the action parameters, which in general leads to
1002// better compiler error messages that pay off in the long run. They
1003// also allow overloading actions based on parameter types (as opposed
1004// to just based on the number of parameters).
1005//
1006// CAVEAT:
1007//
1008// ACTION*() can only be used in a namespace scope. The reason is
1009// that C++ doesn't yet allow function-local types to be used to
1010// instantiate templates. The up-coming C++0x standard will fix this.
1011// Once that's done, we'll consider supporting using ACTION*() inside
1012// a function.
1013//
1014// MORE INFORMATION:
1015//
1016// To learn more about using these macros, please search for 'ACTION'
1017// on http://code.google.com/p/googlemock/wiki/CookBook.
1018
zhanyong.wan33c0af02009-04-03 00:10:12 +00001019// An internal macro needed for implementing ACTION*().
1020#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
1021 const args_type& args GTEST_ATTRIBUTE_UNUSED_,\
1022 arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_,\
1023 arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_,\
1024 arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_,\
1025 arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_,\
1026 arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_,\
1027 arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_,\
1028 arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_,\
1029 arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_,\
1030 arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_,\
1031 arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
1032
zhanyong.wan18490652009-05-11 18:54:08 +00001033// Sometimes you want to give an action explicit template parameters
1034// that cannot be inferred from its value parameters. ACTION() and
1035// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that
1036// and can be viewed as an extension to ACTION() and ACTION_P*().
1037//
1038// The syntax:
1039//
1040// ACTION_TEMPLATE(ActionName,
1041// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
1042// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
1043//
1044// defines an action template that takes m explicit template
1045// parameters and n value parameters. name_i is the name of the i-th
1046// template parameter, and kind_i specifies whether it's a typename,
1047// an integral constant, or a template. p_i is the name of the i-th
1048// value parameter.
1049//
1050// Example:
1051//
1052// // DuplicateArg<k, T>(output) converts the k-th argument of the mock
1053// // function to type T and copies it to *output.
1054// ACTION_TEMPLATE(DuplicateArg,
1055// HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
1056// AND_1_VALUE_PARAMS(output)) {
1057// *output = T(std::tr1::get<k>(args));
1058// }
1059// ...
1060// int n;
1061// EXPECT_CALL(mock, Foo(_, _))
1062// .WillOnce(DuplicateArg<1, unsigned char>(&n));
1063//
1064// To create an instance of an action template, write:
1065//
1066// ActionName<t1, ..., t_m>(v1, ..., v_n)
1067//
1068// where the ts are the template arguments and the vs are the value
1069// arguments. The value argument types are inferred by the compiler.
1070// If you want to explicitly specify the value argument types, you can
1071// provide additional template arguments:
1072//
1073// ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
1074//
1075// where u_i is the desired type of v_i.
1076//
1077// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the
1078// number of value parameters, but not on the number of template
1079// parameters. Without the restriction, the meaning of the following
1080// is unclear:
1081//
1082// OverloadedAction<int, bool>(x);
1083//
1084// Are we using a single-template-parameter action where 'bool' refers
1085// to the type of x, or are we using a two-template-parameter action
1086// where the compiler is asked to infer the type of x?
1087//
1088// Implementation notes:
1089//
1090// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and
1091// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for
1092// implementing ACTION_TEMPLATE. The main trick we use is to create
1093// new macro invocations when expanding a macro. For example, we have
1094//
1095// #define ACTION_TEMPLATE(name, template_params, value_params)
1096// ... GMOCK_INTERNAL_DECL_##template_params ...
1097//
1098// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)
1099// to expand to
1100//
1101// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...
1102//
1103// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the
1104// preprocessor will continue to expand it to
1105//
1106// ... typename T ...
1107//
1108// This technique conforms to the C++ standard and is portable. It
1109// allows us to implement action templates using O(N) code, where N is
1110// the maximum number of template/value parameters supported. Without
1111// using it, we'd have to devote O(N^2) amount of code to implement all
1112// combinations of m and n.
1113
1114// Declares the template parameters.
1115#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0
1116#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1117 name1) kind0 name0, kind1 name1
1118#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1119 kind2, name2) kind0 name0, kind1 name1, kind2 name2
1120#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1121 kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \
1122 kind3 name3
1123#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1124 kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \
1125 kind2 name2, kind3 name3, kind4 name4
1126#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1127 kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \
1128 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5
1129#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1130 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1131 name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \
1132 kind5 name5, kind6 name6
1133#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1134 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1135 kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \
1136 kind4 name4, kind5 name5, kind6 name6, kind7 name7
1137#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1138 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1139 kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \
1140 kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \
1141 kind8 name8
1142#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1143 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1144 name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \
1145 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \
1146 kind6 name6, kind7 name7, kind8 name8, kind9 name9
1147
1148// Lists the template parameters.
1149#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0
1150#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1151 name1) name0, name1
1152#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1153 kind2, name2) name0, name1, name2
1154#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1155 kind2, name2, kind3, name3) name0, name1, name2, name3
1156#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1157 kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \
1158 name4
1159#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1160 kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \
1161 name2, name3, name4, name5
1162#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1163 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1164 name6) name0, name1, name2, name3, name4, name5, name6
1165#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1166 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1167 kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7
1168#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1169 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1170 kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \
1171 name6, name7, name8
1172#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1173 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1174 name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \
1175 name3, name4, name5, name6, name7, name8, name9
1176
1177// Declares the types of value parameters.
1178#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()
1179#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type
1180#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \
1181 typename p0##_type, typename p1##_type
1182#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \
1183 typename p0##_type, typename p1##_type, typename p2##_type
1184#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1185 typename p0##_type, typename p1##_type, typename p2##_type, \
1186 typename p3##_type
1187#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1188 typename p0##_type, typename p1##_type, typename p2##_type, \
1189 typename p3##_type, typename p4##_type
1190#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1191 typename p0##_type, typename p1##_type, typename p2##_type, \
1192 typename p3##_type, typename p4##_type, typename p5##_type
1193#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1194 p6) , typename p0##_type, typename p1##_type, typename p2##_type, \
1195 typename p3##_type, typename p4##_type, typename p5##_type, \
1196 typename p6##_type
1197#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1198 p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \
1199 typename p3##_type, typename p4##_type, typename p5##_type, \
1200 typename p6##_type, typename p7##_type
1201#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1202 p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \
1203 typename p3##_type, typename p4##_type, typename p5##_type, \
1204 typename p6##_type, typename p7##_type, typename p8##_type
1205#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1206 p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \
1207 typename p2##_type, typename p3##_type, typename p4##_type, \
1208 typename p5##_type, typename p6##_type, typename p7##_type, \
1209 typename p8##_type, typename p9##_type
1210
1211// Initializes the value parameters.
1212#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\
1213 ()
1214#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\
1215 (p0##_type gmock_p0) : p0(gmock_p0)
1216#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\
1217 (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1)
1218#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\
1219 (p0##_type gmock_p0, p1##_type gmock_p1, \
1220 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2)
1221#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\
1222 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1223 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1224 p3(gmock_p3)
1225#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\
1226 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1227 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \
1228 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4)
1229#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\
1230 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1231 p3##_type gmock_p3, p4##_type gmock_p4, \
1232 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1233 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5)
1234#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\
1235 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1236 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1237 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1238 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6)
1239#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\
1240 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1241 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1242 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \
1243 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1244 p7(gmock_p7)
1245#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1246 p7, p8)\
1247 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1248 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1249 p6##_type gmock_p6, p7##_type gmock_p7, \
1250 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1251 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1252 p8(gmock_p8)
1253#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1254 p7, p8, p9)\
1255 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1256 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1257 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
1258 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1259 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1260 p8(gmock_p8), p9(gmock_p9)
1261
1262// Declares the fields for storing the value parameters.
1263#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()
1264#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;
1265#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \
1266 p1##_type p1;
1267#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \
1268 p1##_type p1; p2##_type p2;
1269#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \
1270 p1##_type p1; p2##_type p2; p3##_type p3;
1271#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1272 p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;
1273#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1274 p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1275 p5##_type p5;
1276#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1277 p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1278 p5##_type p5; p6##_type p6;
1279#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1280 p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1281 p5##_type p5; p6##_type p6; p7##_type p7;
1282#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1283 p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1284 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;
1285#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1286 p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1287 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \
1288 p9##_type p9;
1289
1290// Lists the value parameters.
1291#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()
1292#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0
1293#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1
1294#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2
1295#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3
1296#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \
1297 p2, p3, p4
1298#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \
1299 p1, p2, p3, p4, p5
1300#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1301 p6) p0, p1, p2, p3, p4, p5, p6
1302#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1303 p7) p0, p1, p2, p3, p4, p5, p6, p7
1304#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1305 p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8
1306#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1307 p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
1308
1309// Lists the value parameter types.
1310#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()
1311#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type
1312#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \
1313 p1##_type
1314#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \
1315 p1##_type, p2##_type
1316#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1317 p0##_type, p1##_type, p2##_type, p3##_type
1318#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1319 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type
1320#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1321 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type
1322#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1323 p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \
1324 p6##_type
1325#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1326 p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1327 p5##_type, p6##_type, p7##_type
1328#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1329 p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1330 p5##_type, p6##_type, p7##_type, p8##_type
1331#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1332 p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1333 p5##_type, p6##_type, p7##_type, p8##_type, p9##_type
1334
1335// Declares the value parameters.
1336#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()
1337#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0
1338#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \
1339 p1##_type p1
1340#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \
1341 p1##_type p1, p2##_type p2
1342#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \
1343 p1##_type p1, p2##_type p2, p3##_type p3
1344#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1345 p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4
1346#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1347 p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1348 p5##_type p5
1349#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1350 p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1351 p5##_type p5, p6##_type p6
1352#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1353 p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1354 p5##_type p5, p6##_type p6, p7##_type p7
1355#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1356 p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1357 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8
1358#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1359 p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1360 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
1361 p9##_type p9
1362
1363// The suffix of the class template implementing the action template.
1364#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()
1365#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P
1366#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
1367#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3
1368#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4
1369#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5
1370#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6
1371#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7
1372#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1373 p7) P8
1374#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1375 p7, p8) P9
1376#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1377 p7, p8, p9) P10
1378
1379// The name of the class template implementing the action template.
1380#define GMOCK_ACTION_CLASS_(name, value_params)\
zhanyong.wanccedc1c2010-08-09 22:46:12 +00001381 GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
zhanyong.wan18490652009-05-11 18:54:08 +00001382
1383#define ACTION_TEMPLATE(name, template_params, value_params)\
1384 template <GMOCK_INTERNAL_DECL_##template_params\
1385 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1386 class GMOCK_ACTION_CLASS_(name, value_params) {\
1387 public:\
1388 GMOCK_ACTION_CLASS_(name, value_params)\
1389 GMOCK_INTERNAL_INIT_##value_params {}\
1390 template <typename F>\
1391 class gmock_Impl : public ::testing::ActionInterface<F> {\
1392 public:\
1393 typedef F function_type;\
1394 typedef typename ::testing::internal::Function<F>::Result return_type;\
1395 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1396 args_type;\
1397 explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
1398 virtual return_type Perform(const args_type& args) {\
1399 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1400 Perform(this, args);\
1401 }\
1402 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1403 typename arg3_type, typename arg4_type, typename arg5_type, \
1404 typename arg6_type, typename arg7_type, typename arg8_type, \
1405 typename arg9_type>\
1406 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1407 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1408 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1409 arg9_type arg9) const;\
1410 GMOCK_INTERNAL_DEFN_##value_params\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001411 private:\
1412 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
zhanyong.wan18490652009-05-11 18:54:08 +00001413 };\
1414 template <typename F> operator ::testing::Action<F>() const {\
1415 return ::testing::Action<F>(\
1416 new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\
1417 }\
1418 GMOCK_INTERNAL_DEFN_##value_params\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001419 private:\
1420 GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\
zhanyong.wan18490652009-05-11 18:54:08 +00001421 };\
1422 template <GMOCK_INTERNAL_DECL_##template_params\
1423 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1424 inline GMOCK_ACTION_CLASS_(name, value_params)<\
1425 GMOCK_INTERNAL_LIST_##template_params\
1426 GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\
1427 GMOCK_INTERNAL_DECL_##value_params) {\
1428 return GMOCK_ACTION_CLASS_(name, value_params)<\
1429 GMOCK_INTERNAL_LIST_##template_params\
1430 GMOCK_INTERNAL_LIST_TYPE_##value_params>(\
1431 GMOCK_INTERNAL_LIST_##value_params);\
1432 }\
1433 template <GMOCK_INTERNAL_DECL_##template_params\
1434 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1435 template <typename F>\
1436 template <typename arg0_type, typename arg1_type, typename arg2_type,\
1437 typename arg3_type, typename arg4_type, typename arg5_type,\
1438 typename arg6_type, typename arg7_type, typename arg8_type,\
1439 typename arg9_type>\
1440 typename ::testing::internal::Function<F>::Result\
1441 GMOCK_ACTION_CLASS_(name, value_params)<\
1442 GMOCK_INTERNAL_LIST_##template_params\
1443 GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\
1444 gmock_PerformImpl(\
1445 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1446
shiqian326aa562009-01-09 21:43:57 +00001447#define ACTION(name)\
1448 class name##Action {\
1449 public:\
1450 name##Action() {}\
1451 template <typename F>\
1452 class gmock_Impl : public ::testing::ActionInterface<F> {\
1453 public:\
1454 typedef F function_type;\
1455 typedef typename ::testing::internal::Function<F>::Result return_type;\
1456 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1457 args_type;\
1458 gmock_Impl() {}\
1459 virtual return_type Perform(const args_type& args) {\
1460 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1461 Perform(this, args);\
1462 }\
1463 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1464 typename arg3_type, typename arg4_type, typename arg5_type, \
1465 typename arg6_type, typename arg7_type, typename arg8_type, \
1466 typename arg9_type>\
1467 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1468 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1469 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1470 arg9_type arg9) const;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001471 private:\
1472 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001473 };\
1474 template <typename F> operator ::testing::Action<F>() const {\
1475 return ::testing::Action<F>(new gmock_Impl<F>());\
1476 }\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001477 private:\
1478 GTEST_DISALLOW_ASSIGN_(name##Action);\
shiqian326aa562009-01-09 21:43:57 +00001479 };\
1480 inline name##Action name() {\
1481 return name##Action();\
1482 }\
1483 template <typename F>\
1484 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1485 typename arg3_type, typename arg4_type, typename arg5_type, \
1486 typename arg6_type, typename arg7_type, typename arg8_type, \
1487 typename arg9_type>\
1488 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001489 name##Action::gmock_Impl<F>::gmock_PerformImpl(\
1490 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001491
1492#define ACTION_P(name, p0)\
1493 template <typename p0##_type>\
1494 class name##ActionP {\
1495 public:\
1496 name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\
1497 template <typename F>\
1498 class gmock_Impl : public ::testing::ActionInterface<F> {\
1499 public:\
1500 typedef F function_type;\
1501 typedef typename ::testing::internal::Function<F>::Result return_type;\
1502 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1503 args_type;\
1504 explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\
1505 virtual return_type Perform(const args_type& args) {\
1506 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1507 Perform(this, args);\
1508 }\
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 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1514 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1515 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1516 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001517 p0##_type p0;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001518 private:\
1519 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001520 };\
1521 template <typename F> operator ::testing::Action<F>() const {\
1522 return ::testing::Action<F>(new gmock_Impl<F>(p0));\
1523 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001524 p0##_type p0;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001525 private:\
1526 GTEST_DISALLOW_ASSIGN_(name##ActionP);\
shiqian326aa562009-01-09 21:43:57 +00001527 };\
1528 template <typename p0##_type>\
1529 inline name##ActionP<p0##_type> name(p0##_type p0) {\
1530 return name##ActionP<p0##_type>(p0);\
1531 }\
1532 template <typename p0##_type>\
1533 template <typename F>\
1534 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1535 typename arg3_type, typename arg4_type, typename arg5_type, \
1536 typename arg6_type, typename arg7_type, typename arg8_type, \
1537 typename arg9_type>\
1538 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001539 name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1540 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001541
1542#define ACTION_P2(name, p0, p1)\
1543 template <typename p0##_type, typename p1##_type>\
1544 class name##ActionP2 {\
1545 public:\
1546 name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1547 p1(gmock_p1) {}\
1548 template <typename F>\
1549 class gmock_Impl : public ::testing::ActionInterface<F> {\
1550 public:\
1551 typedef F function_type;\
1552 typedef typename ::testing::internal::Function<F>::Result return_type;\
1553 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1554 args_type;\
1555 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1556 p1(gmock_p1) {}\
1557 virtual return_type Perform(const args_type& args) {\
1558 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1559 Perform(this, args);\
1560 }\
1561 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1562 typename arg3_type, typename arg4_type, typename arg5_type, \
1563 typename arg6_type, typename arg7_type, typename arg8_type, \
1564 typename arg9_type>\
1565 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1566 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1567 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1568 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001569 p0##_type p0;\
1570 p1##_type p1;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001571 private:\
1572 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001573 };\
1574 template <typename F> operator ::testing::Action<F>() const {\
1575 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\
1576 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001577 p0##_type p0;\
1578 p1##_type p1;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001579 private:\
1580 GTEST_DISALLOW_ASSIGN_(name##ActionP2);\
shiqian326aa562009-01-09 21:43:57 +00001581 };\
1582 template <typename p0##_type, typename p1##_type>\
1583 inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \
1584 p1##_type p1) {\
1585 return name##ActionP2<p0##_type, p1##_type>(p0, p1);\
1586 }\
1587 template <typename p0##_type, typename p1##_type>\
1588 template <typename F>\
1589 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1590 typename arg3_type, typename arg4_type, typename arg5_type, \
1591 typename arg6_type, typename arg7_type, typename arg8_type, \
1592 typename arg9_type>\
1593 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001594 name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1595 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001596
1597#define ACTION_P3(name, p0, p1, p2)\
1598 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1599 class name##ActionP3 {\
1600 public:\
1601 name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1602 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1603 template <typename F>\
1604 class gmock_Impl : public ::testing::ActionInterface<F> {\
1605 public:\
1606 typedef F function_type;\
1607 typedef typename ::testing::internal::Function<F>::Result return_type;\
1608 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1609 args_type;\
1610 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \
1611 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1612 virtual return_type Perform(const args_type& args) {\
1613 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1614 Perform(this, args);\
1615 }\
1616 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1617 typename arg3_type, typename arg4_type, typename arg5_type, \
1618 typename arg6_type, typename arg7_type, typename arg8_type, \
1619 typename arg9_type>\
1620 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1621 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1622 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1623 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001624 p0##_type p0;\
1625 p1##_type p1;\
1626 p2##_type p2;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001627 private:\
1628 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001629 };\
1630 template <typename F> operator ::testing::Action<F>() const {\
1631 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\
1632 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001633 p0##_type p0;\
1634 p1##_type p1;\
1635 p2##_type p2;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001636 private:\
1637 GTEST_DISALLOW_ASSIGN_(name##ActionP3);\
shiqian326aa562009-01-09 21:43:57 +00001638 };\
1639 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1640 inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1641 p1##_type p1, p2##_type p2) {\
1642 return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1643 }\
1644 template <typename p0##_type, typename p1##_type, typename p2##_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\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001651 name##ActionP3<p0##_type, p1##_type, \
1652 p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1653 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001654
1655#define ACTION_P4(name, p0, p1, p2, p3)\
1656 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1657 typename p3##_type>\
1658 class name##ActionP4 {\
1659 public:\
1660 name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1661 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1662 p2(gmock_p2), p3(gmock_p3) {}\
1663 template <typename F>\
1664 class gmock_Impl : public ::testing::ActionInterface<F> {\
1665 public:\
1666 typedef F function_type;\
1667 typedef typename ::testing::internal::Function<F>::Result return_type;\
1668 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1669 args_type;\
1670 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1671 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1672 p3(gmock_p3) {}\
1673 virtual return_type Perform(const args_type& args) {\
1674 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1675 Perform(this, args);\
1676 }\
1677 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1678 typename arg3_type, typename arg4_type, typename arg5_type, \
1679 typename arg6_type, typename arg7_type, typename arg8_type, \
1680 typename arg9_type>\
1681 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1682 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1683 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1684 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001685 p0##_type p0;\
1686 p1##_type p1;\
1687 p2##_type p2;\
1688 p3##_type p3;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001689 private:\
1690 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001691 };\
1692 template <typename F> operator ::testing::Action<F>() const {\
1693 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\
1694 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001695 p0##_type p0;\
1696 p1##_type p1;\
1697 p2##_type p2;\
1698 p3##_type p3;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001699 private:\
1700 GTEST_DISALLOW_ASSIGN_(name##ActionP4);\
shiqian326aa562009-01-09 21:43:57 +00001701 };\
1702 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1703 typename p3##_type>\
1704 inline name##ActionP4<p0##_type, p1##_type, p2##_type, \
1705 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1706 p3##_type p3) {\
1707 return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \
1708 p2, p3);\
1709 }\
1710 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1711 typename p3##_type>\
1712 template <typename F>\
1713 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1714 typename arg3_type, typename arg4_type, typename arg5_type, \
1715 typename arg6_type, typename arg7_type, typename arg8_type, \
1716 typename arg9_type>\
1717 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001718 name##ActionP4<p0##_type, p1##_type, p2##_type, \
1719 p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1720 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001721
1722#define ACTION_P5(name, p0, p1, p2, p3, p4)\
1723 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1724 typename p3##_type, typename p4##_type>\
1725 class name##ActionP5 {\
1726 public:\
1727 name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1728 p2##_type gmock_p2, p3##_type gmock_p3, \
1729 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1730 p3(gmock_p3), p4(gmock_p4) {}\
1731 template <typename F>\
1732 class gmock_Impl : public ::testing::ActionInterface<F> {\
1733 public:\
1734 typedef F function_type;\
1735 typedef typename ::testing::internal::Function<F>::Result return_type;\
1736 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1737 args_type;\
1738 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1739 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \
1740 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\
1741 virtual return_type Perform(const args_type& args) {\
1742 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1743 Perform(this, args);\
1744 }\
1745 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1746 typename arg3_type, typename arg4_type, typename arg5_type, \
1747 typename arg6_type, typename arg7_type, typename arg8_type, \
1748 typename arg9_type>\
1749 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1750 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1751 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1752 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001753 p0##_type p0;\
1754 p1##_type p1;\
1755 p2##_type p2;\
1756 p3##_type p3;\
1757 p4##_type p4;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001758 private:\
1759 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001760 };\
1761 template <typename F> operator ::testing::Action<F>() const {\
1762 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\
1763 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001764 p0##_type p0;\
1765 p1##_type p1;\
1766 p2##_type p2;\
1767 p3##_type p3;\
1768 p4##_type p4;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001769 private:\
1770 GTEST_DISALLOW_ASSIGN_(name##ActionP5);\
shiqian326aa562009-01-09 21:43:57 +00001771 };\
1772 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1773 typename p3##_type, typename p4##_type>\
1774 inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1775 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1776 p4##_type p4) {\
1777 return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1778 p4##_type>(p0, p1, p2, p3, p4);\
1779 }\
1780 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1781 typename p3##_type, typename p4##_type>\
1782 template <typename F>\
1783 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1784 typename arg3_type, typename arg4_type, typename arg5_type, \
1785 typename arg6_type, typename arg7_type, typename arg8_type, \
1786 typename arg9_type>\
1787 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001788 name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1789 p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1790 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001791
1792#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\
1793 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1794 typename p3##_type, typename p4##_type, typename p5##_type>\
1795 class name##ActionP6 {\
1796 public:\
1797 name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1798 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1799 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1800 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1801 template <typename F>\
1802 class gmock_Impl : public ::testing::ActionInterface<F> {\
1803 public:\
1804 typedef F function_type;\
1805 typedef typename ::testing::internal::Function<F>::Result return_type;\
1806 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1807 args_type;\
1808 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1809 p3##_type gmock_p3, p4##_type gmock_p4, \
1810 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1811 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1812 virtual return_type Perform(const args_type& args) {\
1813 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1814 Perform(this, args);\
1815 }\
1816 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1817 typename arg3_type, typename arg4_type, typename arg5_type, \
1818 typename arg6_type, typename arg7_type, typename arg8_type, \
1819 typename arg9_type>\
1820 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1821 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1822 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1823 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001824 p0##_type p0;\
1825 p1##_type p1;\
1826 p2##_type p2;\
1827 p3##_type p3;\
1828 p4##_type p4;\
1829 p5##_type p5;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001830 private:\
1831 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001832 };\
1833 template <typename F> operator ::testing::Action<F>() const {\
1834 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\
1835 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001836 p0##_type p0;\
1837 p1##_type p1;\
1838 p2##_type p2;\
1839 p3##_type p3;\
1840 p4##_type p4;\
1841 p5##_type p5;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001842 private:\
1843 GTEST_DISALLOW_ASSIGN_(name##ActionP6);\
shiqian326aa562009-01-09 21:43:57 +00001844 };\
1845 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1846 typename p3##_type, typename p4##_type, typename p5##_type>\
1847 inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1848 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1849 p3##_type p3, p4##_type p4, p5##_type p5) {\
1850 return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1851 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1852 }\
1853 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1854 typename p3##_type, typename p4##_type, typename p5##_type>\
1855 template <typename F>\
1856 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1857 typename arg3_type, typename arg4_type, typename arg5_type, \
1858 typename arg6_type, typename arg7_type, typename arg8_type, \
1859 typename arg9_type>\
1860 typename ::testing::internal::Function<F>::Result\
1861 name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00001862 p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1863 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001864
1865#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\
1866 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1867 typename p3##_type, typename p4##_type, typename p5##_type, \
1868 typename p6##_type>\
1869 class name##ActionP7 {\
1870 public:\
1871 name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1872 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1873 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1874 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1875 p6(gmock_p6) {}\
1876 template <typename F>\
1877 class gmock_Impl : public ::testing::ActionInterface<F> {\
1878 public:\
1879 typedef F function_type;\
1880 typedef typename ::testing::internal::Function<F>::Result return_type;\
1881 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1882 args_type;\
1883 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1884 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1885 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1886 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
1887 virtual return_type Perform(const args_type& args) {\
1888 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1889 Perform(this, args);\
1890 }\
1891 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1892 typename arg3_type, typename arg4_type, typename arg5_type, \
1893 typename arg6_type, typename arg7_type, typename arg8_type, \
1894 typename arg9_type>\
1895 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1896 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1897 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1898 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001899 p0##_type p0;\
1900 p1##_type p1;\
1901 p2##_type p2;\
1902 p3##_type p3;\
1903 p4##_type p4;\
1904 p5##_type p5;\
1905 p6##_type p6;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001906 private:\
1907 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001908 };\
1909 template <typename F> operator ::testing::Action<F>() const {\
1910 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1911 p6));\
1912 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001913 p0##_type p0;\
1914 p1##_type p1;\
1915 p2##_type p2;\
1916 p3##_type p3;\
1917 p4##_type p4;\
1918 p5##_type p5;\
1919 p6##_type p6;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001920 private:\
1921 GTEST_DISALLOW_ASSIGN_(name##ActionP7);\
shiqian326aa562009-01-09 21:43:57 +00001922 };\
1923 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1924 typename p3##_type, typename p4##_type, typename p5##_type, \
1925 typename p6##_type>\
1926 inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1927 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1928 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1929 p6##_type p6) {\
1930 return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1931 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1932 }\
1933 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1934 typename p3##_type, typename p4##_type, typename p5##_type, \
1935 typename p6##_type>\
1936 template <typename F>\
1937 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1938 typename arg3_type, typename arg4_type, typename arg5_type, \
1939 typename arg6_type, typename arg7_type, typename arg8_type, \
1940 typename arg9_type>\
1941 typename ::testing::internal::Function<F>::Result\
1942 name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00001943 p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1944 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001945
1946#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\
1947 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1948 typename p3##_type, typename p4##_type, typename p5##_type, \
1949 typename p6##_type, typename p7##_type>\
1950 class name##ActionP8 {\
1951 public:\
1952 name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1953 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1954 p5##_type gmock_p5, p6##_type gmock_p6, \
1955 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1956 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1957 p7(gmock_p7) {}\
1958 template <typename F>\
1959 class gmock_Impl : public ::testing::ActionInterface<F> {\
1960 public:\
1961 typedef F function_type;\
1962 typedef typename ::testing::internal::Function<F>::Result return_type;\
1963 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1964 args_type;\
1965 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1966 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1967 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \
1968 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \
1969 p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
1970 virtual return_type Perform(const args_type& args) {\
1971 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1972 Perform(this, args);\
1973 }\
1974 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1975 typename arg3_type, typename arg4_type, typename arg5_type, \
1976 typename arg6_type, typename arg7_type, typename arg8_type, \
1977 typename arg9_type>\
1978 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1979 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1980 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1981 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001982 p0##_type p0;\
1983 p1##_type p1;\
1984 p2##_type p2;\
1985 p3##_type p3;\
1986 p4##_type p4;\
1987 p5##_type p5;\
1988 p6##_type p6;\
1989 p7##_type p7;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001990 private:\
1991 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001992 };\
1993 template <typename F> operator ::testing::Action<F>() const {\
1994 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1995 p6, p7));\
1996 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001997 p0##_type p0;\
1998 p1##_type p1;\
1999 p2##_type p2;\
2000 p3##_type p3;\
2001 p4##_type p4;\
2002 p5##_type p5;\
2003 p6##_type p6;\
2004 p7##_type p7;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002005 private:\
2006 GTEST_DISALLOW_ASSIGN_(name##ActionP8);\
shiqian326aa562009-01-09 21:43:57 +00002007 };\
2008 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2009 typename p3##_type, typename p4##_type, typename p5##_type, \
2010 typename p6##_type, typename p7##_type>\
2011 inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2012 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
2013 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
2014 p6##_type p6, p7##_type p7) {\
2015 return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2016 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
2017 p6, p7);\
2018 }\
2019 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2020 typename p3##_type, typename p4##_type, typename p5##_type, \
2021 typename p6##_type, typename p7##_type>\
2022 template <typename F>\
2023 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2024 typename arg3_type, typename arg4_type, typename arg5_type, \
2025 typename arg6_type, typename arg7_type, typename arg8_type, \
2026 typename arg9_type>\
2027 typename ::testing::internal::Function<F>::Result\
2028 name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00002029 p5##_type, p6##_type, \
2030 p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2031 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00002032
2033#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
2034 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2035 typename p3##_type, typename p4##_type, typename p5##_type, \
2036 typename p6##_type, typename p7##_type, typename p8##_type>\
2037 class name##ActionP9 {\
2038 public:\
2039 name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \
2040 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2041 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2042 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2043 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2044 p8(gmock_p8) {}\
2045 template <typename F>\
2046 class gmock_Impl : public ::testing::ActionInterface<F> {\
2047 public:\
2048 typedef F function_type;\
2049 typedef typename ::testing::internal::Function<F>::Result return_type;\
2050 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2051 args_type;\
2052 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2053 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2054 p6##_type gmock_p6, p7##_type gmock_p7, \
2055 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2056 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2057 p7(gmock_p7), p8(gmock_p8) {}\
2058 virtual return_type Perform(const args_type& args) {\
2059 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2060 Perform(this, args);\
2061 }\
2062 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2063 typename arg3_type, typename arg4_type, typename arg5_type, \
2064 typename arg6_type, typename arg7_type, typename arg8_type, \
2065 typename arg9_type>\
2066 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2067 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2068 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2069 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002070 p0##_type p0;\
2071 p1##_type p1;\
2072 p2##_type p2;\
2073 p3##_type p3;\
2074 p4##_type p4;\
2075 p5##_type p5;\
2076 p6##_type p6;\
2077 p7##_type p7;\
2078 p8##_type p8;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002079 private:\
2080 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00002081 };\
2082 template <typename F> operator ::testing::Action<F>() const {\
2083 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2084 p6, p7, p8));\
2085 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002086 p0##_type p0;\
2087 p1##_type p1;\
2088 p2##_type p2;\
2089 p3##_type p3;\
2090 p4##_type p4;\
2091 p5##_type p5;\
2092 p6##_type p6;\
2093 p7##_type p7;\
2094 p8##_type p8;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002095 private:\
2096 GTEST_DISALLOW_ASSIGN_(name##ActionP9);\
shiqian326aa562009-01-09 21:43:57 +00002097 };\
2098 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2099 typename p3##_type, typename p4##_type, typename p5##_type, \
2100 typename p6##_type, typename p7##_type, typename p8##_type>\
2101 inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2102 p4##_type, p5##_type, p6##_type, p7##_type, \
2103 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2104 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
2105 p8##_type p8) {\
2106 return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2107 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
2108 p3, p4, p5, p6, p7, p8);\
2109 }\
2110 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2111 typename p3##_type, typename p4##_type, typename p5##_type, \
2112 typename p6##_type, typename p7##_type, typename p8##_type>\
2113 template <typename F>\
2114 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2115 typename arg3_type, typename arg4_type, typename arg5_type, \
2116 typename arg6_type, typename arg7_type, typename arg8_type, \
2117 typename arg9_type>\
2118 typename ::testing::internal::Function<F>::Result\
2119 name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00002120 p5##_type, p6##_type, p7##_type, \
2121 p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2122 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00002123
2124#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\
2125 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2126 typename p3##_type, typename p4##_type, typename p5##_type, \
2127 typename p6##_type, typename p7##_type, typename p8##_type, \
2128 typename p9##_type>\
2129 class name##ActionP10 {\
2130 public:\
2131 name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \
2132 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2133 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2134 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
2135 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2136 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2137 template <typename F>\
2138 class gmock_Impl : public ::testing::ActionInterface<F> {\
2139 public:\
2140 typedef F function_type;\
2141 typedef typename ::testing::internal::Function<F>::Result return_type;\
2142 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2143 args_type;\
2144 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2145 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2146 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
2147 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2148 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2149 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2150 virtual return_type Perform(const args_type& args) {\
2151 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2152 Perform(this, args);\
2153 }\
2154 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2155 typename arg3_type, typename arg4_type, typename arg5_type, \
2156 typename arg6_type, typename arg7_type, typename arg8_type, \
2157 typename arg9_type>\
2158 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2159 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2160 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2161 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002162 p0##_type p0;\
2163 p1##_type p1;\
2164 p2##_type p2;\
2165 p3##_type p3;\
2166 p4##_type p4;\
2167 p5##_type p5;\
2168 p6##_type p6;\
2169 p7##_type p7;\
2170 p8##_type p8;\
2171 p9##_type p9;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002172 private:\
2173 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00002174 };\
2175 template <typename F> operator ::testing::Action<F>() const {\
2176 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2177 p6, p7, p8, p9));\
2178 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002179 p0##_type p0;\
2180 p1##_type p1;\
2181 p2##_type p2;\
2182 p3##_type p3;\
2183 p4##_type p4;\
2184 p5##_type p5;\
2185 p6##_type p6;\
2186 p7##_type p7;\
2187 p8##_type p8;\
2188 p9##_type p9;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002189 private:\
2190 GTEST_DISALLOW_ASSIGN_(name##ActionP10);\
shiqian326aa562009-01-09 21:43:57 +00002191 };\
2192 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2193 typename p3##_type, typename p4##_type, typename p5##_type, \
2194 typename p6##_type, typename p7##_type, typename p8##_type, \
2195 typename p9##_type>\
2196 inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2197 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2198 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2199 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2200 p9##_type p9) {\
2201 return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2202 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2203 p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2204 }\
2205 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2206 typename p3##_type, typename p4##_type, typename p5##_type, \
2207 typename p6##_type, typename p7##_type, typename p8##_type, \
2208 typename p9##_type>\
2209 template <typename F>\
2210 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2211 typename arg3_type, typename arg4_type, typename arg5_type, \
2212 typename arg6_type, typename arg7_type, typename arg8_type, \
2213 typename arg9_type>\
2214 typename ::testing::internal::Function<F>::Result\
2215 name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00002216 p5##_type, p6##_type, p7##_type, p8##_type, \
2217 p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2218 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00002219
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002220// TODO(wan@google.com): move the following to a different .h file
2221// such that we don't have to run 'pump' every time the code is
2222// updated.
zhanyong.wane1cdce52009-02-06 01:09:43 +00002223namespace testing {
2224
zhanyong.wan32de5f52009-12-23 00:13:23 +00002225// The ACTION*() macros trigger warning C4100 (unreferenced formal
2226// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
2227// the macro definition, as the warnings are generated when the macro
2228// is expanded and macro expansion cannot contain #pragma. Therefore
2229// we suppress them here.
2230#ifdef _MSC_VER
zhanyong.wan658ac0b2011-02-24 07:29:13 +00002231# pragma warning(push)
2232# pragma warning(disable:4100)
zhanyong.wan32de5f52009-12-23 00:13:23 +00002233#endif
2234
zhanyong.wan16cf4732009-05-14 20:55:30 +00002235// Various overloads for InvokeArgument<N>().
2236//
2237// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
2238// (0-based) argument, which must be a k-ary callable, of the mock
2239// function, with arguments a1, a2, ..., a_k.
2240//
2241// Notes:
2242//
2243// 1. The arguments are passed by value by default. If you need to
2244// pass an argument by reference, wrap it inside ByRef(). For
2245// example,
2246//
2247// InvokeArgument<1>(5, string("Hello"), ByRef(foo))
2248//
2249// passes 5 and string("Hello") by value, and passes foo by
2250// reference.
2251//
2252// 2. If the callable takes an argument by reference but ByRef() is
2253// not used, it will receive the reference to a copy of the value,
2254// instead of the original value. For example, when the 0-th
2255// argument of the mock function takes a const string&, the action
2256//
2257// InvokeArgument<0>(string("Hello"))
2258//
2259// makes a copy of the temporary string("Hello") object and passes a
2260// reference of the copy, instead of the original temporary object,
2261// to the callable. This makes it easy for a user to define an
2262// InvokeArgument action from temporary values and have it performed
2263// later.
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002264
zhanyong.wan16cf4732009-05-14 20:55:30 +00002265ACTION_TEMPLATE(InvokeArgument,
2266 HAS_1_TEMPLATE_PARAMS(int, k),
2267 AND_0_VALUE_PARAMS()) {
2268 return internal::CallableHelper<return_type>::Call(
2269 ::std::tr1::get<k>(args));
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002270}
2271
zhanyong.wan16cf4732009-05-14 20:55:30 +00002272ACTION_TEMPLATE(InvokeArgument,
2273 HAS_1_TEMPLATE_PARAMS(int, k),
2274 AND_1_VALUE_PARAMS(p0)) {
2275 return internal::CallableHelper<return_type>::Call(
2276 ::std::tr1::get<k>(args), p0);
2277}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002278
zhanyong.wan16cf4732009-05-14 20:55:30 +00002279ACTION_TEMPLATE(InvokeArgument,
2280 HAS_1_TEMPLATE_PARAMS(int, k),
2281 AND_2_VALUE_PARAMS(p0, p1)) {
2282 return internal::CallableHelper<return_type>::Call(
2283 ::std::tr1::get<k>(args), p0, p1);
2284}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002285
zhanyong.wan16cf4732009-05-14 20:55:30 +00002286ACTION_TEMPLATE(InvokeArgument,
2287 HAS_1_TEMPLATE_PARAMS(int, k),
2288 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2289 return internal::CallableHelper<return_type>::Call(
2290 ::std::tr1::get<k>(args), p0, p1, p2);
2291}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002292
zhanyong.wan16cf4732009-05-14 20:55:30 +00002293ACTION_TEMPLATE(InvokeArgument,
2294 HAS_1_TEMPLATE_PARAMS(int, k),
2295 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2296 return internal::CallableHelper<return_type>::Call(
2297 ::std::tr1::get<k>(args), p0, p1, p2, p3);
2298}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002299
zhanyong.wan16cf4732009-05-14 20:55:30 +00002300ACTION_TEMPLATE(InvokeArgument,
2301 HAS_1_TEMPLATE_PARAMS(int, k),
2302 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2303 return internal::CallableHelper<return_type>::Call(
2304 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4);
2305}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002306
zhanyong.wan16cf4732009-05-14 20:55:30 +00002307ACTION_TEMPLATE(InvokeArgument,
2308 HAS_1_TEMPLATE_PARAMS(int, k),
2309 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2310 return internal::CallableHelper<return_type>::Call(
2311 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5);
2312}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002313
zhanyong.wan16cf4732009-05-14 20:55:30 +00002314ACTION_TEMPLATE(InvokeArgument,
2315 HAS_1_TEMPLATE_PARAMS(int, k),
2316 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2317 return internal::CallableHelper<return_type>::Call(
2318 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6);
2319}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002320
zhanyong.wan16cf4732009-05-14 20:55:30 +00002321ACTION_TEMPLATE(InvokeArgument,
2322 HAS_1_TEMPLATE_PARAMS(int, k),
2323 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2324 return internal::CallableHelper<return_type>::Call(
2325 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);
2326}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002327
zhanyong.wan16cf4732009-05-14 20:55:30 +00002328ACTION_TEMPLATE(InvokeArgument,
2329 HAS_1_TEMPLATE_PARAMS(int, k),
2330 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2331 return internal::CallableHelper<return_type>::Call(
2332 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);
2333}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002334
zhanyong.wan16cf4732009-05-14 20:55:30 +00002335ACTION_TEMPLATE(InvokeArgument,
2336 HAS_1_TEMPLATE_PARAMS(int, k),
2337 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2338 return internal::CallableHelper<return_type>::Call(
2339 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2340}
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002341
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002342// Various overloads for ReturnNew<T>().
2343//
2344// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
2345// instance of type T, constructed on the heap with constructor arguments
2346// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
zhanyong.wan16cf4732009-05-14 20:55:30 +00002347ACTION_TEMPLATE(ReturnNew,
2348 HAS_1_TEMPLATE_PARAMS(typename, T),
2349 AND_0_VALUE_PARAMS()) {
2350 return new T();
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002351}
2352
zhanyong.wan16cf4732009-05-14 20:55:30 +00002353ACTION_TEMPLATE(ReturnNew,
2354 HAS_1_TEMPLATE_PARAMS(typename, T),
2355 AND_1_VALUE_PARAMS(p0)) {
2356 return new T(p0);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002357}
2358
zhanyong.wan16cf4732009-05-14 20:55:30 +00002359ACTION_TEMPLATE(ReturnNew,
2360 HAS_1_TEMPLATE_PARAMS(typename, T),
2361 AND_2_VALUE_PARAMS(p0, p1)) {
2362 return new T(p0, p1);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002363}
2364
zhanyong.wan16cf4732009-05-14 20:55:30 +00002365ACTION_TEMPLATE(ReturnNew,
2366 HAS_1_TEMPLATE_PARAMS(typename, T),
2367 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2368 return new T(p0, p1, p2);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002369}
2370
zhanyong.wan16cf4732009-05-14 20:55:30 +00002371ACTION_TEMPLATE(ReturnNew,
2372 HAS_1_TEMPLATE_PARAMS(typename, T),
2373 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2374 return new T(p0, p1, p2, p3);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002375}
2376
zhanyong.wan16cf4732009-05-14 20:55:30 +00002377ACTION_TEMPLATE(ReturnNew,
2378 HAS_1_TEMPLATE_PARAMS(typename, T),
2379 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2380 return new T(p0, p1, p2, p3, p4);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002381}
2382
zhanyong.wan16cf4732009-05-14 20:55:30 +00002383ACTION_TEMPLATE(ReturnNew,
2384 HAS_1_TEMPLATE_PARAMS(typename, T),
2385 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2386 return new T(p0, p1, p2, p3, p4, p5);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002387}
2388
zhanyong.wan16cf4732009-05-14 20:55:30 +00002389ACTION_TEMPLATE(ReturnNew,
2390 HAS_1_TEMPLATE_PARAMS(typename, T),
2391 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2392 return new T(p0, p1, p2, p3, p4, p5, p6);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002393}
2394
zhanyong.wan16cf4732009-05-14 20:55:30 +00002395ACTION_TEMPLATE(ReturnNew,
2396 HAS_1_TEMPLATE_PARAMS(typename, T),
2397 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2398 return new T(p0, p1, p2, p3, p4, p5, p6, p7);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002399}
2400
zhanyong.wan16cf4732009-05-14 20:55:30 +00002401ACTION_TEMPLATE(ReturnNew,
2402 HAS_1_TEMPLATE_PARAMS(typename, T),
2403 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2404 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002405}
2406
zhanyong.wan16cf4732009-05-14 20:55:30 +00002407ACTION_TEMPLATE(ReturnNew,
2408 HAS_1_TEMPLATE_PARAMS(typename, T),
2409 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2410 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002411}
2412
zhanyong.wan32de5f52009-12-23 00:13:23 +00002413#ifdef _MSC_VER
zhanyong.wan658ac0b2011-02-24 07:29:13 +00002414# pragma warning(pop)
zhanyong.wan32de5f52009-12-23 00:13:23 +00002415#endif
2416
zhanyong.wane1cdce52009-02-06 01:09:43 +00002417} // namespace testing
2418
shiqiane35fdd92008-12-10 05:08:54 +00002419#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_