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