diff options
Diffstat (limited to 'googlemock/include/gmock')
5 files changed, 310 insertions, 77 deletions
| diff --git a/googlemock/include/gmock/gmock-generated-actions.h b/googlemock/include/gmock/gmock-generated-actions.h index be4ebe4f..7728d745 100644 --- a/googlemock/include/gmock/gmock-generated-actions.h +++ b/googlemock/include/gmock/gmock-generated-actions.h @@ -1,4 +1,6 @@ -// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!! +// This file was GENERATED by command: +//     pump.py gmock-generated-actions.h.pump +// DO NOT EDIT BY HAND!!!  // Copyright 2007, Google Inc.  // All rights reserved. @@ -45,8 +47,8 @@ namespace testing {  namespace internal {  // InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary -// function or method with the unpacked values, where F is a function -// type that takes N arguments. +// function, method, or callback with the unpacked values, where F is +// a function type that takes N arguments.  template <typename Result, typename ArgumentTuple>  class InvokeHelper; @@ -64,6 +66,12 @@ class InvokeHelper<R, ::testing::tuple<> > {                          const ::testing::tuple<>&) {             return (obj_ptr->*method_ptr)();    } + +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<>&) { +           return callback->Run(); +  }  };  template <typename R, typename A1> @@ -80,6 +88,12 @@ class InvokeHelper<R, ::testing::tuple<A1> > {                          const ::testing::tuple<A1>& args) {             return (obj_ptr->*method_ptr)(get<0>(args));    } + +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<A1>& args) { +           return callback->Run(get<0>(args)); +  }  };  template <typename R, typename A1, typename A2> @@ -96,6 +110,12 @@ class InvokeHelper<R, ::testing::tuple<A1, A2> > {                          const ::testing::tuple<A1, A2>& args) {             return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));    } + +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<A1, A2>& args) { +           return callback->Run(get<0>(args), get<1>(args)); +  }  };  template <typename R, typename A1, typename A2, typename A3> @@ -113,6 +133,12 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3> > {             return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),                 get<2>(args));    } + +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<A1, A2, A3>& args) { +           return callback->Run(get<0>(args), get<1>(args), get<2>(args)); +  }  };  template <typename R, typename A1, typename A2, typename A3, typename A4> @@ -132,6 +158,13 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > {             return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),                 get<2>(args), get<3>(args));    } + +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<A1, A2, A3, A4>& args) { +           return callback->Run(get<0>(args), get<1>(args), get<2>(args), +               get<3>(args)); +  }  };  template <typename R, typename A1, typename A2, typename A3, typename A4, @@ -152,6 +185,13 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > {             return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),                 get<2>(args), get<3>(args), get<4>(args));    } + +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<A1, A2, A3, A4, A5>& args) { +           return callback->Run(get<0>(args), get<1>(args), get<2>(args), +               get<3>(args), get<4>(args)); +  }  };  template <typename R, typename A1, typename A2, typename A3, typename A4, @@ -172,6 +212,9 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > {             return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),                 get<2>(args), get<3>(args), get<4>(args), get<5>(args));    } + +  // There is no InvokeCallback() for 6-tuples, as google3 callbacks +  // support 5 arguments at most.  };  template <typename R, typename A1, typename A2, typename A3, typename A4, @@ -194,6 +237,9 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {                 get<2>(args), get<3>(args), get<4>(args), get<5>(args),                 get<6>(args));    } + +  // There is no InvokeCallback() for 7-tuples, as google3 callbacks +  // support 5 arguments at most.  };  template <typename R, typename A1, typename A2, typename A3, typename A4, @@ -217,6 +263,9 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {                 get<2>(args), get<3>(args), get<4>(args), get<5>(args),                 get<6>(args), get<7>(args));    } + +  // There is no InvokeCallback() for 8-tuples, as google3 callbacks +  // support 5 arguments at most.  };  template <typename R, typename A1, typename A2, typename A3, typename A4, @@ -240,6 +289,9 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {                 get<2>(args), get<3>(args), get<4>(args), get<5>(args),                 get<6>(args), get<7>(args), get<8>(args));    } + +  // There is no InvokeCallback() for 9-tuples, as google3 callbacks +  // support 5 arguments at most.  };  template <typename R, typename A1, typename A2, typename A3, typename A4, @@ -265,6 +317,34 @@ class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,                 get<2>(args), get<3>(args), get<4>(args), get<5>(args),                 get<6>(args), get<7>(args), get<8>(args), get<9>(args));    } + +  // There is no InvokeCallback() for 10-tuples, as google3 callbacks +  // support 5 arguments at most. +}; + +// Implements the Invoke(callback) action. +template <typename CallbackType> +class InvokeCallbackAction { + public: +  // The c'tor takes ownership of the callback. +  explicit InvokeCallbackAction(CallbackType* callback) +      : callback_(callback) { +    callback->CheckIsRepeatable();  // Makes sure the callback is permanent. +  } + +  // This type conversion operator template allows Invoke(callback) to +  // be used wherever the callback's type is compatible with that of +  // the mock function, i.e. if the mock function's arguments can be +  // implicitly converted to the callback's arguments and the +  // callback's result can be implicitly converted to the mock +  // function's result. +  template <typename Result, typename ArgumentTuple> +  Result Perform(const ArgumentTuple& args) const { +    return InvokeHelper<Result, ArgumentTuple>::InvokeCallback( +        callback_.get(), args); +  } + private: +  const linked_ptr<CallbackType> callback_;  };  // An INTERNAL macro for extracting the type of a tuple field.  It's @@ -1073,52 +1153,90 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,  #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\      ()  #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\ -    (p0##_type gmock_p0) : p0(gmock_p0) +    (p0##_type gmock_p0) : p0(::testing::internal::move(gmock_p0))  #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\ -    (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1) +    (p0##_type gmock_p0, \ +        p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1))  #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\      (p0##_type gmock_p0, p1##_type gmock_p1, \ -        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) +        p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2))  #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ -        p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3) +        p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3))  #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ -        p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \ -        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) +        p3##_type gmock_p3, \ +        p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3)), \ +        p4(::testing::internal::move(gmock_p4))  #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \          p3##_type gmock_p3, p4##_type gmock_p4, \ -        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) +        p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3)), \ +        p4(::testing::internal::move(gmock_p4)), \ +        p5(::testing::internal::move(gmock_p5))  #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ -        p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) +        p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3)), \ +        p4(::testing::internal::move(gmock_p4)), \ +        p5(::testing::internal::move(gmock_p5)), \ +        p6(::testing::internal::move(gmock_p6))  #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ -        p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \ -        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ -        p7(gmock_p7) +        p6##_type gmock_p6, \ +        p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3)), \ +        p4(::testing::internal::move(gmock_p4)), \ +        p5(::testing::internal::move(gmock_p5)), \ +        p6(::testing::internal::move(gmock_p6)), \ +        p7(::testing::internal::move(gmock_p7))  #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \      p7, p8)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \          p6##_type gmock_p6, p7##_type gmock_p7, \ -        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ -        p8(gmock_p8) +        p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3)), \ +        p4(::testing::internal::move(gmock_p4)), \ +        p5(::testing::internal::move(gmock_p5)), \ +        p6(::testing::internal::move(gmock_p6)), \ +        p7(::testing::internal::move(gmock_p7)), \ +        p8(::testing::internal::move(gmock_p8))  #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \      p7, p8, p9)\      (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ -        p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ -        p8(gmock_p8), p9(gmock_p9) +        p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \ +        p1(::testing::internal::move(gmock_p1)), \ +        p2(::testing::internal::move(gmock_p2)), \ +        p3(::testing::internal::move(gmock_p3)), \ +        p4(::testing::internal::move(gmock_p4)), \ +        p5(::testing::internal::move(gmock_p5)), \ +        p6(::testing::internal::move(gmock_p6)), \ +        p7(::testing::internal::move(gmock_p7)), \ +        p8(::testing::internal::move(gmock_p8)), \ +        p9(::testing::internal::move(gmock_p9))  // Declares the fields for storing the value parameters.  #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS() @@ -1354,7 +1472,8 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,    template <typename p0##_type>\    class name##ActionP {\     public:\ -    explicit name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\ +    explicit name##ActionP(p0##_type gmock_p0) : \ +        p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1362,7 +1481,8 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        typedef typename ::testing::internal::Function<F>::Result return_type;\        typedef typename ::testing::internal::Function<F>::ArgumentTuple\            args_type;\ -      explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\ +      explicit gmock_Impl(p0##_type gmock_p0) : \ +          p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1404,8 +1524,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,    template <typename p0##_type, typename p1##_type>\    class name##ActionP2 {\     public:\ -    name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ -        p1(gmock_p1) {}\ +    name##ActionP2(p0##_type gmock_p0, \ +        p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1413,8 +1534,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        typedef typename ::testing::internal::Function<F>::Result return_type;\        typedef typename ::testing::internal::Function<F>::ArgumentTuple\            args_type;\ -      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \ -          p1(gmock_p1) {}\ +      gmock_Impl(p0##_type gmock_p0, \ +          p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1460,7 +1582,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,    class name##ActionP3 {\     public:\      name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \ -        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ +        p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1469,7 +1593,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        typedef typename ::testing::internal::Function<F>::ArgumentTuple\            args_type;\        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \ -          p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\ +          p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1519,8 +1645,11 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,    class name##ActionP4 {\     public:\      name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \ -        p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \ -        p2(gmock_p2), p3(gmock_p3) {}\ +        p2##_type gmock_p2, \ +        p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1529,8 +1658,10 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        typedef typename ::testing::internal::Function<F>::ArgumentTuple\            args_type;\        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ -          p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -          p3(gmock_p3) {}\ +          p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1587,8 +1718,11 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,     public:\      name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \          p2##_type gmock_p2, p3##_type gmock_p3, \ -        p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4) {}\ +        p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +        p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1597,8 +1731,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        typedef typename ::testing::internal::Function<F>::ArgumentTuple\            args_type;\        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \ -          p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \ -          p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\ +          p3##_type gmock_p3, \ +          p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +          p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1657,8 +1795,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,     public:\      name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \          p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ -        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ +        p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +        p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1668,8 +1810,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,            args_type;\        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \            p3##_type gmock_p3, p4##_type gmock_p4, \ -          p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\ +          p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +          p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1731,9 +1877,14 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,     public:\      name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \          p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ -        p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \ -        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \ -        p6(gmock_p6) {}\ +        p5##_type gmock_p5, \ +        p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +        p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1743,8 +1894,13 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,            args_type;\        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \            p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ -          p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\ +          p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +          p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1813,9 +1969,14 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,      name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \          p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \          p5##_type gmock_p5, p6##_type gmock_p6, \ -        p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ -        p7(gmock_p7) {}\ +        p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \ +        p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1825,9 +1986,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,            args_type;\        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \            p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \ -          p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \ -          p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \ -          p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\ +          p6##_type gmock_p6, \ +          p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \ +          p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1900,9 +2067,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,      name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \          p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \          p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ -        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \ -        p8(gmock_p8) {}\ +        p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \ +        p7(::testing::internal::forward<p7##_type>(gmock_p7)), \ +        p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -1913,9 +2086,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \            p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \            p6##_type gmock_p6, p7##_type gmock_p7, \ -          p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ -          p7(gmock_p7), p8(gmock_p8) {}\ +          p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \ +          p7(::testing::internal::forward<p7##_type>(gmock_p7)), \ +          p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -1992,9 +2171,17 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,      name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \          p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \          p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ -        p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \ -        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ -        p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ +        p8##_type gmock_p8, \ +        p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \ +        p7(::testing::internal::forward<p7##_type>(gmock_p7)), \ +        p8(::testing::internal::forward<p8##_type>(gmock_p8)), \ +        p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\      template <typename F>\      class gmock_Impl : public ::testing::ActionInterface<F> {\       public:\ @@ -2005,9 +2192,16 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,        gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \            p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \            p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \ -          p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \ -          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \ -          p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\ +          p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \ +          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \ +          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \ +          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \ +          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \ +          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \ +          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \ +          p7(::testing::internal::forward<p7##_type>(gmock_p7)), \ +          p8(::testing::internal::forward<p8##_type>(gmock_p8)), \ +          p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\        virtual return_type Perform(const args_type& args) {\          return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\              Perform(this, args);\ @@ -2369,7 +2563,7 @@ ACTION_TEMPLATE(ReturnNew,  }  // namespace testing -// Include any custom actions added by the local installation. +// Include any custom callback actions added by the local installation.  // We must include this header at the end to make sure it can use the  // declarations from this file.  #include "gmock/internal/custom/gmock-generated-actions.h" diff --git a/googlemock/include/gmock/gmock-generated-actions.h.pump b/googlemock/include/gmock/gmock-generated-actions.h.pump index 712f65d6..8bafa478 100644 --- a/googlemock/include/gmock/gmock-generated-actions.h.pump +++ b/googlemock/include/gmock/gmock-generated-actions.h.pump @@ -1,5 +1,5 @@  $$ -*- mode: c++; -*- -$$ This is a Pump source file.  Please use Pump to convert it to +$$ This is a Pump source file. Please use Pump to convert it to  $$ gmock-generated-actions.h.  $$  $var n = 10  $$ The maximum arity we support. @@ -49,12 +49,13 @@ namespace testing {  namespace internal {  // InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary -// function or method with the unpacked values, where F is a function -// type that takes N arguments. +// function, method, or callback with the unpacked values, where F is +// a function type that takes N arguments.  template <typename Result, typename ArgumentTuple>  class InvokeHelper; +$var max_callback_arity = 5  $range i 0..n  $for i [[  $range j 1..i @@ -76,10 +77,48 @@ class InvokeHelper<R, ::testing::tuple<$as> > {                          const ::testing::tuple<$as>&$args) {             return (obj_ptr->*method_ptr)($gets);    } + + +$if i <= max_callback_arity [[ +  template <typename CallbackType> +  static R InvokeCallback(CallbackType* callback, +                          const ::testing::tuple<$as>&$args) { +           return callback->Run($gets); +  } +]] $else [[ +  // There is no InvokeCallback() for $i-tuples, as google3 callbacks +  // support $max_callback_arity arguments at most. +]] +  };  ]] +// Implements the Invoke(callback) action. +template <typename CallbackType> +class InvokeCallbackAction { + public: +  // The c'tor takes ownership of the callback. +  explicit InvokeCallbackAction(CallbackType* callback) +      : callback_(callback) { +    callback->CheckIsRepeatable();  // Makes sure the callback is permanent. +  } + +  // This type conversion operator template allows Invoke(callback) to +  // be used wherever the callback's type is compatible with that of +  // the mock function, i.e. if the mock function's arguments can be +  // implicitly converted to the callback's arguments and the +  // callback's result can be implicitly converted to the mock +  // function's result. +  template <typename Result, typename ArgumentTuple> +  Result Perform(const ArgumentTuple& args) const { +    return InvokeHelper<Result, ArgumentTuple>::InvokeCallback( +        callback_.get(), args); +  } + private: +  const linked_ptr<CallbackType> callback_; +}; +  // An INTERNAL macro for extracting the type of a tuple field.  It's  // subject to change without notice - DO NOT USE IN USER CODE!  #define GMOCK_FIELD_(Tuple, N) \ @@ -486,7 +525,7 @@ _VALUE_PARAMS($for j, [[p$j]]) $for j [[, typename p$j##_type]]  $for i [[  $range j 0..i-1  #define GMOCK_INTERNAL_INIT_AND_$i[[]]_VALUE_PARAMS($for j, [[p$j]])\ -    ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(gmock_p$j)]] +    ($for j, [[p$j##_type gmock_p$j]])$if i>0 [[ : ]]$for j, [[p$j(::testing::internal::move(gmock_p$j))]]  ]] @@ -619,7 +658,7 @@ $var class_name = [[name##Action[[$if i==0 [[]] $elif i==1 [[P]]  $range j 0..i-1  $var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]]  $var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] -$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(gmock_p$j)]]]]]] +$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::testing::internal::forward<p$j##_type>(gmock_p$j))]]]]]]  $var param_field_decls = [[$for j  [[ diff --git a/googlemock/include/gmock/gmock-generated-matchers.h.pump b/googlemock/include/gmock/gmock-generated-matchers.h.pump index 25d2da99..4fe0a61c 100644 --- a/googlemock/include/gmock/gmock-generated-matchers.h.pump +++ b/googlemock/include/gmock/gmock-generated-matchers.h.pump @@ -1,6 +1,6 @@  $$ -*- mode: c++; -*- -$$ This is a Pump source file.  Please use Pump to convert it to -$$ gmock-generated-actions.h. +$$ This is a Pump source file. Please use Pump to convert +$$ it to gmock-generated-matchers.h.  $$  $var n = 10  $$ The maximum arity we support.  $$ }} This line fixes auto-indentation of the following code in Emacs. diff --git a/googlemock/include/gmock/gmock-generated-nice-strict.h.pump b/googlemock/include/gmock/gmock-generated-nice-strict.h.pump index 4973c356..378c40f1 100644 --- a/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +++ b/googlemock/include/gmock/gmock-generated-nice-strict.h.pump @@ -1,6 +1,6 @@  $$ -*- mode: c++; -*- -$$ This is a Pump source file.  Please use Pump to convert it to -$$ gmock-generated-nice-strict.h. +$$ This is a Pump source file. Please use Pump to convert +$$ it to gmock-generated-nice-strict.h.  $$  $var n = 10  $$ The maximum arity we support.  // Copyright 2008, Google Inc. diff --git a/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump b/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump index d26c8a08..03cfd8c5 100644 --- a/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +++ b/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump @@ -1,5 +1,5 @@  $$ -*- mode: c++; -*- -$$ This is a Pump source file (http://go/pump).  Please use Pump to convert +$$ This is a Pump source file. Please use Pump to convert  $$ it to callback-actions.h.  $$  $var max_callback_arity = 5 | 
