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