blob: 3b599b36abda1ac19e7c5200f68f028ec8f81387 [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 }
shiqiane35fdd92008-12-10 05:08:54 +0000384}; // class CallableHelper
385
shiqiane35fdd92008-12-10 05:08:54 +0000386// An INTERNAL macro for extracting the type of a tuple field. It's
387// subject to change without notice - DO NOT USE IN USER CODE!
zhanyong.wane0d051e2009-02-19 00:33:37 +0000388#define GMOCK_FIELD_(Tuple, N) \
shiqiane35fdd92008-12-10 05:08:54 +0000389 typename ::std::tr1::tuple_element<N, Tuple>::type
390
391// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
392// type of an n-ary function whose i-th (1-based) argument type is the
393// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
394// type, and whose return type is Result. For example,
395// SelectArgs<int, ::std::tr1::tuple<bool, char, double, long>, 0, 3>::type
396// is int(bool, long).
397//
398// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
399// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
400// For example,
401// SelectArgs<int, ::std::tr1::tuple<bool, char, double>, 2, 0>::Select(
402// ::std::tr1::make_tuple(true, 'a', 2.5))
403// returns ::std::tr1::tuple (2.5, true).
404//
405// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
406// in the range [0, 10]. Duplicates are allowed and they don't have
407// to be in an ascending or descending order.
408
409template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
410 int k4, int k5, int k6, int k7, int k8, int k9, int k10>
411class SelectArgs {
412 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000413 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
414 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
415 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
416 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
417 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),
418 GMOCK_FIELD_(ArgumentTuple, k10));
shiqiane35fdd92008-12-10 05:08:54 +0000419 typedef typename Function<type>::ArgumentTuple SelectedArgs;
420 static SelectedArgs Select(const ArgumentTuple& args) {
421 using ::std::tr1::get;
422 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
423 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
424 get<k8>(args), get<k9>(args), get<k10>(args));
425 }
426};
427
428template <typename Result, typename ArgumentTuple>
429class SelectArgs<Result, ArgumentTuple,
430 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
431 public:
432 typedef Result type();
433 typedef typename Function<type>::ArgumentTuple SelectedArgs;
zhanyong.wan3fbd2dd2009-03-26 19:06:45 +0000434 static SelectedArgs Select(const ArgumentTuple& /* args */) {
shiqiane35fdd92008-12-10 05:08:54 +0000435 using ::std::tr1::get;
436 return SelectedArgs();
437 }
438};
439
440template <typename Result, typename ArgumentTuple, int k1>
441class SelectArgs<Result, ArgumentTuple,
442 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
443 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000444 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));
shiqiane35fdd92008-12-10 05:08:54 +0000445 typedef typename Function<type>::ArgumentTuple SelectedArgs;
446 static SelectedArgs Select(const ArgumentTuple& args) {
447 using ::std::tr1::get;
448 return SelectedArgs(get<k1>(args));
449 }
450};
451
452template <typename Result, typename ArgumentTuple, int k1, int k2>
453class SelectArgs<Result, ArgumentTuple,
454 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {
455 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000456 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
457 GMOCK_FIELD_(ArgumentTuple, k2));
shiqiane35fdd92008-12-10 05:08:54 +0000458 typedef typename Function<type>::ArgumentTuple SelectedArgs;
459 static SelectedArgs Select(const ArgumentTuple& args) {
460 using ::std::tr1::get;
461 return SelectedArgs(get<k1>(args), get<k2>(args));
462 }
463};
464
465template <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
466class SelectArgs<Result, ArgumentTuple,
467 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {
468 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000469 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
470 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));
shiqiane35fdd92008-12-10 05:08:54 +0000471 typedef typename Function<type>::ArgumentTuple SelectedArgs;
472 static SelectedArgs Select(const ArgumentTuple& args) {
473 using ::std::tr1::get;
474 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));
475 }
476};
477
478template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
479 int k4>
480class SelectArgs<Result, ArgumentTuple,
481 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {
482 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000483 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
484 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
485 GMOCK_FIELD_(ArgumentTuple, k4));
shiqiane35fdd92008-12-10 05:08:54 +0000486 typedef typename Function<type>::ArgumentTuple SelectedArgs;
487 static SelectedArgs Select(const ArgumentTuple& args) {
488 using ::std::tr1::get;
489 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
490 get<k4>(args));
491 }
492};
493
494template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
495 int k4, int k5>
496class SelectArgs<Result, ArgumentTuple,
497 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {
498 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000499 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
500 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
501 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));
shiqiane35fdd92008-12-10 05:08:54 +0000502 typedef typename Function<type>::ArgumentTuple SelectedArgs;
503 static SelectedArgs Select(const ArgumentTuple& args) {
504 using ::std::tr1::get;
505 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
506 get<k4>(args), get<k5>(args));
507 }
508};
509
510template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
511 int k4, int k5, int k6>
512class SelectArgs<Result, ArgumentTuple,
513 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {
514 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000515 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
516 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
517 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
518 GMOCK_FIELD_(ArgumentTuple, k6));
shiqiane35fdd92008-12-10 05:08:54 +0000519 typedef typename Function<type>::ArgumentTuple SelectedArgs;
520 static SelectedArgs Select(const ArgumentTuple& args) {
521 using ::std::tr1::get;
522 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
523 get<k4>(args), get<k5>(args), get<k6>(args));
524 }
525};
526
527template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
528 int k4, int k5, int k6, int k7>
529class SelectArgs<Result, ArgumentTuple,
530 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {
531 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000532 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
533 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
534 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
535 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));
shiqiane35fdd92008-12-10 05:08:54 +0000536 typedef typename Function<type>::ArgumentTuple SelectedArgs;
537 static SelectedArgs Select(const ArgumentTuple& args) {
538 using ::std::tr1::get;
539 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
540 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));
541 }
542};
543
544template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
545 int k4, int k5, int k6, int k7, int k8>
546class SelectArgs<Result, ArgumentTuple,
547 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {
548 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000549 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
550 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
551 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
552 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
553 GMOCK_FIELD_(ArgumentTuple, k8));
shiqiane35fdd92008-12-10 05:08:54 +0000554 typedef typename Function<type>::ArgumentTuple SelectedArgs;
555 static SelectedArgs Select(const ArgumentTuple& args) {
556 using ::std::tr1::get;
557 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
558 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
559 get<k8>(args));
560 }
561};
562
563template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
564 int k4, int k5, int k6, int k7, int k8, int k9>
565class SelectArgs<Result, ArgumentTuple,
566 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {
567 public:
zhanyong.wane0d051e2009-02-19 00:33:37 +0000568 typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
569 GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
570 GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
571 GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
572 GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));
shiqiane35fdd92008-12-10 05:08:54 +0000573 typedef typename Function<type>::ArgumentTuple SelectedArgs;
574 static SelectedArgs Select(const ArgumentTuple& args) {
575 using ::std::tr1::get;
576 return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
577 get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
578 get<k8>(args), get<k9>(args));
579 }
580};
581
zhanyong.wane0d051e2009-02-19 00:33:37 +0000582#undef GMOCK_FIELD_
shiqiane35fdd92008-12-10 05:08:54 +0000583
584// Implements the WithArgs action.
585template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,
586 int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
587 int k9 = -1, int k10 = -1>
588class WithArgsAction {
589 public:
590 explicit WithArgsAction(const InnerAction& action) : action_(action) {}
591
592 template <typename F>
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000593 operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
594
595 private:
596 template <typename F>
597 class Impl : public ActionInterface<F> {
598 public:
shiqiane35fdd92008-12-10 05:08:54 +0000599 typedef typename Function<F>::Result Result;
600 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000601
602 explicit Impl(const InnerAction& action) : action_(action) {}
603
604 virtual Result Perform(const ArgumentTuple& args) {
605 return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,
606 k5, k6, k7, k8, k9, k10>::Select(args));
607 }
608
609 private:
shiqiane35fdd92008-12-10 05:08:54 +0000610 typedef typename SelectArgs<Result, ArgumentTuple,
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000611 k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;
shiqiane35fdd92008-12-10 05:08:54 +0000612
zhanyong.wan38ca64d2009-02-19 22:30:22 +0000613 Action<InnerFunctionType> action_;
614 };
shiqiane35fdd92008-12-10 05:08:54 +0000615
shiqiane35fdd92008-12-10 05:08:54 +0000616 const InnerAction action_;
zhanyong.wan32de5f52009-12-23 00:13:23 +0000617
618 GTEST_DISALLOW_ASSIGN_(WithArgsAction);
shiqiane35fdd92008-12-10 05:08:54 +0000619};
620
shiqian326aa562009-01-09 21:43:57 +0000621// A macro from the ACTION* family (defined later in this file)
622// defines an action that can be used in a mock function. Typically,
623// these actions only care about a subset of the arguments of the mock
624// function. For example, if such an action only uses the second
625// argument, it can be used in any mock function that takes >= 2
626// arguments where the type of the second argument is compatible.
627//
628// Therefore, the action implementation must be prepared to take more
629// arguments than it needs. The ExcessiveArg type is used to
630// represent those excessive arguments. In order to keep the compiler
631// error messages tractable, we define it in the testing namespace
632// instead of testing::internal. However, this is an INTERNAL TYPE
633// and subject to change without notice, so a user MUST NOT USE THIS
634// TYPE DIRECTLY.
635struct ExcessiveArg {};
636
637// A helper class needed for implementing the ACTION* macros.
638template <typename Result, class Impl>
639class ActionHelper {
640 public:
641 static Result Perform(Impl* impl, const ::std::tr1::tuple<>& args) {
642 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000643 return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
shiqian326aa562009-01-09 21:43:57 +0000644 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000645 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
646 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000647 }
648
649 template <typename A0>
650 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0>& args) {
651 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000652 return impl->template gmock_PerformImpl<A0>(args, get<0>(args),
shiqian326aa562009-01-09 21:43:57 +0000653 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000654 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
655 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000656 }
657
658 template <typename A0, typename A1>
659 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1>& args) {
660 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000661 return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),
662 get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
shiqian326aa562009-01-09 21:43:57 +0000663 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000664 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000665 }
666
667 template <typename A0, typename A1, typename A2>
668 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2>& args) {
669 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000670 return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),
671 get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),
672 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
673 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000674 }
675
676 template <typename A0, typename A1, typename A2, typename A3>
677 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2,
678 A3>& args) {
679 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000680 return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),
681 get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),
682 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
683 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000684 }
685
686 template <typename A0, typename A1, typename A2, typename A3, typename A4>
687 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3,
688 A4>& args) {
689 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000690 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
691 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
692 ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
693 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000694 }
695
696 template <typename A0, typename A1, typename A2, typename A3, typename A4,
697 typename A5>
698 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
699 A5>& args) {
700 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000701 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
702 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
703 get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
704 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000705 }
706
707 template <typename A0, typename A1, typename A2, typename A3, typename A4,
708 typename A5, typename A6>
709 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
710 A5, A6>& args) {
711 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000712 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
713 get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
714 get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),
715 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000716 }
717
718 template <typename A0, typename A1, typename A2, typename A3, typename A4,
719 typename A5, typename A6, typename A7>
720 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
721 A5, A6, A7>& args) {
722 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000723 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
724 A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
725 get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),
726 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000727 }
728
729 template <typename A0, typename A1, typename A2, typename A3, typename A4,
730 typename A5, typename A6, typename A7, typename A8>
731 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
732 A5, A6, A7, A8>& args) {
733 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000734 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
735 A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
736 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
737 ExcessiveArg());
shiqian326aa562009-01-09 21:43:57 +0000738 }
739
740 template <typename A0, typename A1, typename A2, typename A3, typename A4,
741 typename A5, typename A6, typename A7, typename A8, typename A9>
742 static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
743 A5, A6, A7, A8, A9>& args) {
744 using ::std::tr1::get;
zhanyong.wan7f4c2c02009-02-19 22:38:27 +0000745 return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
746 A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
747 get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
748 get<9>(args));
shiqian326aa562009-01-09 21:43:57 +0000749 }
750};
751
shiqiane35fdd92008-12-10 05:08:54 +0000752} // namespace internal
753
754// Various overloads for Invoke().
755
shiqiane35fdd92008-12-10 05:08:54 +0000756// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
757// the selected arguments of the mock function to an_action and
758// performs it. It serves as an adaptor between actions with
759// different argument lists. C++ doesn't support default arguments for
760// function templates, so we have to overload it.
761template <int k1, typename InnerAction>
762inline internal::WithArgsAction<InnerAction, k1>
763WithArgs(const InnerAction& action) {
764 return internal::WithArgsAction<InnerAction, k1>(action);
765}
766
767template <int k1, int k2, typename InnerAction>
768inline internal::WithArgsAction<InnerAction, k1, k2>
769WithArgs(const InnerAction& action) {
770 return internal::WithArgsAction<InnerAction, k1, k2>(action);
771}
772
773template <int k1, int k2, int k3, typename InnerAction>
774inline internal::WithArgsAction<InnerAction, k1, k2, k3>
775WithArgs(const InnerAction& action) {
776 return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
777}
778
779template <int k1, int k2, int k3, int k4, typename InnerAction>
780inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
781WithArgs(const InnerAction& action) {
782 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
783}
784
785template <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
786inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
787WithArgs(const InnerAction& action) {
788 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
789}
790
791template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
792inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
793WithArgs(const InnerAction& action) {
794 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
795}
796
797template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
798 typename InnerAction>
799inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
800WithArgs(const InnerAction& action) {
801 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
802 k7>(action);
803}
804
805template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
806 typename InnerAction>
807inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
808WithArgs(const InnerAction& action) {
809 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
810 k8>(action);
811}
812
813template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
814 int k9, typename InnerAction>
815inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
816WithArgs(const InnerAction& action) {
817 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
818 k9>(action);
819}
820
821template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
822 int k9, int k10, typename InnerAction>
823inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
824 k9, k10>
825WithArgs(const InnerAction& action) {
826 return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
827 k9, k10>(action);
828}
829
830// Creates an action that does actions a1, a2, ..., sequentially in
831// each invocation.
832template <typename Action1, typename Action2>
833inline internal::DoBothAction<Action1, Action2>
834DoAll(Action1 a1, Action2 a2) {
835 return internal::DoBothAction<Action1, Action2>(a1, a2);
836}
837
838template <typename Action1, typename Action2, typename Action3>
839inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
840 Action3> >
841DoAll(Action1 a1, Action2 a2, Action3 a3) {
842 return DoAll(a1, DoAll(a2, a3));
843}
844
845template <typename Action1, typename Action2, typename Action3,
846 typename Action4>
847inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
848 internal::DoBothAction<Action3, Action4> > >
849DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
850 return DoAll(a1, DoAll(a2, a3, a4));
851}
852
853template <typename Action1, typename Action2, typename Action3,
854 typename Action4, typename Action5>
855inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
856 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
857 Action5> > > >
858DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
859 return DoAll(a1, DoAll(a2, a3, a4, a5));
860}
861
862template <typename Action1, typename Action2, typename Action3,
863 typename Action4, typename Action5, typename Action6>
864inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
865 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
866 internal::DoBothAction<Action5, Action6> > > > >
867DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
868 return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
869}
870
871template <typename Action1, typename Action2, typename Action3,
872 typename Action4, typename Action5, typename Action6, typename Action7>
873inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
874 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
875 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
876 Action7> > > > > >
877DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
878 Action7 a7) {
879 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));
880}
881
882template <typename Action1, typename Action2, typename Action3,
883 typename Action4, typename Action5, typename Action6, typename Action7,
884 typename Action8>
885inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
886 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
887 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
888 internal::DoBothAction<Action7, Action8> > > > > > >
889DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
890 Action7 a7, Action8 a8) {
891 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));
892}
893
894template <typename Action1, typename Action2, typename Action3,
895 typename Action4, typename Action5, typename Action6, typename Action7,
896 typename Action8, typename Action9>
897inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
898 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
899 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
900 internal::DoBothAction<Action7, internal::DoBothAction<Action8,
901 Action9> > > > > > > >
902DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
903 Action7 a7, Action8 a8, Action9 a9) {
904 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));
905}
906
907template <typename Action1, typename Action2, typename Action3,
908 typename Action4, typename Action5, typename Action6, typename Action7,
909 typename Action8, typename Action9, typename Action10>
910inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
911 internal::DoBothAction<Action3, internal::DoBothAction<Action4,
912 internal::DoBothAction<Action5, internal::DoBothAction<Action6,
913 internal::DoBothAction<Action7, internal::DoBothAction<Action8,
914 internal::DoBothAction<Action9, Action10> > > > > > > > >
915DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
916 Action7 a7, Action8 a8, Action9 a9, Action10 a10) {
917 return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));
918}
919
920} // namespace testing
921
shiqian326aa562009-01-09 21:43:57 +0000922// The ACTION* family of macros can be used in a namespace scope to
923// define custom actions easily. The syntax:
924//
925// ACTION(name) { statements; }
926//
927// will define an action with the given name that executes the
928// statements. The value returned by the statements will be used as
929// the return value of the action. Inside the statements, you can
930// refer to the K-th (0-based) argument of the mock function by
931// 'argK', and refer to its type by 'argK_type'. For example:
932//
933// ACTION(IncrementArg1) {
934// arg1_type temp = arg1;
935// return ++(*temp);
936// }
937//
938// allows you to write
939//
940// ...WillOnce(IncrementArg1());
941//
942// You can also refer to the entire argument tuple and its type by
943// 'args' and 'args_type', and refer to the mock function type and its
944// return type by 'function_type' and 'return_type'.
945//
946// Note that you don't need to specify the types of the mock function
947// arguments. However rest assured that your code is still type-safe:
948// you'll get a compiler error if *arg1 doesn't support the ++
949// operator, or if the type of ++(*arg1) isn't compatible with the
950// mock function's return type, for example.
951//
952// Sometimes you'll want to parameterize the action. For that you can use
953// another macro:
954//
955// ACTION_P(name, param_name) { statements; }
956//
957// For example:
958//
959// ACTION_P(Add, n) { return arg0 + n; }
960//
961// will allow you to write:
962//
963// ...WillOnce(Add(5));
964//
965// Note that you don't need to provide the type of the parameter
966// either. If you need to reference the type of a parameter named
967// 'foo', you can write 'foo_type'. For example, in the body of
968// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
969// of 'n'.
970//
971// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
972// multi-parameter actions.
973//
974// For the purpose of typing, you can view
975//
976// ACTION_Pk(Foo, p1, ..., pk) { ... }
977//
978// as shorthand for
979//
980// template <typename p1_type, ..., typename pk_type>
981// FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
982//
983// In particular, you can provide the template type arguments
984// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
985// although usually you can rely on the compiler to infer the types
986// for you automatically. You can assign the result of expression
987// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
988// pk_type>. This can be useful when composing actions.
989//
990// You can also overload actions with different numbers of parameters:
991//
992// ACTION_P(Plus, a) { ... }
993// ACTION_P2(Plus, a, b) { ... }
994//
995// While it's tempting to always use the ACTION* macros when defining
996// a new action, you should also consider implementing ActionInterface
997// or using MakePolymorphicAction() instead, especially if you need to
998// use the action a lot. While these approaches require more work,
999// they give you more control on the types of the mock function
1000// arguments and the action parameters, which in general leads to
1001// better compiler error messages that pay off in the long run. They
1002// also allow overloading actions based on parameter types (as opposed
1003// to just based on the number of parameters).
1004//
1005// CAVEAT:
1006//
1007// ACTION*() can only be used in a namespace scope. The reason is
1008// that C++ doesn't yet allow function-local types to be used to
1009// instantiate templates. The up-coming C++0x standard will fix this.
1010// Once that's done, we'll consider supporting using ACTION*() inside
1011// a function.
1012//
1013// MORE INFORMATION:
1014//
1015// To learn more about using these macros, please search for 'ACTION'
1016// on http://code.google.com/p/googlemock/wiki/CookBook.
1017
zhanyong.wan33c0af02009-04-03 00:10:12 +00001018// An internal macro needed for implementing ACTION*().
1019#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
jgm79a367e2012-04-10 16:02:11 +00001020 const args_type& args GTEST_ATTRIBUTE_UNUSED_, \
1021 arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \
1022 arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \
1023 arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \
1024 arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \
1025 arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \
1026 arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \
1027 arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \
1028 arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \
1029 arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00001030 arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
1031
zhanyong.wan18490652009-05-11 18:54:08 +00001032// Sometimes you want to give an action explicit template parameters
1033// that cannot be inferred from its value parameters. ACTION() and
1034// ACTION_P*() don't support that. ACTION_TEMPLATE() remedies that
1035// and can be viewed as an extension to ACTION() and ACTION_P*().
1036//
1037// The syntax:
1038//
1039// ACTION_TEMPLATE(ActionName,
1040// HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
1041// AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
1042//
1043// defines an action template that takes m explicit template
1044// parameters and n value parameters. name_i is the name of the i-th
1045// template parameter, and kind_i specifies whether it's a typename,
1046// an integral constant, or a template. p_i is the name of the i-th
1047// value parameter.
1048//
1049// Example:
1050//
1051// // DuplicateArg<k, T>(output) converts the k-th argument of the mock
1052// // function to type T and copies it to *output.
1053// ACTION_TEMPLATE(DuplicateArg,
1054// HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
1055// AND_1_VALUE_PARAMS(output)) {
1056// *output = T(std::tr1::get<k>(args));
1057// }
1058// ...
1059// int n;
1060// EXPECT_CALL(mock, Foo(_, _))
1061// .WillOnce(DuplicateArg<1, unsigned char>(&n));
1062//
1063// To create an instance of an action template, write:
1064//
1065// ActionName<t1, ..., t_m>(v1, ..., v_n)
1066//
1067// where the ts are the template arguments and the vs are the value
1068// arguments. The value argument types are inferred by the compiler.
1069// If you want to explicitly specify the value argument types, you can
1070// provide additional template arguments:
1071//
1072// ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
1073//
1074// where u_i is the desired type of v_i.
1075//
1076// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the
1077// number of value parameters, but not on the number of template
1078// parameters. Without the restriction, the meaning of the following
1079// is unclear:
1080//
1081// OverloadedAction<int, bool>(x);
1082//
1083// Are we using a single-template-parameter action where 'bool' refers
1084// to the type of x, or are we using a two-template-parameter action
1085// where the compiler is asked to infer the type of x?
1086//
1087// Implementation notes:
1088//
1089// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and
1090// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for
1091// implementing ACTION_TEMPLATE. The main trick we use is to create
1092// new macro invocations when expanding a macro. For example, we have
1093//
1094// #define ACTION_TEMPLATE(name, template_params, value_params)
1095// ... GMOCK_INTERNAL_DECL_##template_params ...
1096//
1097// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)
1098// to expand to
1099//
1100// ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...
1101//
1102// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the
1103// preprocessor will continue to expand it to
1104//
1105// ... typename T ...
1106//
1107// This technique conforms to the C++ standard and is portable. It
1108// allows us to implement action templates using O(N) code, where N is
1109// the maximum number of template/value parameters supported. Without
1110// using it, we'd have to devote O(N^2) amount of code to implement all
1111// combinations of m and n.
1112
1113// Declares the template parameters.
1114#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0
1115#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1116 name1) kind0 name0, kind1 name1
1117#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1118 kind2, name2) kind0 name0, kind1 name1, kind2 name2
1119#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1120 kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \
1121 kind3 name3
1122#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1123 kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \
1124 kind2 name2, kind3 name3, kind4 name4
1125#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1126 kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \
1127 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5
1128#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1129 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1130 name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \
1131 kind5 name5, kind6 name6
1132#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1133 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1134 kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \
1135 kind4 name4, kind5 name5, kind6 name6, kind7 name7
1136#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1137 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1138 kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \
1139 kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \
1140 kind8 name8
1141#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1142 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1143 name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \
1144 kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \
1145 kind6 name6, kind7 name7, kind8 name8, kind9 name9
1146
1147// Lists the template parameters.
1148#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0
1149#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1150 name1) name0, name1
1151#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1152 kind2, name2) name0, name1, name2
1153#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1154 kind2, name2, kind3, name3) name0, name1, name2, name3
1155#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1156 kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \
1157 name4
1158#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1159 kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \
1160 name2, name3, name4, name5
1161#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1162 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1163 name6) name0, name1, name2, name3, name4, name5, name6
1164#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1165 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1166 kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7
1167#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1168 kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1169 kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \
1170 name6, name7, name8
1171#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1172 name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1173 name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \
1174 name3, name4, name5, name6, name7, name8, name9
1175
1176// Declares the types of value parameters.
1177#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()
1178#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type
1179#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \
1180 typename p0##_type, typename p1##_type
1181#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \
1182 typename p0##_type, typename p1##_type, typename p2##_type
1183#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1184 typename p0##_type, typename p1##_type, typename p2##_type, \
1185 typename p3##_type
1186#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1187 typename p0##_type, typename p1##_type, typename p2##_type, \
1188 typename p3##_type, typename p4##_type
1189#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1190 typename p0##_type, typename p1##_type, typename p2##_type, \
1191 typename p3##_type, typename p4##_type, typename p5##_type
1192#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1193 p6) , typename p0##_type, typename p1##_type, typename p2##_type, \
1194 typename p3##_type, typename p4##_type, typename p5##_type, \
1195 typename p6##_type
1196#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1197 p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \
1198 typename p3##_type, typename p4##_type, typename p5##_type, \
1199 typename p6##_type, typename p7##_type
1200#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1201 p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \
1202 typename p3##_type, typename p4##_type, typename p5##_type, \
1203 typename p6##_type, typename p7##_type, typename p8##_type
1204#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1205 p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \
1206 typename p2##_type, typename p3##_type, typename p4##_type, \
1207 typename p5##_type, typename p6##_type, typename p7##_type, \
1208 typename p8##_type, typename p9##_type
1209
1210// Initializes the value parameters.
1211#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\
1212 ()
1213#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\
1214 (p0##_type gmock_p0) : p0(gmock_p0)
1215#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\
1216 (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1)
1217#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\
1218 (p0##_type gmock_p0, p1##_type gmock_p1, \
1219 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2)
1220#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\
1221 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1222 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1223 p3(gmock_p3)
1224#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\
1225 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1226 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \
1227 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4)
1228#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\
1229 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1230 p3##_type gmock_p3, p4##_type gmock_p4, \
1231 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1232 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5)
1233#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\
1234 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1235 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1236 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1237 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6)
1238#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\
1239 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1240 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1241 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \
1242 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1243 p7(gmock_p7)
1244#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1245 p7, p8)\
1246 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1247 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1248 p6##_type gmock_p6, p7##_type gmock_p7, \
1249 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1250 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1251 p8(gmock_p8)
1252#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1253 p7, p8, p9)\
1254 (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1255 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1256 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
1257 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1258 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1259 p8(gmock_p8), p9(gmock_p9)
1260
1261// Declares the fields for storing the value parameters.
1262#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()
1263#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;
1264#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \
1265 p1##_type p1;
1266#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \
1267 p1##_type p1; p2##_type p2;
1268#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \
1269 p1##_type p1; p2##_type p2; p3##_type p3;
1270#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1271 p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;
1272#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1273 p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1274 p5##_type p5;
1275#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1276 p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1277 p5##_type p5; p6##_type p6;
1278#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1279 p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1280 p5##_type p5; p6##_type p6; p7##_type p7;
1281#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1282 p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1283 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;
1284#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1285 p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1286 p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \
1287 p9##_type p9;
1288
1289// Lists the value parameters.
1290#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()
1291#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0
1292#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1
1293#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2
1294#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3
1295#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \
1296 p2, p3, p4
1297#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \
1298 p1, p2, p3, p4, p5
1299#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1300 p6) p0, p1, p2, p3, p4, p5, p6
1301#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1302 p7) p0, p1, p2, p3, p4, p5, p6, p7
1303#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1304 p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8
1305#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1306 p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
1307
1308// Lists the value parameter types.
1309#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()
1310#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type
1311#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \
1312 p1##_type
1313#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \
1314 p1##_type, p2##_type
1315#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1316 p0##_type, p1##_type, p2##_type, p3##_type
1317#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1318 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type
1319#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1320 p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type
1321#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1322 p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \
1323 p6##_type
1324#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1325 p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1326 p5##_type, p6##_type, p7##_type
1327#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1328 p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1329 p5##_type, p6##_type, p7##_type, p8##_type
1330#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1331 p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1332 p5##_type, p6##_type, p7##_type, p8##_type, p9##_type
1333
1334// Declares the value parameters.
1335#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()
1336#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0
1337#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \
1338 p1##_type p1
1339#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \
1340 p1##_type p1, p2##_type p2
1341#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \
1342 p1##_type p1, p2##_type p2, p3##_type p3
1343#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1344 p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4
1345#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1346 p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1347 p5##_type p5
1348#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1349 p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1350 p5##_type p5, p6##_type p6
1351#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1352 p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1353 p5##_type p5, p6##_type p6, p7##_type p7
1354#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1355 p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1356 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8
1357#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1358 p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1359 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
1360 p9##_type p9
1361
1362// The suffix of the class template implementing the action template.
1363#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()
1364#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P
1365#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
1366#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3
1367#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4
1368#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5
1369#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6
1370#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7
1371#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1372 p7) P8
1373#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1374 p7, p8) P9
1375#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1376 p7, p8, p9) P10
1377
1378// The name of the class template implementing the action template.
1379#define GMOCK_ACTION_CLASS_(name, value_params)\
zhanyong.wanccedc1c2010-08-09 22:46:12 +00001380 GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
zhanyong.wan18490652009-05-11 18:54:08 +00001381
1382#define ACTION_TEMPLATE(name, template_params, value_params)\
1383 template <GMOCK_INTERNAL_DECL_##template_params\
1384 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1385 class GMOCK_ACTION_CLASS_(name, value_params) {\
1386 public:\
1387 GMOCK_ACTION_CLASS_(name, value_params)\
1388 GMOCK_INTERNAL_INIT_##value_params {}\
1389 template <typename F>\
1390 class gmock_Impl : public ::testing::ActionInterface<F> {\
1391 public:\
1392 typedef F function_type;\
1393 typedef typename ::testing::internal::Function<F>::Result return_type;\
1394 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1395 args_type;\
1396 explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
1397 virtual return_type Perform(const args_type& args) {\
1398 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1399 Perform(this, args);\
1400 }\
1401 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1402 typename arg3_type, typename arg4_type, typename arg5_type, \
1403 typename arg6_type, typename arg7_type, typename arg8_type, \
1404 typename arg9_type>\
1405 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1406 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1407 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1408 arg9_type arg9) const;\
1409 GMOCK_INTERNAL_DEFN_##value_params\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001410 private:\
1411 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
zhanyong.wan18490652009-05-11 18:54:08 +00001412 };\
1413 template <typename F> operator ::testing::Action<F>() const {\
1414 return ::testing::Action<F>(\
1415 new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\
1416 }\
1417 GMOCK_INTERNAL_DEFN_##value_params\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001418 private:\
1419 GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\
zhanyong.wan18490652009-05-11 18:54:08 +00001420 };\
1421 template <GMOCK_INTERNAL_DECL_##template_params\
1422 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1423 inline GMOCK_ACTION_CLASS_(name, value_params)<\
1424 GMOCK_INTERNAL_LIST_##template_params\
1425 GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\
1426 GMOCK_INTERNAL_DECL_##value_params) {\
1427 return GMOCK_ACTION_CLASS_(name, value_params)<\
1428 GMOCK_INTERNAL_LIST_##template_params\
1429 GMOCK_INTERNAL_LIST_TYPE_##value_params>(\
1430 GMOCK_INTERNAL_LIST_##value_params);\
1431 }\
1432 template <GMOCK_INTERNAL_DECL_##template_params\
1433 GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1434 template <typename F>\
jgm79a367e2012-04-10 16:02:11 +00001435 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1436 typename arg3_type, typename arg4_type, typename arg5_type, \
1437 typename arg6_type, typename arg7_type, typename arg8_type, \
zhanyong.wan18490652009-05-11 18:54:08 +00001438 typename arg9_type>\
1439 typename ::testing::internal::Function<F>::Result\
1440 GMOCK_ACTION_CLASS_(name, value_params)<\
1441 GMOCK_INTERNAL_LIST_##template_params\
1442 GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\
1443 gmock_PerformImpl(\
1444 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1445
shiqian326aa562009-01-09 21:43:57 +00001446#define ACTION(name)\
1447 class name##Action {\
1448 public:\
1449 name##Action() {}\
1450 template <typename F>\
1451 class gmock_Impl : public ::testing::ActionInterface<F> {\
1452 public:\
1453 typedef F function_type;\
1454 typedef typename ::testing::internal::Function<F>::Result return_type;\
1455 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1456 args_type;\
1457 gmock_Impl() {}\
1458 virtual return_type Perform(const args_type& args) {\
1459 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1460 Perform(this, args);\
1461 }\
1462 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1463 typename arg3_type, typename arg4_type, typename arg5_type, \
1464 typename arg6_type, typename arg7_type, typename arg8_type, \
1465 typename arg9_type>\
1466 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1467 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1468 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1469 arg9_type arg9) const;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001470 private:\
1471 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001472 };\
1473 template <typename F> operator ::testing::Action<F>() const {\
1474 return ::testing::Action<F>(new gmock_Impl<F>());\
1475 }\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001476 private:\
1477 GTEST_DISALLOW_ASSIGN_(name##Action);\
shiqian326aa562009-01-09 21:43:57 +00001478 };\
1479 inline name##Action name() {\
1480 return name##Action();\
1481 }\
1482 template <typename F>\
1483 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1484 typename arg3_type, typename arg4_type, typename arg5_type, \
1485 typename arg6_type, typename arg7_type, typename arg8_type, \
1486 typename arg9_type>\
1487 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001488 name##Action::gmock_Impl<F>::gmock_PerformImpl(\
1489 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001490
1491#define ACTION_P(name, p0)\
1492 template <typename p0##_type>\
1493 class name##ActionP {\
1494 public:\
1495 name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\
1496 template <typename F>\
1497 class gmock_Impl : public ::testing::ActionInterface<F> {\
1498 public:\
1499 typedef F function_type;\
1500 typedef typename ::testing::internal::Function<F>::Result return_type;\
1501 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1502 args_type;\
1503 explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\
1504 virtual return_type Perform(const args_type& args) {\
1505 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1506 Perform(this, args);\
1507 }\
1508 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1509 typename arg3_type, typename arg4_type, typename arg5_type, \
1510 typename arg6_type, typename arg7_type, typename arg8_type, \
1511 typename arg9_type>\
1512 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1513 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1514 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1515 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001516 p0##_type p0;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001517 private:\
1518 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001519 };\
1520 template <typename F> operator ::testing::Action<F>() const {\
1521 return ::testing::Action<F>(new gmock_Impl<F>(p0));\
1522 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001523 p0##_type p0;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001524 private:\
1525 GTEST_DISALLOW_ASSIGN_(name##ActionP);\
shiqian326aa562009-01-09 21:43:57 +00001526 };\
1527 template <typename p0##_type>\
1528 inline name##ActionP<p0##_type> name(p0##_type p0) {\
1529 return name##ActionP<p0##_type>(p0);\
1530 }\
1531 template <typename p0##_type>\
1532 template <typename F>\
1533 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1534 typename arg3_type, typename arg4_type, typename arg5_type, \
1535 typename arg6_type, typename arg7_type, typename arg8_type, \
1536 typename arg9_type>\
1537 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001538 name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1539 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001540
1541#define ACTION_P2(name, p0, p1)\
1542 template <typename p0##_type, typename p1##_type>\
1543 class name##ActionP2 {\
1544 public:\
1545 name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1546 p1(gmock_p1) {}\
1547 template <typename F>\
1548 class gmock_Impl : public ::testing::ActionInterface<F> {\
1549 public:\
1550 typedef F function_type;\
1551 typedef typename ::testing::internal::Function<F>::Result return_type;\
1552 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1553 args_type;\
1554 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1555 p1(gmock_p1) {}\
1556 virtual return_type Perform(const args_type& args) {\
1557 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1558 Perform(this, args);\
1559 }\
1560 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1561 typename arg3_type, typename arg4_type, typename arg5_type, \
1562 typename arg6_type, typename arg7_type, typename arg8_type, \
1563 typename arg9_type>\
1564 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1565 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1566 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1567 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001568 p0##_type p0;\
1569 p1##_type p1;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001570 private:\
1571 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001572 };\
1573 template <typename F> operator ::testing::Action<F>() const {\
1574 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\
1575 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001576 p0##_type p0;\
1577 p1##_type p1;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001578 private:\
1579 GTEST_DISALLOW_ASSIGN_(name##ActionP2);\
shiqian326aa562009-01-09 21:43:57 +00001580 };\
1581 template <typename p0##_type, typename p1##_type>\
1582 inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \
1583 p1##_type p1) {\
1584 return name##ActionP2<p0##_type, p1##_type>(p0, p1);\
1585 }\
1586 template <typename p0##_type, typename p1##_type>\
1587 template <typename F>\
1588 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1589 typename arg3_type, typename arg4_type, typename arg5_type, \
1590 typename arg6_type, typename arg7_type, typename arg8_type, \
1591 typename arg9_type>\
1592 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001593 name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1594 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001595
1596#define ACTION_P3(name, p0, p1, p2)\
1597 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1598 class name##ActionP3 {\
1599 public:\
1600 name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1601 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1602 template <typename F>\
1603 class gmock_Impl : public ::testing::ActionInterface<F> {\
1604 public:\
1605 typedef F function_type;\
1606 typedef typename ::testing::internal::Function<F>::Result return_type;\
1607 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1608 args_type;\
1609 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \
1610 p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1611 virtual return_type Perform(const args_type& args) {\
1612 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1613 Perform(this, args);\
1614 }\
1615 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1616 typename arg3_type, typename arg4_type, typename arg5_type, \
1617 typename arg6_type, typename arg7_type, typename arg8_type, \
1618 typename arg9_type>\
1619 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1620 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1621 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1622 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001623 p0##_type p0;\
1624 p1##_type p1;\
1625 p2##_type p2;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001626 private:\
1627 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001628 };\
1629 template <typename F> operator ::testing::Action<F>() const {\
1630 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\
1631 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001632 p0##_type p0;\
1633 p1##_type p1;\
1634 p2##_type p2;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001635 private:\
1636 GTEST_DISALLOW_ASSIGN_(name##ActionP3);\
shiqian326aa562009-01-09 21:43:57 +00001637 };\
1638 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1639 inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1640 p1##_type p1, p2##_type p2) {\
1641 return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1642 }\
1643 template <typename p0##_type, typename p1##_type, typename p2##_type>\
1644 template <typename F>\
1645 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1646 typename arg3_type, typename arg4_type, typename arg5_type, \
1647 typename arg6_type, typename arg7_type, typename arg8_type, \
1648 typename arg9_type>\
1649 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001650 name##ActionP3<p0##_type, p1##_type, \
1651 p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1652 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001653
1654#define ACTION_P4(name, p0, p1, p2, p3)\
1655 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1656 typename p3##_type>\
1657 class name##ActionP4 {\
1658 public:\
1659 name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1660 p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1661 p2(gmock_p2), p3(gmock_p3) {}\
1662 template <typename F>\
1663 class gmock_Impl : public ::testing::ActionInterface<F> {\
1664 public:\
1665 typedef F function_type;\
1666 typedef typename ::testing::internal::Function<F>::Result return_type;\
1667 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1668 args_type;\
1669 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1670 p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1671 p3(gmock_p3) {}\
1672 virtual return_type Perform(const args_type& args) {\
1673 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1674 Perform(this, args);\
1675 }\
1676 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1677 typename arg3_type, typename arg4_type, typename arg5_type, \
1678 typename arg6_type, typename arg7_type, typename arg8_type, \
1679 typename arg9_type>\
1680 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1681 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1682 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1683 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001684 p0##_type p0;\
1685 p1##_type p1;\
1686 p2##_type p2;\
1687 p3##_type p3;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001688 private:\
1689 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001690 };\
1691 template <typename F> operator ::testing::Action<F>() const {\
1692 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\
1693 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001694 p0##_type p0;\
1695 p1##_type p1;\
1696 p2##_type p2;\
1697 p3##_type p3;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001698 private:\
1699 GTEST_DISALLOW_ASSIGN_(name##ActionP4);\
shiqian326aa562009-01-09 21:43:57 +00001700 };\
1701 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1702 typename p3##_type>\
1703 inline name##ActionP4<p0##_type, p1##_type, p2##_type, \
1704 p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1705 p3##_type p3) {\
1706 return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \
1707 p2, p3);\
1708 }\
1709 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1710 typename p3##_type>\
1711 template <typename F>\
1712 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1713 typename arg3_type, typename arg4_type, typename arg5_type, \
1714 typename arg6_type, typename arg7_type, typename arg8_type, \
1715 typename arg9_type>\
1716 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001717 name##ActionP4<p0##_type, p1##_type, p2##_type, \
1718 p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1719 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001720
1721#define ACTION_P5(name, p0, p1, p2, p3, p4)\
1722 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1723 typename p3##_type, typename p4##_type>\
1724 class name##ActionP5 {\
1725 public:\
1726 name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1727 p2##_type gmock_p2, p3##_type gmock_p3, \
1728 p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1729 p3(gmock_p3), p4(gmock_p4) {}\
1730 template <typename F>\
1731 class gmock_Impl : public ::testing::ActionInterface<F> {\
1732 public:\
1733 typedef F function_type;\
1734 typedef typename ::testing::internal::Function<F>::Result return_type;\
1735 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1736 args_type;\
1737 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1738 p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \
1739 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\
1740 virtual return_type Perform(const args_type& args) {\
1741 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1742 Perform(this, args);\
1743 }\
1744 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1745 typename arg3_type, typename arg4_type, typename arg5_type, \
1746 typename arg6_type, typename arg7_type, typename arg8_type, \
1747 typename arg9_type>\
1748 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1749 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1750 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1751 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001752 p0##_type p0;\
1753 p1##_type p1;\
1754 p2##_type p2;\
1755 p3##_type p3;\
1756 p4##_type p4;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001757 private:\
1758 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001759 };\
1760 template <typename F> operator ::testing::Action<F>() const {\
1761 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\
1762 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001763 p0##_type p0;\
1764 p1##_type p1;\
1765 p2##_type p2;\
1766 p3##_type p3;\
1767 p4##_type p4;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001768 private:\
1769 GTEST_DISALLOW_ASSIGN_(name##ActionP5);\
shiqian326aa562009-01-09 21:43:57 +00001770 };\
1771 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1772 typename p3##_type, typename p4##_type>\
1773 inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1774 p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1775 p4##_type p4) {\
1776 return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1777 p4##_type>(p0, p1, p2, p3, p4);\
1778 }\
1779 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1780 typename p3##_type, typename p4##_type>\
1781 template <typename F>\
1782 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1783 typename arg3_type, typename arg4_type, typename arg5_type, \
1784 typename arg6_type, typename arg7_type, typename arg8_type, \
1785 typename arg9_type>\
1786 typename ::testing::internal::Function<F>::Result\
zhanyong.wan33c0af02009-04-03 00:10:12 +00001787 name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1788 p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1789 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001790
1791#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\
1792 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1793 typename p3##_type, typename p4##_type, typename p5##_type>\
1794 class name##ActionP6 {\
1795 public:\
1796 name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1797 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1798 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1799 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1800 template <typename F>\
1801 class gmock_Impl : public ::testing::ActionInterface<F> {\
1802 public:\
1803 typedef F function_type;\
1804 typedef typename ::testing::internal::Function<F>::Result return_type;\
1805 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1806 args_type;\
1807 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1808 p3##_type gmock_p3, p4##_type gmock_p4, \
1809 p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1810 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1811 virtual return_type Perform(const args_type& args) {\
1812 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1813 Perform(this, args);\
1814 }\
1815 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1816 typename arg3_type, typename arg4_type, typename arg5_type, \
1817 typename arg6_type, typename arg7_type, typename arg8_type, \
1818 typename arg9_type>\
1819 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1820 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1821 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1822 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001823 p0##_type p0;\
1824 p1##_type p1;\
1825 p2##_type p2;\
1826 p3##_type p3;\
1827 p4##_type p4;\
1828 p5##_type p5;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001829 private:\
1830 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001831 };\
1832 template <typename F> operator ::testing::Action<F>() const {\
1833 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\
1834 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001835 p0##_type p0;\
1836 p1##_type p1;\
1837 p2##_type p2;\
1838 p3##_type p3;\
1839 p4##_type p4;\
1840 p5##_type p5;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001841 private:\
1842 GTEST_DISALLOW_ASSIGN_(name##ActionP6);\
shiqian326aa562009-01-09 21:43:57 +00001843 };\
1844 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1845 typename p3##_type, typename p4##_type, typename p5##_type>\
1846 inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1847 p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1848 p3##_type p3, p4##_type p4, p5##_type p5) {\
1849 return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1850 p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1851 }\
1852 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1853 typename p3##_type, typename p4##_type, typename p5##_type>\
1854 template <typename F>\
1855 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1856 typename arg3_type, typename arg4_type, typename arg5_type, \
1857 typename arg6_type, typename arg7_type, typename arg8_type, \
1858 typename arg9_type>\
1859 typename ::testing::internal::Function<F>::Result\
1860 name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00001861 p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1862 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001863
1864#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\
1865 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1866 typename p3##_type, typename p4##_type, typename p5##_type, \
1867 typename p6##_type>\
1868 class name##ActionP7 {\
1869 public:\
1870 name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1871 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1872 p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1873 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1874 p6(gmock_p6) {}\
1875 template <typename F>\
1876 class gmock_Impl : public ::testing::ActionInterface<F> {\
1877 public:\
1878 typedef F function_type;\
1879 typedef typename ::testing::internal::Function<F>::Result return_type;\
1880 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1881 args_type;\
1882 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1883 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1884 p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1885 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
1886 virtual return_type Perform(const args_type& args) {\
1887 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1888 Perform(this, args);\
1889 }\
1890 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1891 typename arg3_type, typename arg4_type, typename arg5_type, \
1892 typename arg6_type, typename arg7_type, typename arg8_type, \
1893 typename arg9_type>\
1894 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1895 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1896 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1897 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001898 p0##_type p0;\
1899 p1##_type p1;\
1900 p2##_type p2;\
1901 p3##_type p3;\
1902 p4##_type p4;\
1903 p5##_type p5;\
1904 p6##_type p6;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001905 private:\
1906 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001907 };\
1908 template <typename F> operator ::testing::Action<F>() const {\
1909 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1910 p6));\
1911 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001912 p0##_type p0;\
1913 p1##_type p1;\
1914 p2##_type p2;\
1915 p3##_type p3;\
1916 p4##_type p4;\
1917 p5##_type p5;\
1918 p6##_type p6;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001919 private:\
1920 GTEST_DISALLOW_ASSIGN_(name##ActionP7);\
shiqian326aa562009-01-09 21:43:57 +00001921 };\
1922 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1923 typename p3##_type, typename p4##_type, typename p5##_type, \
1924 typename p6##_type>\
1925 inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1926 p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1927 p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1928 p6##_type p6) {\
1929 return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1930 p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1931 }\
1932 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1933 typename p3##_type, typename p4##_type, typename p5##_type, \
1934 typename p6##_type>\
1935 template <typename F>\
1936 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1937 typename arg3_type, typename arg4_type, typename arg5_type, \
1938 typename arg6_type, typename arg7_type, typename arg8_type, \
1939 typename arg9_type>\
1940 typename ::testing::internal::Function<F>::Result\
1941 name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00001942 p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1943 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00001944
1945#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\
1946 template <typename p0##_type, typename p1##_type, typename p2##_type, \
1947 typename p3##_type, typename p4##_type, typename p5##_type, \
1948 typename p6##_type, typename p7##_type>\
1949 class name##ActionP8 {\
1950 public:\
1951 name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1952 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1953 p5##_type gmock_p5, p6##_type gmock_p6, \
1954 p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1955 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1956 p7(gmock_p7) {}\
1957 template <typename F>\
1958 class gmock_Impl : public ::testing::ActionInterface<F> {\
1959 public:\
1960 typedef F function_type;\
1961 typedef typename ::testing::internal::Function<F>::Result return_type;\
1962 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1963 args_type;\
1964 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1965 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1966 p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \
1967 p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \
1968 p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
1969 virtual return_type Perform(const args_type& args) {\
1970 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1971 Perform(this, args);\
1972 }\
1973 template <typename arg0_type, typename arg1_type, typename arg2_type, \
1974 typename arg3_type, typename arg4_type, typename arg5_type, \
1975 typename arg6_type, typename arg7_type, typename arg8_type, \
1976 typename arg9_type>\
1977 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1978 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1979 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1980 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001981 p0##_type p0;\
1982 p1##_type p1;\
1983 p2##_type p2;\
1984 p3##_type p3;\
1985 p4##_type p4;\
1986 p5##_type p5;\
1987 p6##_type p6;\
1988 p7##_type p7;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00001989 private:\
1990 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00001991 };\
1992 template <typename F> operator ::testing::Action<F>() const {\
1993 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1994 p6, p7));\
1995 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00001996 p0##_type p0;\
1997 p1##_type p1;\
1998 p2##_type p2;\
1999 p3##_type p3;\
2000 p4##_type p4;\
2001 p5##_type p5;\
2002 p6##_type p6;\
2003 p7##_type p7;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002004 private:\
2005 GTEST_DISALLOW_ASSIGN_(name##ActionP8);\
shiqian326aa562009-01-09 21:43:57 +00002006 };\
2007 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2008 typename p3##_type, typename p4##_type, typename p5##_type, \
2009 typename p6##_type, typename p7##_type>\
2010 inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2011 p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
2012 p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
2013 p6##_type p6, p7##_type p7) {\
2014 return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2015 p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
2016 p6, p7);\
2017 }\
2018 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2019 typename p3##_type, typename p4##_type, typename p5##_type, \
2020 typename p6##_type, typename p7##_type>\
2021 template <typename F>\
2022 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2023 typename arg3_type, typename arg4_type, typename arg5_type, \
2024 typename arg6_type, typename arg7_type, typename arg8_type, \
2025 typename arg9_type>\
2026 typename ::testing::internal::Function<F>::Result\
2027 name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00002028 p5##_type, p6##_type, \
2029 p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2030 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00002031
2032#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
2033 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2034 typename p3##_type, typename p4##_type, typename p5##_type, \
2035 typename p6##_type, typename p7##_type, typename p8##_type>\
2036 class name##ActionP9 {\
2037 public:\
2038 name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \
2039 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2040 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2041 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2042 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2043 p8(gmock_p8) {}\
2044 template <typename F>\
2045 class gmock_Impl : public ::testing::ActionInterface<F> {\
2046 public:\
2047 typedef F function_type;\
2048 typedef typename ::testing::internal::Function<F>::Result return_type;\
2049 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2050 args_type;\
2051 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2052 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2053 p6##_type gmock_p6, p7##_type gmock_p7, \
2054 p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2055 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2056 p7(gmock_p7), p8(gmock_p8) {}\
2057 virtual return_type Perform(const args_type& args) {\
2058 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2059 Perform(this, args);\
2060 }\
2061 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2062 typename arg3_type, typename arg4_type, typename arg5_type, \
2063 typename arg6_type, typename arg7_type, typename arg8_type, \
2064 typename arg9_type>\
2065 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2066 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2067 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2068 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002069 p0##_type p0;\
2070 p1##_type p1;\
2071 p2##_type p2;\
2072 p3##_type p3;\
2073 p4##_type p4;\
2074 p5##_type p5;\
2075 p6##_type p6;\
2076 p7##_type p7;\
2077 p8##_type p8;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002078 private:\
2079 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00002080 };\
2081 template <typename F> operator ::testing::Action<F>() const {\
2082 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2083 p6, p7, p8));\
2084 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002085 p0##_type p0;\
2086 p1##_type p1;\
2087 p2##_type p2;\
2088 p3##_type p3;\
2089 p4##_type p4;\
2090 p5##_type p5;\
2091 p6##_type p6;\
2092 p7##_type p7;\
2093 p8##_type p8;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002094 private:\
2095 GTEST_DISALLOW_ASSIGN_(name##ActionP9);\
shiqian326aa562009-01-09 21:43:57 +00002096 };\
2097 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2098 typename p3##_type, typename p4##_type, typename p5##_type, \
2099 typename p6##_type, typename p7##_type, typename p8##_type>\
2100 inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2101 p4##_type, p5##_type, p6##_type, p7##_type, \
2102 p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2103 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
2104 p8##_type p8) {\
2105 return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2106 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
2107 p3, p4, p5, p6, p7, p8);\
2108 }\
2109 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2110 typename p3##_type, typename p4##_type, typename p5##_type, \
2111 typename p6##_type, typename p7##_type, typename p8##_type>\
2112 template <typename F>\
2113 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2114 typename arg3_type, typename arg4_type, typename arg5_type, \
2115 typename arg6_type, typename arg7_type, typename arg8_type, \
2116 typename arg9_type>\
2117 typename ::testing::internal::Function<F>::Result\
2118 name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00002119 p5##_type, p6##_type, p7##_type, \
2120 p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2121 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00002122
2123#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\
2124 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2125 typename p3##_type, typename p4##_type, typename p5##_type, \
2126 typename p6##_type, typename p7##_type, typename p8##_type, \
2127 typename p9##_type>\
2128 class name##ActionP10 {\
2129 public:\
2130 name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \
2131 p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2132 p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2133 p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
2134 p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2135 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2136 template <typename F>\
2137 class gmock_Impl : public ::testing::ActionInterface<F> {\
2138 public:\
2139 typedef F function_type;\
2140 typedef typename ::testing::internal::Function<F>::Result return_type;\
2141 typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2142 args_type;\
2143 gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2144 p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2145 p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
2146 p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2147 p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2148 p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2149 virtual return_type Perform(const args_type& args) {\
2150 return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2151 Perform(this, args);\
2152 }\
2153 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2154 typename arg3_type, typename arg4_type, typename arg5_type, \
2155 typename arg6_type, typename arg7_type, typename arg8_type, \
2156 typename arg9_type>\
2157 return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2158 arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2159 arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2160 arg9_type arg9) const;\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002161 p0##_type p0;\
2162 p1##_type p1;\
2163 p2##_type p2;\
2164 p3##_type p3;\
2165 p4##_type p4;\
2166 p5##_type p5;\
2167 p6##_type p6;\
2168 p7##_type p7;\
2169 p8##_type p8;\
2170 p9##_type p9;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002171 private:\
2172 GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
shiqian326aa562009-01-09 21:43:57 +00002173 };\
2174 template <typename F> operator ::testing::Action<F>() const {\
2175 return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2176 p6, p7, p8, p9));\
2177 }\
zhanyong.wanc069d7f2009-02-02 20:51:53 +00002178 p0##_type p0;\
2179 p1##_type p1;\
2180 p2##_type p2;\
2181 p3##_type p3;\
2182 p4##_type p4;\
2183 p5##_type p5;\
2184 p6##_type p6;\
2185 p7##_type p7;\
2186 p8##_type p8;\
2187 p9##_type p9;\
zhanyong.wan32de5f52009-12-23 00:13:23 +00002188 private:\
2189 GTEST_DISALLOW_ASSIGN_(name##ActionP10);\
shiqian326aa562009-01-09 21:43:57 +00002190 };\
2191 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2192 typename p3##_type, typename p4##_type, typename p5##_type, \
2193 typename p6##_type, typename p7##_type, typename p8##_type, \
2194 typename p9##_type>\
2195 inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2196 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2197 p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2198 p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2199 p9##_type p9) {\
2200 return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2201 p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2202 p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2203 }\
2204 template <typename p0##_type, typename p1##_type, typename p2##_type, \
2205 typename p3##_type, typename p4##_type, typename p5##_type, \
2206 typename p6##_type, typename p7##_type, typename p8##_type, \
2207 typename p9##_type>\
2208 template <typename F>\
2209 template <typename arg0_type, typename arg1_type, typename arg2_type, \
2210 typename arg3_type, typename arg4_type, typename arg5_type, \
2211 typename arg6_type, typename arg7_type, typename arg8_type, \
2212 typename arg9_type>\
2213 typename ::testing::internal::Function<F>::Result\
2214 name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
zhanyong.wan33c0af02009-04-03 00:10:12 +00002215 p5##_type, p6##_type, p7##_type, p8##_type, \
2216 p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2217 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
shiqian326aa562009-01-09 21:43:57 +00002218
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002219// TODO(wan@google.com): move the following to a different .h file
2220// such that we don't have to run 'pump' every time the code is
2221// updated.
zhanyong.wane1cdce52009-02-06 01:09:43 +00002222namespace testing {
2223
zhanyong.wan32de5f52009-12-23 00:13:23 +00002224// The ACTION*() macros trigger warning C4100 (unreferenced formal
2225// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in
2226// the macro definition, as the warnings are generated when the macro
2227// is expanded and macro expansion cannot contain #pragma. Therefore
2228// we suppress them here.
2229#ifdef _MSC_VER
zhanyong.wan658ac0b2011-02-24 07:29:13 +00002230# pragma warning(push)
2231# pragma warning(disable:4100)
zhanyong.wan32de5f52009-12-23 00:13:23 +00002232#endif
2233
zhanyong.wan16cf4732009-05-14 20:55:30 +00002234// Various overloads for InvokeArgument<N>().
2235//
2236// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
2237// (0-based) argument, which must be a k-ary callable, of the mock
2238// function, with arguments a1, a2, ..., a_k.
2239//
2240// Notes:
2241//
2242// 1. The arguments are passed by value by default. If you need to
2243// pass an argument by reference, wrap it inside ByRef(). For
2244// example,
2245//
2246// InvokeArgument<1>(5, string("Hello"), ByRef(foo))
2247//
2248// passes 5 and string("Hello") by value, and passes foo by
2249// reference.
2250//
2251// 2. If the callable takes an argument by reference but ByRef() is
2252// not used, it will receive the reference to a copy of the value,
2253// instead of the original value. For example, when the 0-th
2254// argument of the mock function takes a const string&, the action
2255//
2256// InvokeArgument<0>(string("Hello"))
2257//
2258// makes a copy of the temporary string("Hello") object and passes a
2259// reference of the copy, instead of the original temporary object,
2260// to the callable. This makes it easy for a user to define an
2261// InvokeArgument action from temporary values and have it performed
2262// later.
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002263
zhanyong.wan16cf4732009-05-14 20:55:30 +00002264ACTION_TEMPLATE(InvokeArgument,
2265 HAS_1_TEMPLATE_PARAMS(int, k),
2266 AND_0_VALUE_PARAMS()) {
2267 return internal::CallableHelper<return_type>::Call(
2268 ::std::tr1::get<k>(args));
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002269}
2270
zhanyong.wan16cf4732009-05-14 20:55:30 +00002271ACTION_TEMPLATE(InvokeArgument,
2272 HAS_1_TEMPLATE_PARAMS(int, k),
2273 AND_1_VALUE_PARAMS(p0)) {
2274 return internal::CallableHelper<return_type>::Call(
2275 ::std::tr1::get<k>(args), p0);
2276}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002277
zhanyong.wan16cf4732009-05-14 20:55:30 +00002278ACTION_TEMPLATE(InvokeArgument,
2279 HAS_1_TEMPLATE_PARAMS(int, k),
2280 AND_2_VALUE_PARAMS(p0, p1)) {
2281 return internal::CallableHelper<return_type>::Call(
2282 ::std::tr1::get<k>(args), p0, p1);
2283}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002284
zhanyong.wan16cf4732009-05-14 20:55:30 +00002285ACTION_TEMPLATE(InvokeArgument,
2286 HAS_1_TEMPLATE_PARAMS(int, k),
2287 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2288 return internal::CallableHelper<return_type>::Call(
2289 ::std::tr1::get<k>(args), p0, p1, p2);
2290}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002291
zhanyong.wan16cf4732009-05-14 20:55:30 +00002292ACTION_TEMPLATE(InvokeArgument,
2293 HAS_1_TEMPLATE_PARAMS(int, k),
2294 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2295 return internal::CallableHelper<return_type>::Call(
2296 ::std::tr1::get<k>(args), p0, p1, p2, p3);
2297}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002298
zhanyong.wan16cf4732009-05-14 20:55:30 +00002299ACTION_TEMPLATE(InvokeArgument,
2300 HAS_1_TEMPLATE_PARAMS(int, k),
2301 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2302 return internal::CallableHelper<return_type>::Call(
2303 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4);
2304}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002305
zhanyong.wan16cf4732009-05-14 20:55:30 +00002306ACTION_TEMPLATE(InvokeArgument,
2307 HAS_1_TEMPLATE_PARAMS(int, k),
2308 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2309 return internal::CallableHelper<return_type>::Call(
2310 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5);
2311}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002312
zhanyong.wan16cf4732009-05-14 20:55:30 +00002313ACTION_TEMPLATE(InvokeArgument,
2314 HAS_1_TEMPLATE_PARAMS(int, k),
2315 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2316 return internal::CallableHelper<return_type>::Call(
2317 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6);
2318}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002319
zhanyong.wan16cf4732009-05-14 20:55:30 +00002320ACTION_TEMPLATE(InvokeArgument,
2321 HAS_1_TEMPLATE_PARAMS(int, k),
2322 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2323 return internal::CallableHelper<return_type>::Call(
2324 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);
2325}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002326
zhanyong.wan16cf4732009-05-14 20:55:30 +00002327ACTION_TEMPLATE(InvokeArgument,
2328 HAS_1_TEMPLATE_PARAMS(int, k),
2329 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2330 return internal::CallableHelper<return_type>::Call(
2331 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);
2332}
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002333
zhanyong.wan16cf4732009-05-14 20:55:30 +00002334ACTION_TEMPLATE(InvokeArgument,
2335 HAS_1_TEMPLATE_PARAMS(int, k),
2336 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2337 return internal::CallableHelper<return_type>::Call(
2338 ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2339}
zhanyong.wan7f4c2c02009-02-19 22:38:27 +00002340
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002341// Various overloads for ReturnNew<T>().
2342//
2343// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
2344// instance of type T, constructed on the heap with constructor arguments
2345// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
zhanyong.wan16cf4732009-05-14 20:55:30 +00002346ACTION_TEMPLATE(ReturnNew,
2347 HAS_1_TEMPLATE_PARAMS(typename, T),
2348 AND_0_VALUE_PARAMS()) {
2349 return new T();
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002350}
2351
zhanyong.wan16cf4732009-05-14 20:55:30 +00002352ACTION_TEMPLATE(ReturnNew,
2353 HAS_1_TEMPLATE_PARAMS(typename, T),
2354 AND_1_VALUE_PARAMS(p0)) {
2355 return new T(p0);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002356}
2357
zhanyong.wan16cf4732009-05-14 20:55:30 +00002358ACTION_TEMPLATE(ReturnNew,
2359 HAS_1_TEMPLATE_PARAMS(typename, T),
2360 AND_2_VALUE_PARAMS(p0, p1)) {
2361 return new T(p0, p1);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002362}
2363
zhanyong.wan16cf4732009-05-14 20:55:30 +00002364ACTION_TEMPLATE(ReturnNew,
2365 HAS_1_TEMPLATE_PARAMS(typename, T),
2366 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2367 return new T(p0, p1, p2);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002368}
2369
zhanyong.wan16cf4732009-05-14 20:55:30 +00002370ACTION_TEMPLATE(ReturnNew,
2371 HAS_1_TEMPLATE_PARAMS(typename, T),
2372 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2373 return new T(p0, p1, p2, p3);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002374}
2375
zhanyong.wan16cf4732009-05-14 20:55:30 +00002376ACTION_TEMPLATE(ReturnNew,
2377 HAS_1_TEMPLATE_PARAMS(typename, T),
2378 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2379 return new T(p0, p1, p2, p3, p4);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002380}
2381
zhanyong.wan16cf4732009-05-14 20:55:30 +00002382ACTION_TEMPLATE(ReturnNew,
2383 HAS_1_TEMPLATE_PARAMS(typename, T),
2384 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2385 return new T(p0, p1, p2, p3, p4, p5);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002386}
2387
zhanyong.wan16cf4732009-05-14 20:55:30 +00002388ACTION_TEMPLATE(ReturnNew,
2389 HAS_1_TEMPLATE_PARAMS(typename, T),
2390 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2391 return new T(p0, p1, p2, p3, p4, p5, p6);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002392}
2393
zhanyong.wan16cf4732009-05-14 20:55:30 +00002394ACTION_TEMPLATE(ReturnNew,
2395 HAS_1_TEMPLATE_PARAMS(typename, T),
2396 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2397 return new T(p0, p1, p2, p3, p4, p5, p6, p7);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002398}
2399
zhanyong.wan16cf4732009-05-14 20:55:30 +00002400ACTION_TEMPLATE(ReturnNew,
2401 HAS_1_TEMPLATE_PARAMS(typename, T),
2402 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2403 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002404}
2405
zhanyong.wan16cf4732009-05-14 20:55:30 +00002406ACTION_TEMPLATE(ReturnNew,
2407 HAS_1_TEMPLATE_PARAMS(typename, T),
2408 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2409 return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
zhanyong.wan1c8eb1c2009-04-09 07:29:58 +00002410}
2411
zhanyong.wan32de5f52009-12-23 00:13:23 +00002412#ifdef _MSC_VER
zhanyong.wan658ac0b2011-02-24 07:29:13 +00002413# pragma warning(pop)
zhanyong.wan32de5f52009-12-23 00:13:23 +00002414#endif
2415
zhanyong.wane1cdce52009-02-06 01:09:43 +00002416} // namespace testing
2417
shiqiane35fdd92008-12-10 05:08:54 +00002418#endif // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_