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