Generate gromacs.7 from the wrapper binary
[alexxy/gromacs.git] / src / external / gmock-1.6.0 / include / gmock / gmock-generated-actions.h
1 // 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
41 #include "gmock/gmock-actions.h"
42 #include "gmock/internal/gmock-port.h"
43
44 namespace testing {
45 namespace 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.
50 template <typename Result, typename ArgumentTuple>
51 class InvokeHelper;
52
53 template <typename R>
54 class 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
69 template <typename R, typename A1>
70 class 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
87 template <typename R, typename A1, typename A2>
88 class 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
105 template <typename R, typename A1, typename A2, typename A3>
106 class 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
124 template <typename R, typename A1, typename A2, typename A3, typename A4>
125 class 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
144 template <typename R, typename A1, typename A2, typename A3, typename A4,
145     typename A5>
146 class 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
166 template <typename R, typename A1, typename A2, typename A3, typename A4,
167     typename A5, typename A6>
168 class 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
188 template <typename R, typename A1, typename A2, typename A3, typename A4,
189     typename A5, typename A6, typename A7>
190 class 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
211 template <typename R, typename A1, typename A2, typename A3, typename A4,
212     typename A5, typename A6, typename A7, typename A8>
213 class 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
234 template <typename R, typename A1, typename A2, typename A3, typename A4,
235     typename A5, typename A6, typename A7, typename A8, typename A9>
236 class 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
258 template <typename R, typename A1, typename A2, typename A3, typename A4,
259     typename A5, typename A6, typename A7, typename A8, typename A9,
260     typename A10>
261 class 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
285 // 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.
295 template <typename R>
296 class CallableHelper {
297  public:
298   // Calls a nullary callable.
299   template <typename Function>
300   static R Call(Function function) { return function(); }
301
302   // Calls a unary callable.
303
304   // We deliberately pass a1 by value instead of const reference here
305   // in case it is a C-string literal.  If we had declared the
306   // parameter as 'const A1& a1' and write Call(function, "Hi"), the
307   // compiler would've thought A1 is 'char[3]', which causes trouble
308   // when you need to copy a value of type A1.  By declaring the
309   // parameter as 'A1 a1', the compiler will correctly infer that A1
310   // is 'const char*' when it sees Call(function, "Hi").
311   //
312   // Since this function is defined inline, the compiler can get rid
313   // of the copying of the arguments.  Therefore the performance won't
314   // be hurt.
315   template <typename Function, typename A1>
316   static R Call(Function function, A1 a1) { return function(a1); }
317
318   // Calls a binary callable.
319   template <typename Function, typename A1, typename A2>
320   static R Call(Function function, A1 a1, A2 a2) {
321     return function(a1, a2);
322   }
323
324   // Calls a ternary callable.
325   template <typename Function, typename A1, typename A2, typename A3>
326   static R Call(Function function, A1 a1, A2 a2, A3 a3) {
327     return function(a1, a2, a3);
328   }
329
330   // Calls a 4-ary callable.
331   template <typename Function, typename A1, typename A2, typename A3,
332       typename A4>
333   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4) {
334     return function(a1, a2, a3, a4);
335   }
336
337   // Calls a 5-ary callable.
338   template <typename Function, typename A1, typename A2, typename A3,
339       typename A4, typename A5>
340   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
341     return function(a1, a2, a3, a4, a5);
342   }
343
344   // Calls a 6-ary callable.
345   template <typename Function, typename A1, typename A2, typename A3,
346       typename A4, typename A5, typename A6>
347   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
348     return function(a1, a2, a3, a4, a5, a6);
349   }
350
351   // Calls a 7-ary callable.
352   template <typename Function, typename A1, typename A2, typename A3,
353       typename A4, typename A5, typename A6, typename A7>
354   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
355       A7 a7) {
356     return function(a1, a2, a3, a4, a5, a6, a7);
357   }
358
359   // Calls a 8-ary callable.
360   template <typename Function, typename A1, typename A2, typename A3,
361       typename A4, typename A5, typename A6, typename A7, typename A8>
362   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
363       A7 a7, A8 a8) {
364     return function(a1, a2, a3, a4, a5, a6, a7, a8);
365   }
366
367   // Calls a 9-ary callable.
368   template <typename Function, typename A1, typename A2, typename A3,
369       typename A4, typename A5, typename A6, typename A7, typename A8,
370       typename A9>
371   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
372       A7 a7, A8 a8, A9 a9) {
373     return function(a1, a2, a3, a4, a5, a6, a7, a8, a9);
374   }
375
376   // Calls a 10-ary callable.
377   template <typename Function, typename A1, typename A2, typename A3,
378       typename A4, typename A5, typename A6, typename A7, typename A8,
379       typename A9, typename A10>
380   static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
381       A7 a7, A8 a8, A9 a9, A10 a10) {
382     return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
383   }
384
385 };  // class CallableHelper
386
387 // An INTERNAL macro for extracting the type of a tuple field.  It's
388 // subject to change without notice - DO NOT USE IN USER CODE!
389 #define GMOCK_FIELD_(Tuple, N) \
390     typename ::std::tr1::tuple_element<N, Tuple>::type
391
392 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
393 // type of an n-ary function whose i-th (1-based) argument type is the
394 // k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
395 // type, and whose return type is Result.  For example,
396 //   SelectArgs<int, ::std::tr1::tuple<bool, char, double, long>, 0, 3>::type
397 // is int(bool, long).
398 //
399 // SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
400 // returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
401 // For example,
402 //   SelectArgs<int, ::std::tr1::tuple<bool, char, double>, 2, 0>::Select(
403 //       ::std::tr1::make_tuple(true, 'a', 2.5))
404 // returns ::std::tr1::tuple (2.5, true).
405 //
406 // The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
407 // in the range [0, 10].  Duplicates are allowed and they don't have
408 // to be in an ascending or descending order.
409
410 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
411     int k4, int k5, int k6, int k7, int k8, int k9, int k10>
412 class SelectArgs {
413  public:
414   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
415       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
416       GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
417       GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
418       GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),
419       GMOCK_FIELD_(ArgumentTuple, k10));
420   typedef typename Function<type>::ArgumentTuple SelectedArgs;
421   static SelectedArgs Select(const ArgumentTuple& args) {
422     using ::std::tr1::get;
423     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
424         get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
425         get<k8>(args), get<k9>(args), get<k10>(args));
426   }
427 };
428
429 template <typename Result, typename ArgumentTuple>
430 class SelectArgs<Result, ArgumentTuple,
431                  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
432  public:
433   typedef Result type();
434   typedef typename Function<type>::ArgumentTuple SelectedArgs;
435   static SelectedArgs Select(const ArgumentTuple& /* args */) {
436     using ::std::tr1::get;
437     return SelectedArgs();
438   }
439 };
440
441 template <typename Result, typename ArgumentTuple, int k1>
442 class SelectArgs<Result, ArgumentTuple,
443                  k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
444  public:
445   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));
446   typedef typename Function<type>::ArgumentTuple SelectedArgs;
447   static SelectedArgs Select(const ArgumentTuple& args) {
448     using ::std::tr1::get;
449     return SelectedArgs(get<k1>(args));
450   }
451 };
452
453 template <typename Result, typename ArgumentTuple, int k1, int k2>
454 class SelectArgs<Result, ArgumentTuple,
455                  k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {
456  public:
457   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
458       GMOCK_FIELD_(ArgumentTuple, k2));
459   typedef typename Function<type>::ArgumentTuple SelectedArgs;
460   static SelectedArgs Select(const ArgumentTuple& args) {
461     using ::std::tr1::get;
462     return SelectedArgs(get<k1>(args), get<k2>(args));
463   }
464 };
465
466 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
467 class SelectArgs<Result, ArgumentTuple,
468                  k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {
469  public:
470   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
471       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));
472   typedef typename Function<type>::ArgumentTuple SelectedArgs;
473   static SelectedArgs Select(const ArgumentTuple& args) {
474     using ::std::tr1::get;
475     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));
476   }
477 };
478
479 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
480     int k4>
481 class SelectArgs<Result, ArgumentTuple,
482                  k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {
483  public:
484   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
485       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
486       GMOCK_FIELD_(ArgumentTuple, k4));
487   typedef typename Function<type>::ArgumentTuple SelectedArgs;
488   static SelectedArgs Select(const ArgumentTuple& args) {
489     using ::std::tr1::get;
490     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
491         get<k4>(args));
492   }
493 };
494
495 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
496     int k4, int k5>
497 class SelectArgs<Result, ArgumentTuple,
498                  k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {
499  public:
500   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
501       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
502       GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));
503   typedef typename Function<type>::ArgumentTuple SelectedArgs;
504   static SelectedArgs Select(const ArgumentTuple& args) {
505     using ::std::tr1::get;
506     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
507         get<k4>(args), get<k5>(args));
508   }
509 };
510
511 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
512     int k4, int k5, int k6>
513 class SelectArgs<Result, ArgumentTuple,
514                  k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {
515  public:
516   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
517       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
518       GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
519       GMOCK_FIELD_(ArgumentTuple, k6));
520   typedef typename Function<type>::ArgumentTuple SelectedArgs;
521   static SelectedArgs Select(const ArgumentTuple& args) {
522     using ::std::tr1::get;
523     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
524         get<k4>(args), get<k5>(args), get<k6>(args));
525   }
526 };
527
528 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
529     int k4, int k5, int k6, int k7>
530 class SelectArgs<Result, ArgumentTuple,
531                  k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {
532  public:
533   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
534       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
535       GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
536       GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));
537   typedef typename Function<type>::ArgumentTuple SelectedArgs;
538   static SelectedArgs Select(const ArgumentTuple& args) {
539     using ::std::tr1::get;
540     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
541         get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));
542   }
543 };
544
545 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
546     int k4, int k5, int k6, int k7, int k8>
547 class SelectArgs<Result, ArgumentTuple,
548                  k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {
549  public:
550   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
551       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
552       GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
553       GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
554       GMOCK_FIELD_(ArgumentTuple, k8));
555   typedef typename Function<type>::ArgumentTuple SelectedArgs;
556   static SelectedArgs Select(const ArgumentTuple& args) {
557     using ::std::tr1::get;
558     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
559         get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
560         get<k8>(args));
561   }
562 };
563
564 template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
565     int k4, int k5, int k6, int k7, int k8, int k9>
566 class SelectArgs<Result, ArgumentTuple,
567                  k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {
568  public:
569   typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
570       GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
571       GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
572       GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
573       GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));
574   typedef typename Function<type>::ArgumentTuple SelectedArgs;
575   static SelectedArgs Select(const ArgumentTuple& args) {
576     using ::std::tr1::get;
577     return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
578         get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
579         get<k8>(args), get<k9>(args));
580   }
581 };
582
583 #undef GMOCK_FIELD_
584
585 // Implements the WithArgs action.
586 template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,
587     int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
588     int k9 = -1, int k10 = -1>
589 class WithArgsAction {
590  public:
591   explicit WithArgsAction(const InnerAction& action) : action_(action) {}
592
593   template <typename F>
594   operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
595
596  private:
597   template <typename F>
598   class Impl : public ActionInterface<F> {
599    public:
600     typedef typename Function<F>::Result Result;
601     typedef typename Function<F>::ArgumentTuple ArgumentTuple;
602
603     explicit Impl(const InnerAction& action) : action_(action) {}
604
605     virtual Result Perform(const ArgumentTuple& args) {
606       return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,
607           k5, k6, k7, k8, k9, k10>::Select(args));
608     }
609
610    private:
611     typedef typename SelectArgs<Result, ArgumentTuple,
612         k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;
613
614     Action<InnerFunctionType> action_;
615   };
616
617   const InnerAction action_;
618
619   GTEST_DISALLOW_ASSIGN_(WithArgsAction);
620 };
621
622 // A macro from the ACTION* family (defined later in this file)
623 // defines an action that can be used in a mock function.  Typically,
624 // these actions only care about a subset of the arguments of the mock
625 // function.  For example, if such an action only uses the second
626 // argument, it can be used in any mock function that takes >= 2
627 // arguments where the type of the second argument is compatible.
628 //
629 // Therefore, the action implementation must be prepared to take more
630 // arguments than it needs.  The ExcessiveArg type is used to
631 // represent those excessive arguments.  In order to keep the compiler
632 // error messages tractable, we define it in the testing namespace
633 // instead of testing::internal.  However, this is an INTERNAL TYPE
634 // and subject to change without notice, so a user MUST NOT USE THIS
635 // TYPE DIRECTLY.
636 struct ExcessiveArg {};
637
638 // A helper class needed for implementing the ACTION* macros.
639 template <typename Result, class Impl>
640 class ActionHelper {
641  public:
642   static Result Perform(Impl* impl, const ::std::tr1::tuple<>& args) {
643     using ::std::tr1::get;
644     return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
645         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
646         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
647         ExcessiveArg());
648   }
649
650   template <typename A0>
651   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0>& args) {
652     using ::std::tr1::get;
653     return impl->template gmock_PerformImpl<A0>(args, get<0>(args),
654         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
655         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
656         ExcessiveArg());
657   }
658
659   template <typename A0, typename A1>
660   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1>& args) {
661     using ::std::tr1::get;
662     return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),
663         get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
664         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
665         ExcessiveArg());
666   }
667
668   template <typename A0, typename A1, typename A2>
669   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2>& args) {
670     using ::std::tr1::get;
671     return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),
672         get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),
673         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
674         ExcessiveArg());
675   }
676
677   template <typename A0, typename A1, typename A2, typename A3>
678   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2,
679       A3>& args) {
680     using ::std::tr1::get;
681     return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),
682         get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),
683         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
684         ExcessiveArg());
685   }
686
687   template <typename A0, typename A1, typename A2, typename A3, typename A4>
688   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3,
689       A4>& args) {
690     using ::std::tr1::get;
691     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
692         get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
693         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
694         ExcessiveArg());
695   }
696
697   template <typename A0, typename A1, typename A2, typename A3, typename A4,
698       typename A5>
699   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
700       A5>& args) {
701     using ::std::tr1::get;
702     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
703         get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
704         get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
705         ExcessiveArg());
706   }
707
708   template <typename A0, typename A1, typename A2, typename A3, typename A4,
709       typename A5, typename A6>
710   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
711       A5, A6>& args) {
712     using ::std::tr1::get;
713     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
714         get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
715         get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),
716         ExcessiveArg());
717   }
718
719   template <typename A0, typename A1, typename A2, typename A3, typename A4,
720       typename A5, typename A6, typename A7>
721   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
722       A5, A6, A7>& args) {
723     using ::std::tr1::get;
724     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
725         A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
726         get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),
727         ExcessiveArg());
728   }
729
730   template <typename A0, typename A1, typename A2, typename A3, typename A4,
731       typename A5, typename A6, typename A7, typename A8>
732   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
733       A5, A6, A7, A8>& args) {
734     using ::std::tr1::get;
735     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
736         A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
737         get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
738         ExcessiveArg());
739   }
740
741   template <typename A0, typename A1, typename A2, typename A3, typename A4,
742       typename A5, typename A6, typename A7, typename A8, typename A9>
743   static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
744       A5, A6, A7, A8, A9>& args) {
745     using ::std::tr1::get;
746     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
747         A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
748         get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
749         get<9>(args));
750   }
751 };
752
753 }  // namespace internal
754
755 // Various overloads for Invoke().
756
757 // WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
758 // the selected arguments of the mock function to an_action and
759 // performs it.  It serves as an adaptor between actions with
760 // different argument lists.  C++ doesn't support default arguments for
761 // function templates, so we have to overload it.
762 template <int k1, typename InnerAction>
763 inline internal::WithArgsAction<InnerAction, k1>
764 WithArgs(const InnerAction& action) {
765   return internal::WithArgsAction<InnerAction, k1>(action);
766 }
767
768 template <int k1, int k2, typename InnerAction>
769 inline internal::WithArgsAction<InnerAction, k1, k2>
770 WithArgs(const InnerAction& action) {
771   return internal::WithArgsAction<InnerAction, k1, k2>(action);
772 }
773
774 template <int k1, int k2, int k3, typename InnerAction>
775 inline internal::WithArgsAction<InnerAction, k1, k2, k3>
776 WithArgs(const InnerAction& action) {
777   return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
778 }
779
780 template <int k1, int k2, int k3, int k4, typename InnerAction>
781 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
782 WithArgs(const InnerAction& action) {
783   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
784 }
785
786 template <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
787 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
788 WithArgs(const InnerAction& action) {
789   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
790 }
791
792 template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
793 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
794 WithArgs(const InnerAction& action) {
795   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
796 }
797
798 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
799     typename InnerAction>
800 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
801 WithArgs(const InnerAction& action) {
802   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
803       k7>(action);
804 }
805
806 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
807     typename InnerAction>
808 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
809 WithArgs(const InnerAction& action) {
810   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
811       k8>(action);
812 }
813
814 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
815     int k9, typename InnerAction>
816 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
817 WithArgs(const InnerAction& action) {
818   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
819       k9>(action);
820 }
821
822 template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
823     int k9, int k10, typename InnerAction>
824 inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
825     k9, k10>
826 WithArgs(const InnerAction& action) {
827   return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
828       k9, k10>(action);
829 }
830
831 // Creates an action that does actions a1, a2, ..., sequentially in
832 // each invocation.
833 template <typename Action1, typename Action2>
834 inline internal::DoBothAction<Action1, Action2>
835 DoAll(Action1 a1, Action2 a2) {
836   return internal::DoBothAction<Action1, Action2>(a1, a2);
837 }
838
839 template <typename Action1, typename Action2, typename Action3>
840 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
841     Action3> >
842 DoAll(Action1 a1, Action2 a2, Action3 a3) {
843   return DoAll(a1, DoAll(a2, a3));
844 }
845
846 template <typename Action1, typename Action2, typename Action3,
847     typename Action4>
848 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
849     internal::DoBothAction<Action3, Action4> > >
850 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
851   return DoAll(a1, DoAll(a2, a3, a4));
852 }
853
854 template <typename Action1, typename Action2, typename Action3,
855     typename Action4, typename Action5>
856 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
857     internal::DoBothAction<Action3, internal::DoBothAction<Action4,
858     Action5> > > >
859 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
860   return DoAll(a1, DoAll(a2, a3, a4, a5));
861 }
862
863 template <typename Action1, typename Action2, typename Action3,
864     typename Action4, typename Action5, typename Action6>
865 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
866     internal::DoBothAction<Action3, internal::DoBothAction<Action4,
867     internal::DoBothAction<Action5, Action6> > > > >
868 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
869   return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
870 }
871
872 template <typename Action1, typename Action2, typename Action3,
873     typename Action4, typename Action5, typename Action6, typename Action7>
874 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
875     internal::DoBothAction<Action3, internal::DoBothAction<Action4,
876     internal::DoBothAction<Action5, internal::DoBothAction<Action6,
877     Action7> > > > > >
878 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
879     Action7 a7) {
880   return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));
881 }
882
883 template <typename Action1, typename Action2, typename Action3,
884     typename Action4, typename Action5, typename Action6, typename Action7,
885     typename Action8>
886 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
887     internal::DoBothAction<Action3, internal::DoBothAction<Action4,
888     internal::DoBothAction<Action5, internal::DoBothAction<Action6,
889     internal::DoBothAction<Action7, Action8> > > > > > >
890 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
891     Action7 a7, Action8 a8) {
892   return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));
893 }
894
895 template <typename Action1, typename Action2, typename Action3,
896     typename Action4, typename Action5, typename Action6, typename Action7,
897     typename Action8, typename Action9>
898 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
899     internal::DoBothAction<Action3, internal::DoBothAction<Action4,
900     internal::DoBothAction<Action5, internal::DoBothAction<Action6,
901     internal::DoBothAction<Action7, internal::DoBothAction<Action8,
902     Action9> > > > > > > >
903 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
904     Action7 a7, Action8 a8, Action9 a9) {
905   return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));
906 }
907
908 template <typename Action1, typename Action2, typename Action3,
909     typename Action4, typename Action5, typename Action6, typename Action7,
910     typename Action8, typename Action9, typename Action10>
911 inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
912     internal::DoBothAction<Action3, internal::DoBothAction<Action4,
913     internal::DoBothAction<Action5, internal::DoBothAction<Action6,
914     internal::DoBothAction<Action7, internal::DoBothAction<Action8,
915     internal::DoBothAction<Action9, Action10> > > > > > > > >
916 DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
917     Action7 a7, Action8 a8, Action9 a9, Action10 a10) {
918   return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));
919 }
920
921 }  // namespace testing
922
923 // The ACTION* family of macros can be used in a namespace scope to
924 // define custom actions easily.  The syntax:
925 //
926 //   ACTION(name) { statements; }
927 //
928 // will define an action with the given name that executes the
929 // statements.  The value returned by the statements will be used as
930 // the return value of the action.  Inside the statements, you can
931 // refer to the K-th (0-based) argument of the mock function by
932 // 'argK', and refer to its type by 'argK_type'.  For example:
933 //
934 //   ACTION(IncrementArg1) {
935 //     arg1_type temp = arg1;
936 //     return ++(*temp);
937 //   }
938 //
939 // allows you to write
940 //
941 //   ...WillOnce(IncrementArg1());
942 //
943 // You can also refer to the entire argument tuple and its type by
944 // 'args' and 'args_type', and refer to the mock function type and its
945 // return type by 'function_type' and 'return_type'.
946 //
947 // Note that you don't need to specify the types of the mock function
948 // arguments.  However rest assured that your code is still type-safe:
949 // you'll get a compiler error if *arg1 doesn't support the ++
950 // operator, or if the type of ++(*arg1) isn't compatible with the
951 // mock function's return type, for example.
952 //
953 // Sometimes you'll want to parameterize the action.   For that you can use
954 // another macro:
955 //
956 //   ACTION_P(name, param_name) { statements; }
957 //
958 // For example:
959 //
960 //   ACTION_P(Add, n) { return arg0 + n; }
961 //
962 // will allow you to write:
963 //
964 //   ...WillOnce(Add(5));
965 //
966 // Note that you don't need to provide the type of the parameter
967 // either.  If you need to reference the type of a parameter named
968 // 'foo', you can write 'foo_type'.  For example, in the body of
969 // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
970 // of 'n'.
971 //
972 // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
973 // multi-parameter actions.
974 //
975 // For the purpose of typing, you can view
976 //
977 //   ACTION_Pk(Foo, p1, ..., pk) { ... }
978 //
979 // as shorthand for
980 //
981 //   template <typename p1_type, ..., typename pk_type>
982 //   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
983 //
984 // In particular, you can provide the template type arguments
985 // explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
986 // although usually you can rely on the compiler to infer the types
987 // for you automatically.  You can assign the result of expression
988 // Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
989 // pk_type>.  This can be useful when composing actions.
990 //
991 // You can also overload actions with different numbers of parameters:
992 //
993 //   ACTION_P(Plus, a) { ... }
994 //   ACTION_P2(Plus, a, b) { ... }
995 //
996 // While it's tempting to always use the ACTION* macros when defining
997 // a new action, you should also consider implementing ActionInterface
998 // or using MakePolymorphicAction() instead, especially if you need to
999 // use the action a lot.  While these approaches require more work,
1000 // they give you more control on the types of the mock function
1001 // arguments and the action parameters, which in general leads to
1002 // better compiler error messages that pay off in the long run.  They
1003 // also allow overloading actions based on parameter types (as opposed
1004 // to just based on the number of parameters).
1005 //
1006 // CAVEAT:
1007 //
1008 // ACTION*() can only be used in a namespace scope.  The reason is
1009 // that C++ doesn't yet allow function-local types to be used to
1010 // instantiate templates.  The up-coming C++0x standard will fix this.
1011 // Once that's done, we'll consider supporting using ACTION*() inside
1012 // a function.
1013 //
1014 // MORE INFORMATION:
1015 //
1016 // To learn more about using these macros, please search for 'ACTION'
1017 // on http://code.google.com/p/googlemock/wiki/CookBook.
1018
1019 // An internal macro needed for implementing ACTION*().
1020 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
1021     const args_type& args GTEST_ATTRIBUTE_UNUSED_,\
1022     arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_,\
1023     arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_,\
1024     arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_,\
1025     arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_,\
1026     arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_,\
1027     arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_,\
1028     arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_,\
1029     arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_,\
1030     arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_,\
1031     arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
1032
1033 // Sometimes you want to give an action explicit template parameters
1034 // that cannot be inferred from its value parameters.  ACTION() and
1035 // ACTION_P*() don't support that.  ACTION_TEMPLATE() remedies that
1036 // and can be viewed as an extension to ACTION() and ACTION_P*().
1037 //
1038 // The syntax:
1039 //
1040 //   ACTION_TEMPLATE(ActionName,
1041 //                   HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
1042 //                   AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
1043 //
1044 // defines an action template that takes m explicit template
1045 // parameters and n value parameters.  name_i is the name of the i-th
1046 // template parameter, and kind_i specifies whether it's a typename,
1047 // an integral constant, or a template.  p_i is the name of the i-th
1048 // value parameter.
1049 //
1050 // Example:
1051 //
1052 //   // DuplicateArg<k, T>(output) converts the k-th argument of the mock
1053 //   // function to type T and copies it to *output.
1054 //   ACTION_TEMPLATE(DuplicateArg,
1055 //                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
1056 //                   AND_1_VALUE_PARAMS(output)) {
1057 //     *output = T(std::tr1::get<k>(args));
1058 //   }
1059 //   ...
1060 //     int n;
1061 //     EXPECT_CALL(mock, Foo(_, _))
1062 //         .WillOnce(DuplicateArg<1, unsigned char>(&n));
1063 //
1064 // To create an instance of an action template, write:
1065 //
1066 //   ActionName<t1, ..., t_m>(v1, ..., v_n)
1067 //
1068 // where the ts are the template arguments and the vs are the value
1069 // arguments.  The value argument types are inferred by the compiler.
1070 // If you want to explicitly specify the value argument types, you can
1071 // provide additional template arguments:
1072 //
1073 //   ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
1074 //
1075 // where u_i is the desired type of v_i.
1076 //
1077 // ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the
1078 // number of value parameters, but not on the number of template
1079 // parameters.  Without the restriction, the meaning of the following
1080 // is unclear:
1081 //
1082 //   OverloadedAction<int, bool>(x);
1083 //
1084 // Are we using a single-template-parameter action where 'bool' refers
1085 // to the type of x, or are we using a two-template-parameter action
1086 // where the compiler is asked to infer the type of x?
1087 //
1088 // Implementation notes:
1089 //
1090 // GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and
1091 // GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for
1092 // implementing ACTION_TEMPLATE.  The main trick we use is to create
1093 // new macro invocations when expanding a macro.  For example, we have
1094 //
1095 //   #define ACTION_TEMPLATE(name, template_params, value_params)
1096 //       ... GMOCK_INTERNAL_DECL_##template_params ...
1097 //
1098 // which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)
1099 // to expand to
1100 //
1101 //       ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...
1102 //
1103 // Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the
1104 // preprocessor will continue to expand it to
1105 //
1106 //       ... typename T ...
1107 //
1108 // This technique conforms to the C++ standard and is portable.  It
1109 // allows us to implement action templates using O(N) code, where N is
1110 // the maximum number of template/value parameters supported.  Without
1111 // using it, we'd have to devote O(N^2) amount of code to implement all
1112 // combinations of m and n.
1113
1114 // Declares the template parameters.
1115 #define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0
1116 #define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1117     name1) kind0 name0, kind1 name1
1118 #define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1119     kind2, name2) kind0 name0, kind1 name1, kind2 name2
1120 #define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1121     kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \
1122     kind3 name3
1123 #define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1124     kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \
1125     kind2 name2, kind3 name3, kind4 name4
1126 #define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1127     kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \
1128     kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5
1129 #define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1130     kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1131     name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \
1132     kind5 name5, kind6 name6
1133 #define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1134     kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1135     kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \
1136     kind4 name4, kind5 name5, kind6 name6, kind7 name7
1137 #define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1138     kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1139     kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \
1140     kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \
1141     kind8 name8
1142 #define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1143     name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1144     name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \
1145     kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \
1146     kind6 name6, kind7 name7, kind8 name8, kind9 name9
1147
1148 // Lists the template parameters.
1149 #define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0
1150 #define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1151     name1) name0, name1
1152 #define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1153     kind2, name2) name0, name1, name2
1154 #define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1155     kind2, name2, kind3, name3) name0, name1, name2, name3
1156 #define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1157     kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \
1158     name4
1159 #define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1160     kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \
1161     name2, name3, name4, name5
1162 #define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1163     kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1164     name6) name0, name1, name2, name3, name4, name5, name6
1165 #define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1166     kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1167     kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7
1168 #define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1169     kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1170     kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \
1171     name6, name7, name8
1172 #define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1173     name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1174     name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \
1175     name3, name4, name5, name6, name7, name8, name9
1176
1177 // Declares the types of value parameters.
1178 #define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()
1179 #define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type
1180 #define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \
1181     typename p0##_type, typename p1##_type
1182 #define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \
1183     typename p0##_type, typename p1##_type, typename p2##_type
1184 #define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1185     typename p0##_type, typename p1##_type, typename p2##_type, \
1186     typename p3##_type
1187 #define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1188     typename p0##_type, typename p1##_type, typename p2##_type, \
1189     typename p3##_type, typename p4##_type
1190 #define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1191     typename p0##_type, typename p1##_type, typename p2##_type, \
1192     typename p3##_type, typename p4##_type, typename p5##_type
1193 #define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1194     p6) , typename p0##_type, typename p1##_type, typename p2##_type, \
1195     typename p3##_type, typename p4##_type, typename p5##_type, \
1196     typename p6##_type
1197 #define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1198     p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \
1199     typename p3##_type, typename p4##_type, typename p5##_type, \
1200     typename p6##_type, typename p7##_type
1201 #define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1202     p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \
1203     typename p3##_type, typename p4##_type, typename p5##_type, \
1204     typename p6##_type, typename p7##_type, typename p8##_type
1205 #define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1206     p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \
1207     typename p2##_type, typename p3##_type, typename p4##_type, \
1208     typename p5##_type, typename p6##_type, typename p7##_type, \
1209     typename p8##_type, typename p9##_type
1210
1211 // Initializes the value parameters.
1212 #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\
1213     ()
1214 #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\
1215     (p0##_type gmock_p0) : p0(gmock_p0)
1216 #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\
1217     (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1)
1218 #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\
1219     (p0##_type gmock_p0, p1##_type gmock_p1, \
1220         p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2)
1221 #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\
1222     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1223         p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1224         p3(gmock_p3)
1225 #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\
1226     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1227         p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \
1228         p2(gmock_p2), p3(gmock_p3), p4(gmock_p4)
1229 #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\
1230     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1231         p3##_type gmock_p3, p4##_type gmock_p4, \
1232         p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1233         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5)
1234 #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\
1235     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1236         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1237         p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1238         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6)
1239 #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\
1240     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1241         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1242         p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \
1243         p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1244         p7(gmock_p7)
1245 #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1246     p7, p8)\
1247     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1248         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1249         p6##_type gmock_p6, p7##_type gmock_p7, \
1250         p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1251         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1252         p8(gmock_p8)
1253 #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1254     p7, p8, p9)\
1255     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1256         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1257         p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
1258         p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1259         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1260         p8(gmock_p8), p9(gmock_p9)
1261
1262 // Declares the fields for storing the value parameters.
1263 #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()
1264 #define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;
1265 #define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \
1266     p1##_type p1;
1267 #define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \
1268     p1##_type p1; p2##_type p2;
1269 #define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \
1270     p1##_type p1; p2##_type p2; p3##_type p3;
1271 #define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1272     p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;
1273 #define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1274     p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1275     p5##_type p5;
1276 #define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1277     p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1278     p5##_type p5; p6##_type p6;
1279 #define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1280     p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1281     p5##_type p5; p6##_type p6; p7##_type p7;
1282 #define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1283     p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1284     p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;
1285 #define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1286     p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1287     p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \
1288     p9##_type p9;
1289
1290 // Lists the value parameters.
1291 #define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()
1292 #define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0
1293 #define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1
1294 #define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2
1295 #define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3
1296 #define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \
1297     p2, p3, p4
1298 #define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \
1299     p1, p2, p3, p4, p5
1300 #define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1301     p6) p0, p1, p2, p3, p4, p5, p6
1302 #define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1303     p7) p0, p1, p2, p3, p4, p5, p6, p7
1304 #define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1305     p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8
1306 #define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1307     p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
1308
1309 // Lists the value parameter types.
1310 #define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()
1311 #define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type
1312 #define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \
1313     p1##_type
1314 #define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \
1315     p1##_type, p2##_type
1316 #define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1317     p0##_type, p1##_type, p2##_type, p3##_type
1318 #define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1319     p0##_type, p1##_type, p2##_type, p3##_type, p4##_type
1320 #define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1321     p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type
1322 #define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1323     p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \
1324     p6##_type
1325 #define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1326     p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1327     p5##_type, p6##_type, p7##_type
1328 #define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1329     p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1330     p5##_type, p6##_type, p7##_type, p8##_type
1331 #define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1332     p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1333     p5##_type, p6##_type, p7##_type, p8##_type, p9##_type
1334
1335 // Declares the value parameters.
1336 #define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()
1337 #define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0
1338 #define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \
1339     p1##_type p1
1340 #define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \
1341     p1##_type p1, p2##_type p2
1342 #define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \
1343     p1##_type p1, p2##_type p2, p3##_type p3
1344 #define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1345     p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4
1346 #define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1347     p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1348     p5##_type p5
1349 #define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1350     p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1351     p5##_type p5, p6##_type p6
1352 #define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1353     p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1354     p5##_type p5, p6##_type p6, p7##_type p7
1355 #define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1356     p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1357     p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8
1358 #define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1359     p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1360     p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
1361     p9##_type p9
1362
1363 // The suffix of the class template implementing the action template.
1364 #define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()
1365 #define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P
1366 #define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
1367 #define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3
1368 #define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4
1369 #define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5
1370 #define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6
1371 #define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7
1372 #define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1373     p7) P8
1374 #define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1375     p7, p8) P9
1376 #define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1377     p7, p8, p9) P10
1378
1379 // The name of the class template implementing the action template.
1380 #define GMOCK_ACTION_CLASS_(name, value_params)\
1381     GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
1382
1383 #define ACTION_TEMPLATE(name, template_params, value_params)\
1384   template <GMOCK_INTERNAL_DECL_##template_params\
1385             GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1386   class GMOCK_ACTION_CLASS_(name, value_params) {\
1387    public:\
1388     GMOCK_ACTION_CLASS_(name, value_params)\
1389         GMOCK_INTERNAL_INIT_##value_params {}\
1390     template <typename F>\
1391     class gmock_Impl : public ::testing::ActionInterface<F> {\
1392      public:\
1393       typedef F function_type;\
1394       typedef typename ::testing::internal::Function<F>::Result return_type;\
1395       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1396           args_type;\
1397       explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
1398       virtual return_type Perform(const args_type& args) {\
1399         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1400             Perform(this, args);\
1401       }\
1402       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1403           typename arg3_type, typename arg4_type, typename arg5_type, \
1404           typename arg6_type, typename arg7_type, typename arg8_type, \
1405           typename arg9_type>\
1406       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1407           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1408           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1409           arg9_type arg9) const;\
1410       GMOCK_INTERNAL_DEFN_##value_params\
1411      private:\
1412       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1413     };\
1414     template <typename F> operator ::testing::Action<F>() const {\
1415       return ::testing::Action<F>(\
1416           new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\
1417     }\
1418     GMOCK_INTERNAL_DEFN_##value_params\
1419    private:\
1420     GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\
1421   };\
1422   template <GMOCK_INTERNAL_DECL_##template_params\
1423             GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1424   inline GMOCK_ACTION_CLASS_(name, value_params)<\
1425       GMOCK_INTERNAL_LIST_##template_params\
1426       GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\
1427           GMOCK_INTERNAL_DECL_##value_params) {\
1428     return GMOCK_ACTION_CLASS_(name, value_params)<\
1429         GMOCK_INTERNAL_LIST_##template_params\
1430         GMOCK_INTERNAL_LIST_TYPE_##value_params>(\
1431             GMOCK_INTERNAL_LIST_##value_params);\
1432   }\
1433   template <GMOCK_INTERNAL_DECL_##template_params\
1434             GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1435   template <typename F>\
1436   template <typename arg0_type, typename arg1_type, typename arg2_type,\
1437       typename arg3_type, typename arg4_type, typename arg5_type,\
1438       typename arg6_type, typename arg7_type, typename arg8_type,\
1439       typename arg9_type>\
1440   typename ::testing::internal::Function<F>::Result\
1441       GMOCK_ACTION_CLASS_(name, value_params)<\
1442           GMOCK_INTERNAL_LIST_##template_params\
1443           GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\
1444               gmock_PerformImpl(\
1445           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1446
1447 #define ACTION(name)\
1448   class name##Action {\
1449    public:\
1450     name##Action() {}\
1451     template <typename F>\
1452     class gmock_Impl : public ::testing::ActionInterface<F> {\
1453      public:\
1454       typedef F function_type;\
1455       typedef typename ::testing::internal::Function<F>::Result return_type;\
1456       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1457           args_type;\
1458       gmock_Impl() {}\
1459       virtual return_type Perform(const args_type& args) {\
1460         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1461             Perform(this, args);\
1462       }\
1463       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1464           typename arg3_type, typename arg4_type, typename arg5_type, \
1465           typename arg6_type, typename arg7_type, typename arg8_type, \
1466           typename arg9_type>\
1467       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1468           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1469           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1470           arg9_type arg9) const;\
1471      private:\
1472       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1473     };\
1474     template <typename F> operator ::testing::Action<F>() const {\
1475       return ::testing::Action<F>(new gmock_Impl<F>());\
1476     }\
1477    private:\
1478     GTEST_DISALLOW_ASSIGN_(name##Action);\
1479   };\
1480   inline name##Action name() {\
1481     return name##Action();\
1482   }\
1483   template <typename F>\
1484   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1485       typename arg3_type, typename arg4_type, typename arg5_type, \
1486       typename arg6_type, typename arg7_type, typename arg8_type, \
1487       typename arg9_type>\
1488   typename ::testing::internal::Function<F>::Result\
1489       name##Action::gmock_Impl<F>::gmock_PerformImpl(\
1490           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1491
1492 #define ACTION_P(name, p0)\
1493   template <typename p0##_type>\
1494   class name##ActionP {\
1495    public:\
1496     name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\
1497     template <typename F>\
1498     class gmock_Impl : public ::testing::ActionInterface<F> {\
1499      public:\
1500       typedef F function_type;\
1501       typedef typename ::testing::internal::Function<F>::Result return_type;\
1502       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1503           args_type;\
1504       explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\
1505       virtual return_type Perform(const args_type& args) {\
1506         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1507             Perform(this, args);\
1508       }\
1509       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1510           typename arg3_type, typename arg4_type, typename arg5_type, \
1511           typename arg6_type, typename arg7_type, typename arg8_type, \
1512           typename arg9_type>\
1513       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1514           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1515           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1516           arg9_type arg9) const;\
1517       p0##_type p0;\
1518      private:\
1519       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1520     };\
1521     template <typename F> operator ::testing::Action<F>() const {\
1522       return ::testing::Action<F>(new gmock_Impl<F>(p0));\
1523     }\
1524     p0##_type p0;\
1525    private:\
1526     GTEST_DISALLOW_ASSIGN_(name##ActionP);\
1527   };\
1528   template <typename p0##_type>\
1529   inline name##ActionP<p0##_type> name(p0##_type p0) {\
1530     return name##ActionP<p0##_type>(p0);\
1531   }\
1532   template <typename p0##_type>\
1533   template <typename F>\
1534   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1535       typename arg3_type, typename arg4_type, typename arg5_type, \
1536       typename arg6_type, typename arg7_type, typename arg8_type, \
1537       typename arg9_type>\
1538   typename ::testing::internal::Function<F>::Result\
1539       name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1540           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1541
1542 #define ACTION_P2(name, p0, p1)\
1543   template <typename p0##_type, typename p1##_type>\
1544   class name##ActionP2 {\
1545    public:\
1546     name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1547         p1(gmock_p1) {}\
1548     template <typename F>\
1549     class gmock_Impl : public ::testing::ActionInterface<F> {\
1550      public:\
1551       typedef F function_type;\
1552       typedef typename ::testing::internal::Function<F>::Result return_type;\
1553       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1554           args_type;\
1555       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1556           p1(gmock_p1) {}\
1557       virtual return_type Perform(const args_type& args) {\
1558         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1559             Perform(this, args);\
1560       }\
1561       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1562           typename arg3_type, typename arg4_type, typename arg5_type, \
1563           typename arg6_type, typename arg7_type, typename arg8_type, \
1564           typename arg9_type>\
1565       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1566           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1567           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1568           arg9_type arg9) const;\
1569       p0##_type p0;\
1570       p1##_type p1;\
1571      private:\
1572       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1573     };\
1574     template <typename F> operator ::testing::Action<F>() const {\
1575       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\
1576     }\
1577     p0##_type p0;\
1578     p1##_type p1;\
1579    private:\
1580     GTEST_DISALLOW_ASSIGN_(name##ActionP2);\
1581   };\
1582   template <typename p0##_type, typename p1##_type>\
1583   inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \
1584       p1##_type p1) {\
1585     return name##ActionP2<p0##_type, p1##_type>(p0, p1);\
1586   }\
1587   template <typename p0##_type, typename p1##_type>\
1588   template <typename F>\
1589   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1590       typename arg3_type, typename arg4_type, typename arg5_type, \
1591       typename arg6_type, typename arg7_type, typename arg8_type, \
1592       typename arg9_type>\
1593   typename ::testing::internal::Function<F>::Result\
1594       name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1595           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1596
1597 #define ACTION_P3(name, p0, p1, p2)\
1598   template <typename p0##_type, typename p1##_type, typename p2##_type>\
1599   class name##ActionP3 {\
1600    public:\
1601     name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1602         p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1603     template <typename F>\
1604     class gmock_Impl : public ::testing::ActionInterface<F> {\
1605      public:\
1606       typedef F function_type;\
1607       typedef typename ::testing::internal::Function<F>::Result return_type;\
1608       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1609           args_type;\
1610       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \
1611           p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1612       virtual return_type Perform(const args_type& args) {\
1613         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1614             Perform(this, args);\
1615       }\
1616       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1617           typename arg3_type, typename arg4_type, typename arg5_type, \
1618           typename arg6_type, typename arg7_type, typename arg8_type, \
1619           typename arg9_type>\
1620       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1621           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1622           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1623           arg9_type arg9) const;\
1624       p0##_type p0;\
1625       p1##_type p1;\
1626       p2##_type p2;\
1627      private:\
1628       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1629     };\
1630     template <typename F> operator ::testing::Action<F>() const {\
1631       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\
1632     }\
1633     p0##_type p0;\
1634     p1##_type p1;\
1635     p2##_type p2;\
1636    private:\
1637     GTEST_DISALLOW_ASSIGN_(name##ActionP3);\
1638   };\
1639   template <typename p0##_type, typename p1##_type, typename p2##_type>\
1640   inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1641       p1##_type p1, p2##_type p2) {\
1642     return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1643   }\
1644   template <typename p0##_type, typename p1##_type, typename p2##_type>\
1645   template <typename F>\
1646   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1647       typename arg3_type, typename arg4_type, typename arg5_type, \
1648       typename arg6_type, typename arg7_type, typename arg8_type, \
1649       typename arg9_type>\
1650   typename ::testing::internal::Function<F>::Result\
1651       name##ActionP3<p0##_type, p1##_type, \
1652           p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1653           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1654
1655 #define ACTION_P4(name, p0, p1, p2, p3)\
1656   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1657       typename p3##_type>\
1658   class name##ActionP4 {\
1659    public:\
1660     name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1661         p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1662         p2(gmock_p2), p3(gmock_p3) {}\
1663     template <typename F>\
1664     class gmock_Impl : public ::testing::ActionInterface<F> {\
1665      public:\
1666       typedef F function_type;\
1667       typedef typename ::testing::internal::Function<F>::Result return_type;\
1668       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1669           args_type;\
1670       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1671           p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1672           p3(gmock_p3) {}\
1673       virtual return_type Perform(const args_type& args) {\
1674         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1675             Perform(this, args);\
1676       }\
1677       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1678           typename arg3_type, typename arg4_type, typename arg5_type, \
1679           typename arg6_type, typename arg7_type, typename arg8_type, \
1680           typename arg9_type>\
1681       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1682           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1683           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1684           arg9_type arg9) const;\
1685       p0##_type p0;\
1686       p1##_type p1;\
1687       p2##_type p2;\
1688       p3##_type p3;\
1689      private:\
1690       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1691     };\
1692     template <typename F> operator ::testing::Action<F>() const {\
1693       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\
1694     }\
1695     p0##_type p0;\
1696     p1##_type p1;\
1697     p2##_type p2;\
1698     p3##_type p3;\
1699    private:\
1700     GTEST_DISALLOW_ASSIGN_(name##ActionP4);\
1701   };\
1702   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1703       typename p3##_type>\
1704   inline name##ActionP4<p0##_type, p1##_type, p2##_type, \
1705       p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1706       p3##_type p3) {\
1707     return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \
1708         p2, p3);\
1709   }\
1710   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1711       typename p3##_type>\
1712   template <typename F>\
1713   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1714       typename arg3_type, typename arg4_type, typename arg5_type, \
1715       typename arg6_type, typename arg7_type, typename arg8_type, \
1716       typename arg9_type>\
1717   typename ::testing::internal::Function<F>::Result\
1718       name##ActionP4<p0##_type, p1##_type, p2##_type, \
1719           p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1720           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1721
1722 #define ACTION_P5(name, p0, p1, p2, p3, p4)\
1723   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1724       typename p3##_type, typename p4##_type>\
1725   class name##ActionP5 {\
1726    public:\
1727     name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1728         p2##_type gmock_p2, p3##_type gmock_p3, \
1729         p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1730         p3(gmock_p3), p4(gmock_p4) {}\
1731     template <typename F>\
1732     class gmock_Impl : public ::testing::ActionInterface<F> {\
1733      public:\
1734       typedef F function_type;\
1735       typedef typename ::testing::internal::Function<F>::Result return_type;\
1736       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1737           args_type;\
1738       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1739           p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \
1740           p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\
1741       virtual return_type Perform(const args_type& args) {\
1742         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1743             Perform(this, args);\
1744       }\
1745       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1746           typename arg3_type, typename arg4_type, typename arg5_type, \
1747           typename arg6_type, typename arg7_type, typename arg8_type, \
1748           typename arg9_type>\
1749       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1750           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1751           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1752           arg9_type arg9) const;\
1753       p0##_type p0;\
1754       p1##_type p1;\
1755       p2##_type p2;\
1756       p3##_type p3;\
1757       p4##_type p4;\
1758      private:\
1759       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1760     };\
1761     template <typename F> operator ::testing::Action<F>() const {\
1762       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\
1763     }\
1764     p0##_type p0;\
1765     p1##_type p1;\
1766     p2##_type p2;\
1767     p3##_type p3;\
1768     p4##_type p4;\
1769    private:\
1770     GTEST_DISALLOW_ASSIGN_(name##ActionP5);\
1771   };\
1772   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1773       typename p3##_type, typename p4##_type>\
1774   inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1775       p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1776       p4##_type p4) {\
1777     return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1778         p4##_type>(p0, p1, p2, p3, p4);\
1779   }\
1780   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1781       typename p3##_type, typename p4##_type>\
1782   template <typename F>\
1783   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1784       typename arg3_type, typename arg4_type, typename arg5_type, \
1785       typename arg6_type, typename arg7_type, typename arg8_type, \
1786       typename arg9_type>\
1787   typename ::testing::internal::Function<F>::Result\
1788       name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1789           p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1790           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1791
1792 #define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\
1793   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1794       typename p3##_type, typename p4##_type, typename p5##_type>\
1795   class name##ActionP6 {\
1796    public:\
1797     name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1798         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1799         p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1800         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1801     template <typename F>\
1802     class gmock_Impl : public ::testing::ActionInterface<F> {\
1803      public:\
1804       typedef F function_type;\
1805       typedef typename ::testing::internal::Function<F>::Result return_type;\
1806       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1807           args_type;\
1808       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1809           p3##_type gmock_p3, p4##_type gmock_p4, \
1810           p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1811           p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1812       virtual return_type Perform(const args_type& args) {\
1813         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1814             Perform(this, args);\
1815       }\
1816       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1817           typename arg3_type, typename arg4_type, typename arg5_type, \
1818           typename arg6_type, typename arg7_type, typename arg8_type, \
1819           typename arg9_type>\
1820       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1821           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1822           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1823           arg9_type arg9) const;\
1824       p0##_type p0;\
1825       p1##_type p1;\
1826       p2##_type p2;\
1827       p3##_type p3;\
1828       p4##_type p4;\
1829       p5##_type p5;\
1830      private:\
1831       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1832     };\
1833     template <typename F> operator ::testing::Action<F>() const {\
1834       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\
1835     }\
1836     p0##_type p0;\
1837     p1##_type p1;\
1838     p2##_type p2;\
1839     p3##_type p3;\
1840     p4##_type p4;\
1841     p5##_type p5;\
1842    private:\
1843     GTEST_DISALLOW_ASSIGN_(name##ActionP6);\
1844   };\
1845   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1846       typename p3##_type, typename p4##_type, typename p5##_type>\
1847   inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1848       p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1849       p3##_type p3, p4##_type p4, p5##_type p5) {\
1850     return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1851         p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1852   }\
1853   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1854       typename p3##_type, typename p4##_type, typename p5##_type>\
1855   template <typename F>\
1856   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1857       typename arg3_type, typename arg4_type, typename arg5_type, \
1858       typename arg6_type, typename arg7_type, typename arg8_type, \
1859       typename arg9_type>\
1860   typename ::testing::internal::Function<F>::Result\
1861       name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1862           p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1863           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1864
1865 #define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\
1866   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1867       typename p3##_type, typename p4##_type, typename p5##_type, \
1868       typename p6##_type>\
1869   class name##ActionP7 {\
1870    public:\
1871     name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1872         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1873         p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1874         p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1875         p6(gmock_p6) {}\
1876     template <typename F>\
1877     class gmock_Impl : public ::testing::ActionInterface<F> {\
1878      public:\
1879       typedef F function_type;\
1880       typedef typename ::testing::internal::Function<F>::Result return_type;\
1881       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1882           args_type;\
1883       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1884           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1885           p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1886           p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
1887       virtual return_type Perform(const args_type& args) {\
1888         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1889             Perform(this, args);\
1890       }\
1891       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1892           typename arg3_type, typename arg4_type, typename arg5_type, \
1893           typename arg6_type, typename arg7_type, typename arg8_type, \
1894           typename arg9_type>\
1895       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1896           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1897           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1898           arg9_type arg9) const;\
1899       p0##_type p0;\
1900       p1##_type p1;\
1901       p2##_type p2;\
1902       p3##_type p3;\
1903       p4##_type p4;\
1904       p5##_type p5;\
1905       p6##_type p6;\
1906      private:\
1907       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1908     };\
1909     template <typename F> operator ::testing::Action<F>() const {\
1910       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1911           p6));\
1912     }\
1913     p0##_type p0;\
1914     p1##_type p1;\
1915     p2##_type p2;\
1916     p3##_type p3;\
1917     p4##_type p4;\
1918     p5##_type p5;\
1919     p6##_type p6;\
1920    private:\
1921     GTEST_DISALLOW_ASSIGN_(name##ActionP7);\
1922   };\
1923   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1924       typename p3##_type, typename p4##_type, typename p5##_type, \
1925       typename p6##_type>\
1926   inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1927       p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1928       p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1929       p6##_type p6) {\
1930     return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1931         p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1932   }\
1933   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1934       typename p3##_type, typename p4##_type, typename p5##_type, \
1935       typename p6##_type>\
1936   template <typename F>\
1937   template <typename arg0_type, typename arg1_type, typename arg2_type, \
1938       typename arg3_type, typename arg4_type, typename arg5_type, \
1939       typename arg6_type, typename arg7_type, typename arg8_type, \
1940       typename arg9_type>\
1941   typename ::testing::internal::Function<F>::Result\
1942       name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1943           p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1944           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1945
1946 #define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\
1947   template <typename p0##_type, typename p1##_type, typename p2##_type, \
1948       typename p3##_type, typename p4##_type, typename p5##_type, \
1949       typename p6##_type, typename p7##_type>\
1950   class name##ActionP8 {\
1951    public:\
1952     name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1953         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1954         p5##_type gmock_p5, p6##_type gmock_p6, \
1955         p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1956         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1957         p7(gmock_p7) {}\
1958     template <typename F>\
1959     class gmock_Impl : public ::testing::ActionInterface<F> {\
1960      public:\
1961       typedef F function_type;\
1962       typedef typename ::testing::internal::Function<F>::Result return_type;\
1963       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1964           args_type;\
1965       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1966           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1967           p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \
1968           p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \
1969           p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
1970       virtual return_type Perform(const args_type& args) {\
1971         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1972             Perform(this, args);\
1973       }\
1974       template <typename arg0_type, typename arg1_type, typename arg2_type, \
1975           typename arg3_type, typename arg4_type, typename arg5_type, \
1976           typename arg6_type, typename arg7_type, typename arg8_type, \
1977           typename arg9_type>\
1978       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1979           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1980           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1981           arg9_type arg9) const;\
1982       p0##_type p0;\
1983       p1##_type p1;\
1984       p2##_type p2;\
1985       p3##_type p3;\
1986       p4##_type p4;\
1987       p5##_type p5;\
1988       p6##_type p6;\
1989       p7##_type p7;\
1990      private:\
1991       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1992     };\
1993     template <typename F> operator ::testing::Action<F>() const {\
1994       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1995           p6, p7));\
1996     }\
1997     p0##_type p0;\
1998     p1##_type p1;\
1999     p2##_type p2;\
2000     p3##_type p3;\
2001     p4##_type p4;\
2002     p5##_type p5;\
2003     p6##_type p6;\
2004     p7##_type p7;\
2005    private:\
2006     GTEST_DISALLOW_ASSIGN_(name##ActionP8);\
2007   };\
2008   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2009       typename p3##_type, typename p4##_type, typename p5##_type, \
2010       typename p6##_type, typename p7##_type>\
2011   inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2012       p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
2013       p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
2014       p6##_type p6, p7##_type p7) {\
2015     return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2016         p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
2017         p6, p7);\
2018   }\
2019   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2020       typename p3##_type, typename p4##_type, typename p5##_type, \
2021       typename p6##_type, typename p7##_type>\
2022   template <typename F>\
2023   template <typename arg0_type, typename arg1_type, typename arg2_type, \
2024       typename arg3_type, typename arg4_type, typename arg5_type, \
2025       typename arg6_type, typename arg7_type, typename arg8_type, \
2026       typename arg9_type>\
2027   typename ::testing::internal::Function<F>::Result\
2028       name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2029           p5##_type, p6##_type, \
2030           p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2031           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2032
2033 #define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
2034   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2035       typename p3##_type, typename p4##_type, typename p5##_type, \
2036       typename p6##_type, typename p7##_type, typename p8##_type>\
2037   class name##ActionP9 {\
2038    public:\
2039     name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \
2040         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2041         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2042         p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2043         p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2044         p8(gmock_p8) {}\
2045     template <typename F>\
2046     class gmock_Impl : public ::testing::ActionInterface<F> {\
2047      public:\
2048       typedef F function_type;\
2049       typedef typename ::testing::internal::Function<F>::Result return_type;\
2050       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2051           args_type;\
2052       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2053           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2054           p6##_type gmock_p6, p7##_type gmock_p7, \
2055           p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2056           p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2057           p7(gmock_p7), p8(gmock_p8) {}\
2058       virtual return_type Perform(const args_type& args) {\
2059         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2060             Perform(this, args);\
2061       }\
2062       template <typename arg0_type, typename arg1_type, typename arg2_type, \
2063           typename arg3_type, typename arg4_type, typename arg5_type, \
2064           typename arg6_type, typename arg7_type, typename arg8_type, \
2065           typename arg9_type>\
2066       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2067           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2068           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2069           arg9_type arg9) const;\
2070       p0##_type p0;\
2071       p1##_type p1;\
2072       p2##_type p2;\
2073       p3##_type p3;\
2074       p4##_type p4;\
2075       p5##_type p5;\
2076       p6##_type p6;\
2077       p7##_type p7;\
2078       p8##_type p8;\
2079      private:\
2080       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2081     };\
2082     template <typename F> operator ::testing::Action<F>() const {\
2083       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2084           p6, p7, p8));\
2085     }\
2086     p0##_type p0;\
2087     p1##_type p1;\
2088     p2##_type p2;\
2089     p3##_type p3;\
2090     p4##_type p4;\
2091     p5##_type p5;\
2092     p6##_type p6;\
2093     p7##_type p7;\
2094     p8##_type p8;\
2095    private:\
2096     GTEST_DISALLOW_ASSIGN_(name##ActionP9);\
2097   };\
2098   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2099       typename p3##_type, typename p4##_type, typename p5##_type, \
2100       typename p6##_type, typename p7##_type, typename p8##_type>\
2101   inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2102       p4##_type, p5##_type, p6##_type, p7##_type, \
2103       p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2104       p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
2105       p8##_type p8) {\
2106     return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2107         p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
2108         p3, p4, p5, p6, p7, p8);\
2109   }\
2110   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2111       typename p3##_type, typename p4##_type, typename p5##_type, \
2112       typename p6##_type, typename p7##_type, typename p8##_type>\
2113   template <typename F>\
2114   template <typename arg0_type, typename arg1_type, typename arg2_type, \
2115       typename arg3_type, typename arg4_type, typename arg5_type, \
2116       typename arg6_type, typename arg7_type, typename arg8_type, \
2117       typename arg9_type>\
2118   typename ::testing::internal::Function<F>::Result\
2119       name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2120           p5##_type, p6##_type, p7##_type, \
2121           p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2122           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2123
2124 #define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\
2125   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2126       typename p3##_type, typename p4##_type, typename p5##_type, \
2127       typename p6##_type, typename p7##_type, typename p8##_type, \
2128       typename p9##_type>\
2129   class name##ActionP10 {\
2130    public:\
2131     name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \
2132         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2133         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2134         p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
2135         p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2136         p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2137     template <typename F>\
2138     class gmock_Impl : public ::testing::ActionInterface<F> {\
2139      public:\
2140       typedef F function_type;\
2141       typedef typename ::testing::internal::Function<F>::Result return_type;\
2142       typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2143           args_type;\
2144       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2145           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2146           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
2147           p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2148           p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2149           p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2150       virtual return_type Perform(const args_type& args) {\
2151         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2152             Perform(this, args);\
2153       }\
2154       template <typename arg0_type, typename arg1_type, typename arg2_type, \
2155           typename arg3_type, typename arg4_type, typename arg5_type, \
2156           typename arg6_type, typename arg7_type, typename arg8_type, \
2157           typename arg9_type>\
2158       return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2159           arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2160           arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2161           arg9_type arg9) const;\
2162       p0##_type p0;\
2163       p1##_type p1;\
2164       p2##_type p2;\
2165       p3##_type p3;\
2166       p4##_type p4;\
2167       p5##_type p5;\
2168       p6##_type p6;\
2169       p7##_type p7;\
2170       p8##_type p8;\
2171       p9##_type p9;\
2172      private:\
2173       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2174     };\
2175     template <typename F> operator ::testing::Action<F>() const {\
2176       return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2177           p6, p7, p8, p9));\
2178     }\
2179     p0##_type p0;\
2180     p1##_type p1;\
2181     p2##_type p2;\
2182     p3##_type p3;\
2183     p4##_type p4;\
2184     p5##_type p5;\
2185     p6##_type p6;\
2186     p7##_type p7;\
2187     p8##_type p8;\
2188     p9##_type p9;\
2189    private:\
2190     GTEST_DISALLOW_ASSIGN_(name##ActionP10);\
2191   };\
2192   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2193       typename p3##_type, typename p4##_type, typename p5##_type, \
2194       typename p6##_type, typename p7##_type, typename p8##_type, \
2195       typename p9##_type>\
2196   inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2197       p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2198       p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2199       p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2200       p9##_type p9) {\
2201     return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2202         p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2203         p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2204   }\
2205   template <typename p0##_type, typename p1##_type, typename p2##_type, \
2206       typename p3##_type, typename p4##_type, typename p5##_type, \
2207       typename p6##_type, typename p7##_type, typename p8##_type, \
2208       typename p9##_type>\
2209   template <typename F>\
2210   template <typename arg0_type, typename arg1_type, typename arg2_type, \
2211       typename arg3_type, typename arg4_type, typename arg5_type, \
2212       typename arg6_type, typename arg7_type, typename arg8_type, \
2213       typename arg9_type>\
2214   typename ::testing::internal::Function<F>::Result\
2215       name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2216           p5##_type, p6##_type, p7##_type, p8##_type, \
2217           p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2218           GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2219
2220 // TODO(wan@google.com): move the following to a different .h file
2221 // such that we don't have to run 'pump' every time the code is
2222 // updated.
2223 namespace testing {
2224
2225 // The ACTION*() macros trigger warning C4100 (unreferenced formal
2226 // parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
2227 // the macro definition, as the warnings are generated when the macro
2228 // is expanded and macro expansion cannot contain #pragma.  Therefore
2229 // we suppress them here.
2230 #ifdef _MSC_VER
2231 # pragma warning(push)
2232 # pragma warning(disable:4100)
2233 #endif
2234
2235 // Various overloads for InvokeArgument<N>().
2236 //
2237 // The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
2238 // (0-based) argument, which must be a k-ary callable, of the mock
2239 // function, with arguments a1, a2, ..., a_k.
2240 //
2241 // Notes:
2242 //
2243 //   1. The arguments are passed by value by default.  If you need to
2244 //   pass an argument by reference, wrap it inside ByRef().  For
2245 //   example,
2246 //
2247 //     InvokeArgument<1>(5, string("Hello"), ByRef(foo))
2248 //
2249 //   passes 5 and string("Hello") by value, and passes foo by
2250 //   reference.
2251 //
2252 //   2. If the callable takes an argument by reference but ByRef() is
2253 //   not used, it will receive the reference to a copy of the value,
2254 //   instead of the original value.  For example, when the 0-th
2255 //   argument of the mock function takes a const string&, the action
2256 //
2257 //     InvokeArgument<0>(string("Hello"))
2258 //
2259 //   makes a copy of the temporary string("Hello") object and passes a
2260 //   reference of the copy, instead of the original temporary object,
2261 //   to the callable.  This makes it easy for a user to define an
2262 //   InvokeArgument action from temporary values and have it performed
2263 //   later.
2264
2265 ACTION_TEMPLATE(InvokeArgument,
2266                 HAS_1_TEMPLATE_PARAMS(int, k),
2267                 AND_0_VALUE_PARAMS()) {
2268   return internal::CallableHelper<return_type>::Call(
2269       ::std::tr1::get<k>(args));
2270 }
2271
2272 ACTION_TEMPLATE(InvokeArgument,
2273                 HAS_1_TEMPLATE_PARAMS(int, k),
2274                 AND_1_VALUE_PARAMS(p0)) {
2275   return internal::CallableHelper<return_type>::Call(
2276       ::std::tr1::get<k>(args), p0);
2277 }
2278
2279 ACTION_TEMPLATE(InvokeArgument,
2280                 HAS_1_TEMPLATE_PARAMS(int, k),
2281                 AND_2_VALUE_PARAMS(p0, p1)) {
2282   return internal::CallableHelper<return_type>::Call(
2283       ::std::tr1::get<k>(args), p0, p1);
2284 }
2285
2286 ACTION_TEMPLATE(InvokeArgument,
2287                 HAS_1_TEMPLATE_PARAMS(int, k),
2288                 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2289   return internal::CallableHelper<return_type>::Call(
2290       ::std::tr1::get<k>(args), p0, p1, p2);
2291 }
2292
2293 ACTION_TEMPLATE(InvokeArgument,
2294                 HAS_1_TEMPLATE_PARAMS(int, k),
2295                 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2296   return internal::CallableHelper<return_type>::Call(
2297       ::std::tr1::get<k>(args), p0, p1, p2, p3);
2298 }
2299
2300 ACTION_TEMPLATE(InvokeArgument,
2301                 HAS_1_TEMPLATE_PARAMS(int, k),
2302                 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2303   return internal::CallableHelper<return_type>::Call(
2304       ::std::tr1::get<k>(args), p0, p1, p2, p3, p4);
2305 }
2306
2307 ACTION_TEMPLATE(InvokeArgument,
2308                 HAS_1_TEMPLATE_PARAMS(int, k),
2309                 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2310   return internal::CallableHelper<return_type>::Call(
2311       ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5);
2312 }
2313
2314 ACTION_TEMPLATE(InvokeArgument,
2315                 HAS_1_TEMPLATE_PARAMS(int, k),
2316                 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2317   return internal::CallableHelper<return_type>::Call(
2318       ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6);
2319 }
2320
2321 ACTION_TEMPLATE(InvokeArgument,
2322                 HAS_1_TEMPLATE_PARAMS(int, k),
2323                 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2324   return internal::CallableHelper<return_type>::Call(
2325       ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);
2326 }
2327
2328 ACTION_TEMPLATE(InvokeArgument,
2329                 HAS_1_TEMPLATE_PARAMS(int, k),
2330                 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2331   return internal::CallableHelper<return_type>::Call(
2332       ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);
2333 }
2334
2335 ACTION_TEMPLATE(InvokeArgument,
2336                 HAS_1_TEMPLATE_PARAMS(int, k),
2337                 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2338   return internal::CallableHelper<return_type>::Call(
2339       ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2340 }
2341
2342 // Various overloads for ReturnNew<T>().
2343 //
2344 // The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
2345 // instance of type T, constructed on the heap with constructor arguments
2346 // a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
2347 ACTION_TEMPLATE(ReturnNew,
2348                 HAS_1_TEMPLATE_PARAMS(typename, T),
2349                 AND_0_VALUE_PARAMS()) {
2350   return new T();
2351 }
2352
2353 ACTION_TEMPLATE(ReturnNew,
2354                 HAS_1_TEMPLATE_PARAMS(typename, T),
2355                 AND_1_VALUE_PARAMS(p0)) {
2356   return new T(p0);
2357 }
2358
2359 ACTION_TEMPLATE(ReturnNew,
2360                 HAS_1_TEMPLATE_PARAMS(typename, T),
2361                 AND_2_VALUE_PARAMS(p0, p1)) {
2362   return new T(p0, p1);
2363 }
2364
2365 ACTION_TEMPLATE(ReturnNew,
2366                 HAS_1_TEMPLATE_PARAMS(typename, T),
2367                 AND_3_VALUE_PARAMS(p0, p1, p2)) {
2368   return new T(p0, p1, p2);
2369 }
2370
2371 ACTION_TEMPLATE(ReturnNew,
2372                 HAS_1_TEMPLATE_PARAMS(typename, T),
2373                 AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2374   return new T(p0, p1, p2, p3);
2375 }
2376
2377 ACTION_TEMPLATE(ReturnNew,
2378                 HAS_1_TEMPLATE_PARAMS(typename, T),
2379                 AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2380   return new T(p0, p1, p2, p3, p4);
2381 }
2382
2383 ACTION_TEMPLATE(ReturnNew,
2384                 HAS_1_TEMPLATE_PARAMS(typename, T),
2385                 AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2386   return new T(p0, p1, p2, p3, p4, p5);
2387 }
2388
2389 ACTION_TEMPLATE(ReturnNew,
2390                 HAS_1_TEMPLATE_PARAMS(typename, T),
2391                 AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2392   return new T(p0, p1, p2, p3, p4, p5, p6);
2393 }
2394
2395 ACTION_TEMPLATE(ReturnNew,
2396                 HAS_1_TEMPLATE_PARAMS(typename, T),
2397                 AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2398   return new T(p0, p1, p2, p3, p4, p5, p6, p7);
2399 }
2400
2401 ACTION_TEMPLATE(ReturnNew,
2402                 HAS_1_TEMPLATE_PARAMS(typename, T),
2403                 AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2404   return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
2405 }
2406
2407 ACTION_TEMPLATE(ReturnNew,
2408                 HAS_1_TEMPLATE_PARAMS(typename, T),
2409                 AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2410   return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2411 }
2412
2413 #ifdef _MSC_VER
2414 # pragma warning(pop)
2415 #endif
2416
2417 }  // namespace testing
2418
2419 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_