130#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
131#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
142#include <type_traits>
169template <
typename T,
bool kDefaultConstructible>
176 Assert(
false, __FILE__, __LINE__,
177 "Default action undefined for the function return type.");
178 return internal::Invalid<T>();
196 static bool Exists() { return ::std::is_default_constructible<T>::value; }
200 T, ::std::is_default_constructible<T>::value>::Get();
219 static T*
Get() {
return nullptr; }
224#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \
226 class BuiltInDefaultValue<type> { \
228 static bool Exists() { return true; } \
229 static type Get() { return value; } \
245#if GMOCK_WCHAR_T_IS_NATIVE_
260#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_
268 : std::integral_constant<bool, bool(!P::value)> {};
271template <
typename...>
275template <
typename P1>
280template <
typename P1,
typename... Ps>
282 : std::conditional<bool(P1::value), conjunction<Ps...>, P1>::type {};
284template <
typename...>
287template <
typename P1>
290template <
typename P1,
typename... Ps>
293 : std::conditional<!bool(P1::value), disjunction<Ps...>, P1>::type {};
295template <
typename...>
320template <
typename From,
typename To>
325 template <
typename T>
326 static void Accept(
T);
329 template <
typename T>
333 template <typename T, typename = decltype(Accept<To>(Make<T>()))>
334 static std::true_type TestImplicitConversion(
int);
337 template <
typename T>
338 static std::false_type TestImplicitConversion(...);
341 using type =
decltype(TestImplicitConversion<From>(0));
342 static constexpr bool value = type::value;
348template <
typename F,
typename... Args>
351template <
typename Void,
typename R,
typename F,
typename... Args>
357template <
typename R,
typename F,
typename... Args>
360 std::is_void<R>::value,
362 is_implicitly_convertible<call_result_t<F, Args...>, R>>::type {};
366template <
typename R,
typename F,
typename... Args>
416template <
typename Result,
typename... Args>
421 template <
typename Callable>
424 std::is_constructible<typename std::decay<Callable>::type, Callable>,
431 template <
typename Callable>
434 std::is_constructible<typename std::decay<Callable>::type, Callable>,
443 template <
typename Callable,
444 typename std::enable_if<
451 OnceAction,
typename std::decay<Callable>::type>>,
456 : function_(StdFunctionAdaptor<typename
std::decay<Callable>::type>(
457 {}, std::forward<Callable>(callable))) {}
460 template <
typename Callable,
461 typename std::enable_if<
462 internal::conjunction<
467 internal::negation<std::is_same<
468 OnceAction,
typename std::decay<Callable>::type>>,
471 internal::negation<IsDirectlyCompatible<Callable>>,
472 IsCompatibleAfterIgnoringArguments<Callable>>
::value,
477 :
OnceAction(IgnoreIncomingArguments<typename
std::decay<Callable>::type>{
478 std::forward<Callable>(callable)}) {}
489 return function_(std::forward<Args>(args)...);
500 template <
typename Callable>
501 class StdFunctionAdaptor final {
508 template <
typename F>
509 explicit StdFunctionAdaptor(
CallableTag, F&& callable)
510 : callable_(
std::make_shared<Callable>(
std::forward<F>(callable))) {}
530 template <
typename... ArgRefs>
532 ArgRefs&&... args)
const {
533 return std::move(*callable_)(std::forward<ArgRefs>(args)...);
539 std::shared_ptr<Callable> callable_;
544 template <
typename Callable>
545 struct IgnoreIncomingArguments {
546 internal::call_result_t<Callable> operator()(Args&&...) {
547 return std::move(callable)();
553 std::function<Result(Args...)> function_;
576 producer_ =
new FixedValueProducer(
x);
582 typedef T (*FactoryFunction)();
585 producer_ =
new FactoryValueProducer(factory);
595 static bool IsSet() {
return producer_ !=
nullptr; }
608 : producer_->Produce();
612 class ValueProducer {
614 virtual ~ValueProducer() =
default;
615 virtual T Produce() = 0;
618 class FixedValueProducer :
public ValueProducer {
620 explicit FixedValueProducer(
T value) : value_(
value) {}
621 T Produce()
override {
return value_; }
625 FixedValueProducer(
const FixedValueProducer&) =
delete;
626 FixedValueProducer& operator=(
const FixedValueProducer&) =
delete;
629 class FactoryValueProducer :
public ValueProducer {
631 explicit FactoryValueProducer(FactoryFunction factory)
632 : factory_(factory) {}
633 T Produce()
override {
return factory_(); }
636 const FactoryFunction factory_;
637 FactoryValueProducer(
const FactoryValueProducer&) =
delete;
638 FactoryValueProducer& operator=(
const FactoryValueProducer&) =
delete;
641 static ValueProducer* producer_;
655 static void Clear() { address_ =
nullptr; }
658 static bool IsSet() {
return address_ !=
nullptr; }
689typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ =
nullptr;
693T* DefaultValue<T&>::address_ =
nullptr;
725template <
typename R,
typename... Args>
728 using F = R(Args...);
732 struct ActionAdapter {
734 ::std::shared_ptr<ActionInterface<F>> impl_;
736 template <
typename... InArgs>
738 return impl_->Perform(
739 ::std::forward_as_tuple(::std::forward<InArgs>(args)...));
743 template <
typename G>
744 using IsCompatibleFunctor = std::is_constructible<std::function<F>, G>;
760 IsCompatibleFunctor<G>, std::is_constructible<std::function<
Result()>,
763 Init(::std::forward<G>(fun), IsCompatibleFunctor<G>());
773 template <
typename Func>
775 : fun_(action.fun_) {}
788 internal::IllegalDoDefault(__FILE__, __LINE__);
790 return internal::Apply(fun_, ::std::move(args));
802 R operator()(Args... args) && {
803 return action.Perform(
804 std::forward_as_tuple(std::forward<Args>(args)...));
812 template <
typename G>
815 template <
typename G>
816 void Init(G&& g, ::std::true_type) {
817 fun_ = ::std::forward<G>(g);
820 template <
typename G>
821 void Init(G&& g, ::std::false_type) {
822 fun_ = IgnoreArgs<typename ::std::decay<G>::type>{::std::forward<G>(g)};
825 template <
typename FunctionImpl>
827 template <
typename... InArgs>
828 Result operator()(
const InArgs&...)
const {
829 return function_impl();
832 FunctionImpl function_impl;
836 ::std::function<F> fun_;
860template <
typename Impl>
865 template <
typename F>
867 return Action<F>(
new MonomorphicImpl<F>(impl_));
871 template <
typename F>
877 explicit MonomorphicImpl(
const Impl& impl) : impl_(impl) {}
879 Result Perform(
const ArgumentTuple& args)
override {
880 return impl_.template Perform<Result>(args);
904template <
typename Impl>
925 template <
typename U,
typename... Args,
930 std::is_convertible<R, U>,
931 std::is_move_constructible<U>>
::value>::type>
933 return Impl<U>(std::move(value_));
936 template <
typename U,
typename... Args,
941 std::is_convertible<const R&, U>,
942 std::is_copy_constructible<U>>
::value>::type>
944 return Impl<U>(value_);
949 template <
typename U>
954 explicit Impl(R&& input_value)
955 : state_(new State(
std::move(input_value))) {}
959 explicit Impl(
const R& input_value) : state_(new State(input_value)) {}
961 U operator()() && {
return std::move(state_->value); }
962 U operator()() const& {
return state_->value; }
977 explicit State(
const R& input_value_in)
978 : input_value(input_value_in),
991 explicit State(R&& input_value_in)
992 : input_value(
std::move(input_value_in)),
1075 const std::shared_ptr<State> state_;
1086template <
typename T>
1090 : state_(new State(
std::move(wrapper.payload))) {}
1094 <<
"A ByMove() action must be performed at most once.";
1096 state_->called =
true;
1097 return std::move(state_->value);
1104 explicit State(
T&& value_in) :
value(
std::move(value_in)) {}
1107 bool called =
false;
1110 const std::shared_ptr<State> state_;
1119 template <
typename Result,
typename ArgumentTuple>
1129 template <
typename Result,
typename ArgumentTuple>
1131 static_assert(std::is_void<Result>::value,
"Result should be void.");
1138template <
typename T>
1146 template <
typename F>
1152 static_assert(std::is_reference<Result>::value,
1153 "use Return instead of ReturnRef to return a value");
1159 template <
typename F>
1165 explicit Impl(
T& ref) : ref_(ref) {}
1167 Result Perform(
const ArgumentTuple&)
override {
return ref_; }
1179template <
typename T>
1188 template <
typename F>
1194 static_assert(std::is_reference<Result>::value,
1195 "use Return instead of ReturnRefOfCopy to return a value");
1201 template <
typename F>
1209 Result Perform(
const ArgumentTuple&)
override {
return value_; }
1220template <
typename T>
1225 <<
"ReturnRoundRobin requires at least one element.";
1226 state_->values = std::move(values);
1229 template <
typename... Args>
1231 return state_->Next();
1237 T ret_val = values[
i++];
1238 if (
i == values.size())
i = 0;
1242 std::vector<T> values;
1245 std::shared_ptr<State> state_ = std::make_shared<State>();
1253 template <
typename F>
1261template <
typename T1,
typename T2>
1266 template <
typename Result,
typename ArgumentTuple>
1276#ifndef GTEST_OS_WINDOWS_MOBILE
1280template <
typename T>
1284 : errno_(errno_value), result_(result) {}
1285 template <
typename Result,
typename ArgumentTuple>
1300template <
size_t N,
typename A,
typename =
void>
1304 template <
typename... Args>
1306 *::std::get<N>(std::tie(args...)) =
value;
1311template <
class Class,
typename MethodPtr>
1316 template <
typename... Args>
1318 ->
decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) {
1319 return (obj_ptr->*method_ptr)(std::forward<Args>(args)...);
1327template <
typename FunctionImpl>
1333 template <
typename... Args>
1335 return function_impl();
1340template <
class Class,
typename MethodPtr>
1346 decltype((std::declval<Class*>()->*std::declval<MethodPtr>())());
1348 template <
typename... Args>
1350 return (obj_ptr->*method_ptr)();
1355template <
typename A>
1360 template <
typename F>
1373 static_assert(std::is_void<Result>::value,
"Result type should be void.");
1379 template <
typename F>
1385 explicit Impl(
const A& action) : action_(action) {}
1387 void Perform(
const ArgumentTuple& args)
override {
1389 action_.Perform(args);
1396 typename internal::Function<F>::MakeResultIgnoredValue OriginalFunction;
1398 const Action<OriginalFunction> action_;
1404template <
typename InnerAction,
size_t... I>
1410 template <
typename R,
typename... Args>
1412 R(
typename std::tuple_element<I, std::tuple<Args...>>::type...);
1421 typename R,
typename... Args,
1422 typename std::enable_if<
1423 std::is_convertible<InnerAction,
1431 I, std::tuple<Args...>>...)>>
::value,
1437 R operator()(Args&&... args) && {
1438 return std::move(inner_action)
1440 std::forward_as_tuple(std::forward<Args>(args)...))...);
1444 return OA{std::move(inner_action)};
1448 typename R,
typename... Args,
1449 typename std::enable_if<
1450 std::is_convertible<
const InnerAction&,
1458 I, std::tuple<Args...>>...)>>
::value,
1463 return [converted](Args&&... args) -> R {
1464 return converted.Perform(std::forward_as_tuple(
1465 std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...));
1470template <
typename... Actions>
1474template <
typename FinalAction>
1479 template <
typename T>
1481 : final_action_(
std::forward<
T>(action)) {}
1489 template <
typename R,
typename... Args,
1490 typename std::enable_if<
1494 return std::move(final_action_);
1498 typename R,
typename... Args,
1499 typename std::enable_if<
1500 std::is_convertible<
const FinalAction&,
Action<R(Args...)>>
::value,
1503 return final_action_;
1507 FinalAction final_action_;
1512template <
typename InitialAction,
typename... OtherActions>
1563 template <
typename T>
1564 using InitialActionArgType =
1565 typename std::conditional<std::is_scalar<T>::value,
T,
const T&>::type;
1570 template <
typename T,
typename... U>
1572 U&&... other_actions)
1573 :
Base({}, std::forward<U>(other_actions)...),
1574 initial_action_(std::forward<T>(initial_action)) {}
1576 template <
typename R,
typename... Args,
1577 typename std::enable_if<
1581 std::is_convertible<
1583 OnceAction<void(InitialActionArgType<Args>...)>>,
1591 OnceAction<void(InitialActionArgType<Args>...)> initial_action;
1594 R operator()(Args... args) && {
1595 std::move(initial_action)
1596 .Call(
static_cast<InitialActionArgType<Args>
>(args)...);
1598 return std::move(remaining_actions).Call(std::forward<Args>(args)...);
1603 std::move(initial_action_),
1604 std::move(
static_cast<Base&
>(*
this)),
1609 typename R,
typename... Args,
1610 typename std::enable_if<
1614 std::is_convertible<
const InitialAction&,
1615 Action<void(InitialActionArgType<Args>...)>>,
1616 std::is_convertible<
const Base&,
Action<R(Args...)>>>
::value,
1623 Action<void(InitialActionArgType<Args>...)> initial_action;
1624 Action<R(Args...)> remaining_actions;
1626 R operator()(Args... args)
const {
1627 initial_action.Perform(std::forward_as_tuple(
1628 static_cast<InitialActionArgType<Args>
>(args)...));
1630 return remaining_actions.Perform(
1631 std::forward_as_tuple(std::forward<Args>(args)...));
1637 static_cast<const Base&
>(*this),
1642 InitialAction initial_action_;
1645template <
typename T,
typename... Params>
1648 return internal::Apply(
1649 [](
const Params&... unpacked_params) {
1650 return new T(unpacked_params...);
1659 template <
typename... Args,
1660 typename =
typename std::enable_if<(k <
sizeof...(Args))>::type>
1662 std::forward_as_tuple(std::forward<Args>(args)...))) {
1663 return std::get<k>(std::forward_as_tuple(std::forward<Args>(args)...));
1667template <
size_t k,
typename Ptr>
1671 template <
typename... Args>
1673 *pointer = std::get<k>(std::tie(args...));
1677template <
size_t k,
typename Ptr>
1681 template <
typename... Args>
1683 *pointer = *std::get<k>(std::tie(args...));
1687template <
size_t k,
typename T>
1691 template <
typename... Args>
1694 typename ::std::tuple_element<k, std::tuple<Args...>>::type;
1695 static_assert(std::is_lvalue_reference<argk_type>::value,
1696 "Argument must be a reference type.");
1697 std::get<k>(std::tie(args...)) =
value;
1701template <
size_t k,
typename I1,
typename I2>
1706 template <
typename... Args>
1708 auto value = std::get<k>(std::tie(args...));
1709 for (
auto it = first; it != last; ++it, (void)++
value) {
1717 template <
typename... Args>
1719 delete std::get<k>(std::tie(args...));
1723template <
typename Ptr>
1726 template <
typename... Args>
1732#if GTEST_HAS_EXCEPTIONS
1733template <
typename T>
1737 template <
typename R,
typename... Args>
1738 operator Action<R(Args...)>()
const {
1740 return [copy](Args...) -> R {
throw copy; };
1782template <
typename...
Action>
1786 {}, std::forward<Action>(action)...);
1794template <
size_t k,
typename InnerAction>
1796 InnerAction&& action) {
1797 return {std::forward<InnerAction>(action)};
1804template <
size_t k,
size_t... ks,
typename InnerAction>
1805internal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...>
1806WithArgs(InnerAction&& action) {
1807 return {std::forward<InnerAction>(action)};
1814template <
typename InnerAction>
1816 InnerAction&& action) {
1817 return {std::forward<InnerAction>(action)};
1844template <
typename R>
1860template <
typename R>
1866template <
typename R, R* =
nullptr>
1872template <
typename R>
1883template <
typename R>
1891template <
typename T>
1899template <
typename T>
1901 std::initializer_list<T> vals) {
1912template <
size_t N,
typename T>
1914 return {std::move(
value)};
1918template <
size_t N,
typename T>
1920 return {std::move(
value)};
1924template <
typename T1,
typename T2>
1929#ifndef GTEST_OS_WINDOWS_MOBILE
1932template <
typename T>
1934 int errval,
T result) {
1947template <
typename FunctionImpl>
1948typename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) {
1949 return std::forward<FunctionImpl>(function_impl);
1954template <
class Class,
typename MethodPtr>
1956 MethodPtr method_ptr) {
1957 return {obj_ptr, method_ptr};
1961template <
typename FunctionImpl>
1962internal::InvokeWithoutArgsAction<typename std::decay<FunctionImpl>::type>
1963InvokeWithoutArgs(FunctionImpl function_impl) {
1964 return {std::move(function_impl)};
1969template <
class Class,
typename MethodPtr>
1971 Class* obj_ptr, MethodPtr method_ptr) {
1972 return {obj_ptr, method_ptr};
1978template <
typename A>
1993template <
typename T>
1994inline ::std::reference_wrapper<T>
ByRef(
T& l_value) {
1995 return ::std::reference_wrapper<T>(l_value);
2001template <
typename T,
typename... Params>
2003 Params&&... params) {
2004 return {std::forward_as_tuple(std::forward<Params>(params)...)};
2015template <
size_t k,
typename Ptr>
2022template <
size_t k,
typename Ptr>
2029template <
size_t k,
typename T>
2032 return {std::forward<T>(
value)};
2040template <
size_t k,
typename I1,
typename I2>
2043 return {first, last};
2054template <
typename Ptr>
2061#if GTEST_HAS_EXCEPTIONS
2062template <
typename T>
2063internal::ThrowAction<typename std::decay<T>::type> Throw(
T&& exception) {
2064 return {std::forward<T>(exception)};
2088template <
typename F,
typename Impl>
2091template <
typename Impl>
2095 explicit operator const Impl&()
const {
return *ptr; }
2098 using type =
typename std::conditional<std::is_constructible<Impl>::value,
2102template <
typename R,
typename... Args,
typename Impl>
2112 static constexpr size_t kMaxArgs =
2113 sizeof...(Args) <= 10 ?
sizeof...(Args) : 10;
2119 template <std::size_t... arg_id, std::size_t... excess_id>
2128 return static_cast<const Impl&
>(*this)
2129 .template gmock_PerformImpl<
2133 typename std::tuple_element<arg_id, args_type>::type...>(
2134 args, std::get<arg_id>(args)...,
2135 ((void)excess_id, kExcessArg)...);
2141template <
typename F,
typename Impl>
2147template <
typename F,
typename Impl>
2152#define GMOCK_INTERNAL_ARG_UNUSED(i, data, el) \
2153 , const arg##i##_type& arg##i GTEST_ATTRIBUTE_UNUSED_
2154#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_ \
2155 const args_type& args GTEST_ATTRIBUTE_UNUSED_ GMOCK_PP_REPEAT( \
2156 GMOCK_INTERNAL_ARG_UNUSED, , 10)
2158#define GMOCK_INTERNAL_ARG(i, data, el) , const arg##i##_type& arg##i
2159#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_ \
2160 const args_type& args GMOCK_PP_REPEAT(GMOCK_INTERNAL_ARG, , 10)
2162#define GMOCK_INTERNAL_TEMPLATE_ARG(i, data, el) , typename arg##i##_type
2163#define GMOCK_ACTION_TEMPLATE_ARGS_NAMES_ \
2164 GMOCK_PP_TAIL(GMOCK_PP_REPEAT(GMOCK_INTERNAL_TEMPLATE_ARG, , 10))
2166#define GMOCK_INTERNAL_TYPENAME_PARAM(i, data, param) , typename param##_type
2167#define GMOCK_ACTION_TYPENAME_PARAMS_(params) \
2168 GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPENAME_PARAM, , params))
2170#define GMOCK_INTERNAL_TYPE_PARAM(i, data, param) , param##_type
2171#define GMOCK_ACTION_TYPE_PARAMS_(params) \
2172 GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_PARAM, , params))
2174#define GMOCK_INTERNAL_TYPE_GVALUE_PARAM(i, data, param) \
2175 , param##_type gmock_p##i
2176#define GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params) \
2177 GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_GVALUE_PARAM, , params))
2179#define GMOCK_INTERNAL_GVALUE_PARAM(i, data, param) \
2180 , std::forward<param##_type>(gmock_p##i)
2181#define GMOCK_ACTION_GVALUE_PARAMS_(params) \
2182 GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GVALUE_PARAM, , params))
2184#define GMOCK_INTERNAL_INIT_PARAM(i, data, param) \
2185 , param(::std::forward<param##_type>(gmock_p##i))
2186#define GMOCK_ACTION_INIT_PARAMS_(params) \
2187 GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_INIT_PARAM, , params))
2189#define GMOCK_INTERNAL_FIELD_PARAM(i, data, param) param##_type param;
2190#define GMOCK_ACTION_FIELD_PARAMS_(params) \
2191 GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_FIELD_PARAM, , params)
2193#define GMOCK_INTERNAL_ACTION(name, full_name, params) \
2194 template <GMOCK_ACTION_TYPENAME_PARAMS_(params)> \
2197 explicit full_name(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \
2198 : impl_(std::make_shared<gmock_Impl>( \
2199 GMOCK_ACTION_GVALUE_PARAMS_(params))) {} \
2200 full_name(const full_name&) = default; \
2201 full_name(full_name&&) noexcept = default; \
2202 template <typename F> \
2203 operator ::testing::Action<F>() const { \
2204 return ::testing::internal::MakeAction<F>(impl_); \
2208 class gmock_Impl { \
2210 explicit gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \
2211 : GMOCK_ACTION_INIT_PARAMS_(params) {} \
2212 template <typename function_type, typename return_type, \
2213 typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
2214 return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \
2215 GMOCK_ACTION_FIELD_PARAMS_(params) \
2217 std::shared_ptr<const gmock_Impl> impl_; \
2219 template <GMOCK_ACTION_TYPENAME_PARAMS_(params)> \
2220 inline full_name<GMOCK_ACTION_TYPE_PARAMS_(params)> name( \
2221 GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) GTEST_MUST_USE_RESULT_; \
2222 template <GMOCK_ACTION_TYPENAME_PARAMS_(params)> \
2223 inline full_name<GMOCK_ACTION_TYPE_PARAMS_(params)> name( \
2224 GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) { \
2225 return full_name<GMOCK_ACTION_TYPE_PARAMS_(params)>( \
2226 GMOCK_ACTION_GVALUE_PARAMS_(params)); \
2228 template <GMOCK_ACTION_TYPENAME_PARAMS_(params)> \
2229 template <typename function_type, typename return_type, typename args_type, \
2230 GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
2232 full_name<GMOCK_ACTION_TYPE_PARAMS_(params)>::gmock_Impl::gmock_PerformImpl( \
2233 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2238#define ACTION(name) \
2239 class name##Action { \
2241 explicit name##Action() noexcept {} \
2242 name##Action(const name##Action&) noexcept {} \
2243 template <typename F> \
2244 operator ::testing::Action<F>() const { \
2245 return ::testing::internal::MakeAction<F, gmock_Impl>(); \
2249 class gmock_Impl { \
2251 template <typename function_type, typename return_type, \
2252 typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
2253 return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \
2256 inline name##Action name() GTEST_MUST_USE_RESULT_; \
2257 inline name##Action name() { return name##Action(); } \
2258 template <typename function_type, typename return_type, typename args_type, \
2259 GMOCK_ACTION_TEMPLATE_ARGS_NAMES_> \
2260 return_type name##Action::gmock_Impl::gmock_PerformImpl( \
2261 GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2263#define ACTION_P(name, ...) \
2264 GMOCK_INTERNAL_ACTION(name, name##ActionP, (__VA_ARGS__))
2266#define ACTION_P2(name, ...) \
2267 GMOCK_INTERNAL_ACTION(name, name##ActionP2, (__VA_ARGS__))
2269#define ACTION_P3(name, ...) \
2270 GMOCK_INTERNAL_ACTION(name, name##ActionP3, (__VA_ARGS__))
2272#define ACTION_P4(name, ...) \
2273 GMOCK_INTERNAL_ACTION(name, name##ActionP4, (__VA_ARGS__))
2275#define ACTION_P5(name, ...) \
2276 GMOCK_INTERNAL_ACTION(name, name##ActionP5, (__VA_ARGS__))
2278#define ACTION_P6(name, ...) \
2279 GMOCK_INTERNAL_ACTION(name, name##ActionP6, (__VA_ARGS__))
2281#define ACTION_P7(name, ...) \
2282 GMOCK_INTERNAL_ACTION(name, name##ActionP7, (__VA_ARGS__))
2284#define ACTION_P8(name, ...) \
2285 GMOCK_INTERNAL_ACTION(name, name##ActionP8, (__VA_ARGS__))
2287#define ACTION_P9(name, ...) \
2288 GMOCK_INTERNAL_ACTION(name, name##ActionP9, (__VA_ARGS__))
2290#define ACTION_P10(name, ...) \
2291 GMOCK_INTERNAL_ACTION(name, name##ActionP10, (__VA_ARGS__))
Definition gtest_unittest.cc:5120
Definition gmock-actions.h:697
virtual Result Perform(const ArgumentTuple &args)=0
virtual ~ActionInterface()=default
ActionInterface()=default
internal::Function< F >::Result Result
Definition gmock-actions.h:699
internal::Function< F >::ArgumentTuple ArgumentTuple
Definition gmock-actions.h:700
bool IsDoDefault() const
Definition gmock-actions.h:778
Action(const Action< Func > &action)
Definition gmock-actions.h:774
Result Perform(ArgumentTuple args) const
Definition gmock-actions.h:786
internal::Function< F >::ArgumentTuple ArgumentTuple
Definition gmock-actions.h:748
internal::Function< F >::Result Result
Definition gmock-actions.h:747
Action(ActionInterface< F > *impl)
Definition gmock-actions.h:767
Action(G &&fun)
Definition gmock-actions.h:762
Definition gmock-actions.h:717
static T & Get()
Definition gmock-actions.h:669
static bool Exists()
Definition gmock-actions.h:662
static void Clear()
Definition gmock-actions.h:655
static bool IsSet()
Definition gmock-actions.h:658
static void Set(T &x)
Definition gmock-actions.h:650
static void Get()
Definition gmock-actions.h:684
static bool Exists()
Definition gmock-actions.h:683
Definition gmock-actions.h:570
static T Get()
Definition gmock-actions.h:606
static void Set(T x)
Definition gmock-actions.h:574
static void Clear()
Definition gmock-actions.h:589
static bool IsSet()
Definition gmock-actions.h:595
static bool Exists()
Definition gmock-actions.h:599
static void SetFactory(FactoryFunction factory)
Definition gmock-actions.h:583
OnceAction(OnceAction &&)=default
Result Call(Args... args) &&
Definition gmock-actions.h:488
OnceAction(const OnceAction &)=delete
OnceAction & operator=(const OnceAction &)=delete
OnceAction(Callable &&callable)
Definition gmock-actions.h:455
Definition gmock-actions.h:379
Definition gmock-actions.h:861
PolymorphicAction(const Impl &impl)
Definition gmock-actions.h:863
Definition gmock-actions.h:1262
void Perform(const ArgumentTuple &) const
Definition gmock-actions.h:1267
AssignAction(T1 *ptr, T2 value)
Definition gmock-actions.h:1264
static bool Exists()
Definition gmock-actions.h:218
static T * Get()
Definition gmock-actions.h:219
static bool Exists()
Definition gmock-actions.h:209
static T Get()
Definition gmock-actions.h:210
Definition gmock-actions.h:192
static bool Exists()
Definition gmock-actions.h:196
static T Get()
Definition gmock-actions.h:198
DoAllAction(UserConstructorTag, T &&action)
Definition gmock-actions.h:1480
DoAllAction(UserConstructorTag, T &&initial_action, U &&... other_actions)
Definition gmock-actions.h:1571
Definition gmock-actions.h:1471
Definition gmock-actions.h:1249
Definition gmock-actions.h:1356
IgnoreResultAction(const A &action)
Definition gmock-actions.h:1358
Definition gtest-internal.h:127
ReturnAction(ByMoveWrapper< T > wrapper)
Definition gmock-actions.h:1089
T operator()() const
Definition gmock-actions.h:1092
Definition gmock-actions.h:921
ReturnAction(R value)
Definition gmock-actions.h:923
Definition gmock-actions.h:1114
static Result Perform(const ArgumentTuple &)
Definition gmock-actions.h:1120
Definition gmock-actions.h:1139
ReturnRefAction(T &ref)
Definition gmock-actions.h:1142
Definition gmock-actions.h:1180
ReturnRefOfCopyAction(const T &value)
Definition gmock-actions.h:1184
Definition gmock-actions.h:1221
T operator()(Args &&...) const
Definition gmock-actions.h:1230
ReturnRoundRobinAction(std::vector< T > values)
Definition gmock-actions.h:1223
Definition gmock-actions.h:1126
static void Perform(const ArgumentTuple &)
Definition gmock-actions.h:1130
Definition gmock-actions.h:1281
Result Perform(const ArgumentTuple &) const
Definition gmock-actions.h:1286
SetErrnoAndReturnAction(int errno_value, T result)
Definition gmock-actions.h:1283
pRC::Float<> T
Definition externs_nonTT.hpp:1
#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value)
Definition gmock-actions.h:224
int value
Definition gmock-actions_test.cc:1714
int i
Definition gmock-matchers-comparisons_test.cc:603
int x
Definition gmock-matchers-containers_test.cc:376
#define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)
Definition gtest-port.h:360
#define GTEST_DISABLE_MSC_WARNINGS_POP_()
Definition gtest-port.h:361
#define GTEST_CHECK_(condition)
Definition gtest-port.h:1078
decltype(std::declval< F >()(std::declval< Args >()...)) call_result_t
Definition gmock-actions.h:349
typename MakeIndexSequenceImpl< N >::type MakeIndexSequence
Definition gtest-internal.h:1175
auto Apply(F &&f, Tuple &&args) -> decltype(ApplyImpl(std::forward< F >(f), std::forward< Tuple >(args), MakeIndexSequence< std::tuple_size< typename std::remove_reference< Tuple >::type >::value >()))
Definition gmock-internal-utils.h:431
To ImplicitCast_(To x)
Definition gtest-port.h:1140
void Assert(bool condition, const char *file, int line, const std::string &msg)
Definition gmock-internal-utils.h:242
std::add_const< T >::type & as_const(T &t)
Definition gmock-actions.h:371
void void_t
Definition gmock-actions.h:296
typename std::tuple_element< I, T >::type TupleElement
Definition gmock-internal-utils.h:478
Definition gmock-actions.h:151
internal::ReturnRoundRobinAction< T > ReturnRoundRobin(std::vector< T > vals)
Definition gmock-actions.h:1892
inline ::std::reference_wrapper< T > ByRef(T &l_value)
Definition gmock-actions.h:1994
internal::ByMoveWrapper< R > ByMove(R x)
Definition gmock-actions.h:1884
PolymorphicAction< Impl > MakePolymorphicAction(const Impl &impl)
Definition gmock-actions.h:905
Action< F > MakeAction(ActionInterface< F > *impl)
Definition gmock-actions.h:893
internal::ReturnRefOfCopyAction< R > ReturnRefOfCopy(const R &x)
Definition gmock-actions.h:1873
internal::SetArgumentPointeeAction< N, T > SetArgumentPointee(T value)
Definition gmock-actions.h:1919
internal::ReturnNewAction< T, typename std::decay< Params >::type... > ReturnNew(Params &&... params)
Definition gmock-actions.h:2002
Definition gmock-actions.h:506
std::tuple< Args... > args_type
Definition gmock-actions.h:2106
R operator()(Args &&... arg) const
Definition gmock-actions.h:2111
R(Args...) function_type
Definition gmock-actions.h:2105
R Apply(IndexSequence< arg_id... >, IndexSequence< excess_id... >, const args_type &args) const
Definition gmock-actions.h:2120
ActionImpl(std::shared_ptr< Impl > impl)
Definition gmock-actions.h:2109
Definition gmock-actions.h:2089
static T Get()
Definition gmock-actions.h:175
Definition gmock-actions.h:170
static T Get()
Definition gmock-actions.h:171
Definition gmock-actions.h:914
ByMoveWrapper(T value)
Definition gmock-actions.h:915
T payload
Definition gmock-actions.h:916
Definition gmock-actions.h:1716
void operator()(const Args &... args) const
Definition gmock-actions.h:1718
Definition gmock-actions.h:1477
Definition gmock-actions.h:1568
Definition gmock-actions.h:2084
Definition gmock-internal-utils.h:454
Definition gmock-actions.h:2093
std::shared_ptr< Impl > ptr
Definition gmock-actions.h:2096
Definition gmock-actions.h:2092
typename std::conditional< std::is_constructible< Impl >::value, Impl, Holder >::type type
Definition gmock-actions.h:2098
Definition gtest-internal.h:1148
Definition gmock-actions.h:1312
auto operator()(Args &&... args) const -> decltype((obj_ptr-> *method_ptr)(std::forward< Args >(args)...))
Definition gmock-actions.h:1317
const MethodPtr method_ptr
Definition gmock-actions.h:1314
Class *const obj_ptr
Definition gmock-actions.h:1313
Definition gmock-actions.h:1341
ReturnType operator()(const Args &...) const
Definition gmock-actions.h:1349
decltype((std::declval< Class * >() -> *std::declval< MethodPtr >())()) ReturnType
Definition gmock-actions.h:1345
const MethodPtr method_ptr
Definition gmock-actions.h:1343
Class *const obj_ptr
Definition gmock-actions.h:1342
Definition gmock-actions.h:1328
FunctionImpl function_impl
Definition gmock-actions.h:1329
auto operator()(const Args &...) -> decltype(function_impl())
Definition gmock-actions.h:1334
Definition gmock-actions.h:1658
auto operator()(Args &&... args) const -> decltype(std::get< k >(std::forward_as_tuple(std::forward< Args >(args)...)))
Definition gmock-actions.h:1661
Definition gmock-actions.h:1646
T * operator()() const
Definition gmock-actions.h:1647
std::tuple< Params... > params
Definition gmock-actions.h:1654
Definition gmock-actions.h:1724
auto operator()(const Args &...) const -> decltype(*pointer)
Definition gmock-actions.h:1727
Ptr pointer
Definition gmock-actions.h:1725
Definition gmock-actions.h:1668
Ptr pointer
Definition gmock-actions.h:1669
void operator()(const Args &... args) const
Definition gmock-actions.h:1672
Definition gmock-actions.h:1678
Ptr pointer
Definition gmock-actions.h:1679
void operator()(const Args &... args) const
Definition gmock-actions.h:1682
Definition gmock-actions.h:1688
void operator()(Args &&... args) const
Definition gmock-actions.h:1692
T value
Definition gmock-actions.h:1689
Definition gmock-actions.h:1301
A value
Definition gmock-actions.h:1302
void operator()(const Args &... args) const
Definition gmock-actions.h:1305
Definition gmock-actions.h:1702
I2 last
Definition gmock-actions.h:1704
void operator()(const Args &... args) const
Definition gmock-actions.h:1707
I1 first
Definition gmock-actions.h:1703
Definition gmock-actions.h:1405
InnerAction inner_action
Definition gmock-actions.h:1406
R(typename std::tuple_element< I, std::tuple< Args... > >::type...) InnerSignature
Definition gmock-actions.h:1411
Definition gmock-actions.h:272
Definition gmock-actions.h:285
Definition gmock-actions.h:352
Definition gmock-actions.h:321
decltype(TestImplicitConversion< From >(0)) type
Definition gmock-actions.h:341
Definition gmock-actions.h:268