Commit fbef0711 by Abseil Team Committed by Mark Barolak

Googletest export

Change ACTION{,_Pn,_TEMPLATE} macros to build functors rather than ActionInterface<> subclasses, thus changing the Action<> wrappers they create to use the modernized (non-const) argument tuple type, allowing these macros to mutate their arguments. Functor-based Action<>s deep-copy the implementing object, so have the functors use a shared_ptr to the non-trivial state of bound value parameters. No longer specialize that shared state to the particular action signature, encoding that information instead only in the instantiation of the implementation function. PiperOrigin-RevId: 341116208
parent 0c400f67
...@@ -296,7 +296,7 @@ ...@@ -296,7 +296,7 @@
// Defines the copy constructor // Defines the copy constructor
#define GMOCK_INTERNAL_DEFN_COPY_AND_0_VALUE_PARAMS() \ #define GMOCK_INTERNAL_DEFN_COPY_AND_0_VALUE_PARAMS() \
{} // Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134 noexcept {} // Avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134
#define GMOCK_INTERNAL_DEFN_COPY_AND_1_VALUE_PARAMS(...) = default; #define GMOCK_INTERNAL_DEFN_COPY_AND_1_VALUE_PARAMS(...) = default;
#define GMOCK_INTERNAL_DEFN_COPY_AND_2_VALUE_PARAMS(...) = default; #define GMOCK_INTERNAL_DEFN_COPY_AND_2_VALUE_PARAMS(...) = default;
#define GMOCK_INTERNAL_DEFN_COPY_AND_3_VALUE_PARAMS(...) = default; #define GMOCK_INTERNAL_DEFN_COPY_AND_3_VALUE_PARAMS(...) = default;
...@@ -429,66 +429,66 @@ ...@@ -429,66 +429,66 @@
#define GMOCK_ACTION_CLASS_(name, value_params)\ #define GMOCK_ACTION_CLASS_(name, value_params)\
GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params) GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
#define ACTION_TEMPLATE(name, template_params, value_params)\ #define ACTION_TEMPLATE(name, template_params, value_params) \
template <GMOCK_INTERNAL_DECL_##template_params\ template <GMOCK_INTERNAL_DECL_##template_params \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
class GMOCK_ACTION_CLASS_(name, value_params) {\ class GMOCK_ACTION_CLASS_(name, value_params) { \
public:\ public: \
explicit GMOCK_ACTION_CLASS_(name, value_params)\ explicit GMOCK_ACTION_CLASS_(name, value_params)( \
GMOCK_INTERNAL_INIT_##value_params {}\ GMOCK_INTERNAL_DECL_##value_params) \
GMOCK_ACTION_CLASS_(name, value_params)(\ GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
const GMOCK_ACTION_CLASS_(name, value_params)<\ = default; , \
GMOCK_INTERNAL_LIST_##template_params\ : impl_(std::make_shared<gmock_Impl>( \
GMOCK_INTERNAL_LIST_TYPE_##value_params>&)\ GMOCK_INTERNAL_LIST_##value_params)) { }) \
GMOCK_INTERNAL_DEFN_COPY_##value_params\ GMOCK_ACTION_CLASS_(name, value_params)( \
template <typename F>\ const GMOCK_ACTION_CLASS_(name, value_params)&) \
class gmock_Impl : public ::testing::ActionInterface<F> {\ GMOCK_INTERNAL_DEFN_COPY_##value_params \
public:\ GMOCK_ACTION_CLASS_(name, value_params)( \
typedef F function_type;\ GMOCK_ACTION_CLASS_(name, value_params)&&) \
typedef typename ::testing::internal::Function<F>::Result return_type;\ GMOCK_INTERNAL_DEFN_COPY_##value_params \
typedef typename ::testing::internal::Function<F>::ArgumentTuple\ template <typename F> \
args_type;\ operator ::testing::Action<F>() const { \
explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ return GMOCK_PP_IF( \
return_type Perform(const args_type& args) override {\ GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ (::testing::internal::MakeAction<F, gmock_Impl>()), \
Perform(this, args);\ (::testing::internal::MakeAction<F>(impl_))); \
}\ } \
template <GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>\ private: \
return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const;\ class gmock_Impl { \
GMOCK_INTERNAL_DEFN_##value_params\ public: \
};\ explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {} \
template <typename F> operator ::testing::Action<F>() const {\ template <typename function_type, typename return_type, \
return ::testing::Action<F>(\ typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\ return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \
}\ GMOCK_INTERNAL_DEFN_##value_params \
GMOCK_INTERNAL_DEFN_##value_params\ }; \
};\ GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
template <GMOCK_INTERNAL_DECL_##template_params\ , std::shared_ptr<const gmock_Impl> impl_;) \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ }; \
GMOCK_ACTION_CLASS_(name, value_params)<\ template <GMOCK_INTERNAL_DECL_##template_params \
GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_DECL_##value_params) GTEST_MUST_USE_RESULT_;\ GMOCK_INTERNAL_LIST_##template_params \
template <GMOCK_INTERNAL_DECL_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params> name( \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ GMOCK_INTERNAL_DECL_##value_params) GTEST_MUST_USE_RESULT_; \
inline GMOCK_ACTION_CLASS_(name, value_params)<\ template <GMOCK_INTERNAL_DECL_##template_params \
GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ inline GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_DECL_##value_params) {\ GMOCK_INTERNAL_LIST_##template_params \
return GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_TYPE_##value_params> name( \
GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_DECL_##value_params) { \
GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ return GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_LIST_##value_params);\ GMOCK_INTERNAL_LIST_##template_params \
}\ GMOCK_INTERNAL_LIST_TYPE_##value_params>( \
template <GMOCK_INTERNAL_DECL_##template_params\ GMOCK_INTERNAL_LIST_##value_params); \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ } \
template <typename F>\ template <GMOCK_INTERNAL_DECL_##template_params \
template <GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
typename ::testing::internal::Function<F>::Result\ template <typename function_type, typename return_type, typename args_type, \
GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
GMOCK_INTERNAL_LIST_##template_params\ return_type GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\ GMOCK_INTERNAL_LIST_##template_params \
gmock_PerformImpl(\ GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::gmock_PerformImpl( \
GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
namespace testing { namespace testing {
......
...@@ -181,7 +181,7 @@ $range j 0..i-1 ...@@ -181,7 +181,7 @@ $range j 0..i-1
$for i [[ $for i [[
#define GMOCK_INTERNAL_DEFN_COPY_AND_$i[[]]_VALUE_PARAMS$if i == 0[[() \ #define GMOCK_INTERNAL_DEFN_COPY_AND_$i[[]]_VALUE_PARAMS$if i == 0[[() \
{} // Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134 noexcept {} // Avoid https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82134
]] $else [[(...) = default;]] ]] $else [[(...) = default;]]
...@@ -243,66 +243,66 @@ $if i==1 [[P]] $elif i>=2 [[P$i]] ...@@ -243,66 +243,66 @@ $if i==1 [[P]] $elif i>=2 [[P$i]]
$range k 0..n-1 $range k 0..n-1
#define ACTION_TEMPLATE(name, template_params, value_params)\ #define ACTION_TEMPLATE(name, template_params, value_params) \
template <GMOCK_INTERNAL_DECL_##template_params\ template <GMOCK_INTERNAL_DECL_##template_params \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
class GMOCK_ACTION_CLASS_(name, value_params) {\ class GMOCK_ACTION_CLASS_(name, value_params) { \
public:\ public: \
explicit GMOCK_ACTION_CLASS_(name, value_params)\ explicit GMOCK_ACTION_CLASS_(name, value_params)( \
GMOCK_INTERNAL_INIT_##value_params {}\ GMOCK_INTERNAL_DECL_##value_params) \
GMOCK_ACTION_CLASS_(name, value_params)(\ GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
const GMOCK_ACTION_CLASS_(name, value_params)<\ = default; , \
GMOCK_INTERNAL_LIST_##template_params\ : impl_(std::make_shared<gmock_Impl>( \
GMOCK_INTERNAL_LIST_TYPE_##value_params>&)\ GMOCK_INTERNAL_LIST_##value_params)) { }) \
GMOCK_INTERNAL_DEFN_COPY_##value_params\ GMOCK_ACTION_CLASS_(name, value_params)( \
template <typename F>\ const GMOCK_ACTION_CLASS_(name, value_params)&) \
class gmock_Impl : public ::testing::ActionInterface<F> {\ GMOCK_INTERNAL_DEFN_COPY_##value_params \
public:\ GMOCK_ACTION_CLASS_(name, value_params)( \
typedef F function_type;\ GMOCK_ACTION_CLASS_(name, value_params)&&) \
typedef typename ::testing::internal::Function<F>::Result return_type;\ GMOCK_INTERNAL_DEFN_COPY_##value_params \
typedef typename ::testing::internal::Function<F>::ArgumentTuple\ template <typename F> \
args_type;\ operator ::testing::Action<F>() const { \
explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\ return GMOCK_PP_IF( \
return_type Perform(const args_type& args) override {\ GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\ (::testing::internal::MakeAction<F, gmock_Impl>()), \
Perform(this, args);\ (::testing::internal::MakeAction<F>(impl_))); \
}\ } \
template <GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>\ private: \
return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const;\ class gmock_Impl { \
GMOCK_INTERNAL_DEFN_##value_params\ public: \
};\ explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {} \
template <typename F> operator ::testing::Action<F>() const {\ template <typename function_type, typename return_type, \
return ::testing::Action<F>(\ typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\ return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \
}\ GMOCK_INTERNAL_DEFN_##value_params \
GMOCK_INTERNAL_DEFN_##value_params\ }; \
};\ GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(GMOCK_INTERNAL_COUNT_##value_params), \
template <GMOCK_INTERNAL_DECL_##template_params\ , std::shared_ptr<const gmock_Impl> impl_;) \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ }; \
GMOCK_ACTION_CLASS_(name, value_params)<\ template <GMOCK_INTERNAL_DECL_##template_params \
GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_DECL_##value_params) GTEST_MUST_USE_RESULT_;\ GMOCK_INTERNAL_LIST_##template_params \
template <GMOCK_INTERNAL_DECL_##template_params\ GMOCK_INTERNAL_LIST_TYPE_##value_params> name( \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ GMOCK_INTERNAL_DECL_##value_params) GTEST_MUST_USE_RESULT_; \
inline GMOCK_ACTION_CLASS_(name, value_params)<\ template <GMOCK_INTERNAL_DECL_##template_params \
GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\ inline GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_DECL_##value_params) {\ GMOCK_INTERNAL_LIST_##template_params \
return GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_INTERNAL_LIST_TYPE_##value_params> name( \
GMOCK_INTERNAL_LIST_##template_params\ GMOCK_INTERNAL_DECL_##value_params) { \
GMOCK_INTERNAL_LIST_TYPE_##value_params>(\ return GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_LIST_##value_params);\ GMOCK_INTERNAL_LIST_##template_params \
}\ GMOCK_INTERNAL_LIST_TYPE_##value_params>( \
template <GMOCK_INTERNAL_DECL_##template_params\ GMOCK_INTERNAL_LIST_##value_params); \
GMOCK_INTERNAL_DECL_TYPE_##value_params>\ } \
template <typename F>\ template <GMOCK_INTERNAL_DECL_##template_params \
template <GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>\ GMOCK_INTERNAL_DECL_TYPE_##value_params> \
typename ::testing::internal::Function<F>::Result\ template <typename function_type, typename return_type, typename args_type, \
GMOCK_ACTION_CLASS_(name, value_params)<\ GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
GMOCK_INTERNAL_LIST_##template_params\ return_type GMOCK_ACTION_CLASS_(name, value_params)< \
GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\ GMOCK_INTERNAL_LIST_##template_params \
gmock_PerformImpl(\ GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl::gmock_PerformImpl( \
GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
namespace testing { namespace testing {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment