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