github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/include/gmock/gmock-generated-actions.h (about)

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