?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

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