36#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
37#define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
49#if GTEST_HAS_STD_TYPE_TRAITS_
66template <
typename F1,
typename F2>
74template <
typename T,
bool kDefaultConstructible>
81 Assert(
false, __FILE__, __LINE__,
82 "Default action undefined for the function return type.");
99#if GTEST_HAS_STD_TYPE_TRAITS_
102 return ::std::is_default_constructible<T>::value;
107 T, ::std::is_default_constructible<T>::value>
::Get();
138 static T*
Get() {
return NULL; }
143#define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \
145 class BuiltInDefaultValue<type> { \
147 static bool Exists() { return true; } \
148 static type Get() { return value; } \
152#if GTEST_HAS_GLOBAL_STRING
167#if GMOCK_WCHAR_T_IS_NATIVE_
182#undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_
206 producer_ =
new FixedValueProducer(x);
215 producer_ =
new FactoryValueProducer(factory);
225 static bool IsSet() {
return producer_ != NULL; }
237 return producer_ == NULL ?
242 class ValueProducer {
244 virtual ~ValueProducer() {}
245 virtual T Produce() = 0;
248 class FixedValueProducer :
public ValueProducer {
250 explicit FixedValueProducer(
T value) : value_(
value) {}
251 virtual T Produce() {
return value_; }
258 class FactoryValueProducer :
public ValueProducer {
261 : factory_(factory) {}
262 virtual T Produce() {
return factory_(); }
269 static ValueProducer* producer_;
288 static bool IsSet() {
return address_ != NULL; }
300 return address_ == NULL ?
319typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = NULL;
375 template <
typename Func>
390 "You are using DoDefault() inside a composite action like "
391 "DoAll() or WithArgs(). This is not supported for technical "
392 "reasons. Please instead spell out the default action, or "
393 "assign the default action to an Action variable and use "
394 "the variable in various places.");
395 return impl_->Perform(args);
399 template <
typename F1,
typename F2>
426template <
typename Impl>
431 template <
typename F>
433 return Action<F>(
new MonomorphicImpl<F>(impl_));
437 template <
typename F>
443 explicit MonomorphicImpl(
const Impl& impl) : impl_(impl) {}
446 return impl_.template Perform<Result>(args);
474template <
typename Impl>
483template <
typename F1,
typename F2>
492 return impl_->Perform(args);
543 template <
typename F>
556 use_ReturnRef_instead_of_Return_to_return_a_reference);
557 return Action<F>(
new Impl<R, F>(value_));
562 template <
typename R_,
typename F>
576 : value_before_cast_(*
value),
583 Result_cannot_be_a_reference_type);
586 R value_before_cast_;
594 template <
typename R_,
typename F>
595 class Impl<ByMoveWrapper<R_>,
F> :
public ActionInterface<F> {
597 typedef typename Function<F>::Result Result;
598 typedef typename Function<F>::ArgumentTuple ArgumentTuple;
600 explicit Impl(
const linked_ptr<R>& wrapper)
601 : performed_(
false), wrapper_(wrapper) {}
603 virtual Result Perform(
const ArgumentTuple&) {
605 <<
"A ByMove() action should only be performed once.";
612 const linked_ptr<R> wrapper_;
617 const linked_ptr<R> value_;
628 template <
typename Result,
typename ArgumentTuple>
634 ReturnNull_can_be_used_to_return_a_pointer_only);
644 template <
typename Result,
typename ArgumentTuple>
661 template <
typename F>
668 use_Return_instead_of_ReturnRef_to_return_a_value);
674 template <
typename F>
680 explicit Impl(
T& ref) : ref_(ref) {}
709 template <
typename F>
717 use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);
723 template <
typename F>
751 template <
typename F>
757template <
typename T1,
typename T2>
762 template <
typename Result,
typename ArgumentTuple>
774#if !GTEST_OS_WINDOWS_MOBILE
782 : errno_(errno_value),
784 template <
typename Result,
typename ArgumentTuple>
803template <
size_t N,
typename A,
bool kIsProto>
810 template <
typename Result,
typename ArgumentTuple>
813 *::testing::get<N>(args) = value_;
822template <
size_t N,
typename Proto>
830 proto_->CopyFrom(proto);
833 template <
typename Result,
typename ArgumentTuple>
836 ::testing::get<N>(args)->CopyFrom(*proto_);
850template <
typename FunctionImpl>
856 : function_impl_(function_impl) {}
860 template <
typename Result,
typename ArgumentTuple>
864 FunctionImpl function_impl_;
870template <
class Class,
typename MethodPtr>
874 : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {}
876 template <
typename Result,
typename ArgumentTuple>
878 return (obj_ptr_->*method_ptr_)();
882 Class*
const obj_ptr_;
883 const MethodPtr method_ptr_;
894 template <
typename F>
913 template <
typename F>
929 typedef typename internal::Function<F>::MakeResultIgnoredValue
932 const Action<OriginalFunction> action_;
957 operator T&()
const {
return *pointer_; }
971template <
typename Action1,
typename Action2>
975 : action1_(action1), action2_(action2) {}
979 template <
typename F>
981 return Action<F>(
new Impl<F>(action1_, action2_));
986 template <
typename F>
994 : action1_(action1), action2_(action2) {}
998 return action2_.Perform(args);
1002 const Action<VoidResult> action1_;
1003 const Action<F> action2_;
1052template <
typename To>
1053template <
typename From>
1060template <
typename R>
1076template <
typename R>
1084template <
typename R>
1093template <
typename R>
1105template <
size_t N,
typename T>
1107 internal::SetArgumentPointeeAction<
1114#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN)
1120 internal::SetArgumentPointeeAction<N, const char*, false> >
1123 N,
const char*,
false>(p));
1128 internal::SetArgumentPointeeAction<N, const wchar_t*, false> >
1131 N,
const wchar_t*,
false>(p));
1136template <
size_t N,
typename T>
1138 internal::SetArgumentPointeeAction<
1146template <
typename T1,
typename T2>
1151#if !GTEST_OS_WINDOWS_MOBILE
1154template <
typename T>
1155PolymorphicAction<internal::SetErrnoAndReturnAction<T> >
1166template <
typename FunctionImpl>
1167PolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> >
1175template <
class Class,
typename MethodPtr>
1176PolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> >
1180 obj_ptr, method_ptr));
1186template <
typename A>
1198template <
typename T>
Action(ActionInterface< F > *impl)
friend class internal::ActionAdaptor
Action(const Action &action)
Action(const Action< Func > &action)
internal::Function< F >::Result Result
Result Perform(const ArgumentTuple &args) const
internal::Function< F >::ArgumentTuple ArgumentTuple
Action(const Action< From > &from)
virtual Result Perform(const ArgumentTuple &args)=0
internal::Function< F >::Result Result
virtual ~ActionInterface()
internal::Function< F >::ArgumentTuple ArgumentTuple
static void SetFactory(FactoryFunction factory)
PolymorphicAction(const Impl &impl)
ActionAdaptor(const Action< F2 > &from)
internal::Function< F1 >::ArgumentTuple ArgumentTuple
virtual Result Perform(const ArgumentTuple &args)
internal::Function< F1 >::Result Result
void Perform(const ArgumentTuple &) const
AssignAction(T1 *ptr, T2 value)
DoBothAction(Action1 action1, Action2 action2)
IgnoreResultAction(const A &action)
Result Perform(const ArgumentTuple &) const
InvokeMethodWithoutArgsAction(Class *obj_ptr, MethodPtr method_ptr)
InvokeWithoutArgsAction(FunctionImpl function_impl)
Result Perform(const ArgumentTuple &)
ReferenceWrapper(T &l_value)
static Result Perform(const ArgumentTuple &)
ReturnRefOfCopyAction(const T &value)
static void Perform(const ArgumentTuple &)
void Perform(const ArgumentTuple &args) const
SetArgumentPointeeAction(const Proto &proto)
void Perform(const ArgumentTuple &args) const
SetArgumentPointeeAction(const A &value)
Result Perform(const ArgumentTuple &) const
SetErrnoAndReturnAction(int errno_value, T result)
static void Print(const T &value, ::std::ostream *os)
#define GTEST_CHECK_(condition)
#define GTEST_DISALLOW_ASSIGN_(type)
#define GTEST_COMPILE_ASSERT_(expr, msg)
#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)
void Assert(bool condition, const char *file, int line)
void PrintTo(const ReferenceWrapper< T > &ref, ::std::ostream *os)
GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void,)
const T & move(const T &t)
const bool ImplicitlyConvertible< From, To >::value
TypeWithSize< 8 >::Int Int64
TypeWithSize< 8 >::UInt UInt64
T * DefaultValue< T & >::address_
internal::IgnoreResultAction< A > IgnoreResult(const A &an_action)
PolymorphicAction< internal::InvokeWithoutArgsAction< FunctionImpl > > InvokeWithoutArgs(FunctionImpl function_impl)
internal::ByMoveWrapper< R > ByMove(R x)
PolymorphicAction< Impl > MakePolymorphicAction(const Impl &impl)
PolymorphicAction< internal::ReturnVoidAction > Return()
internal::IgnoredValue Unused
PolymorphicAction< internal::AssignAction< T1, T2 > > Assign(T1 *ptr, T2 val)
PolymorphicAction< internal::SetErrnoAndReturnAction< T > > SetErrnoAndReturn(int errval, T result)
Action< F > MakeAction(ActionInterface< F > *impl)
PolymorphicAction< internal::SetArgumentPointeeAction< N, T, internal::IsAProtocolMessage< T >::value > > SetArgumentPointee(const T &x)
internal::ReturnRefOfCopyAction< R > ReturnRefOfCopy(const R &x)
internal::ReferenceWrapper< T > ByRef(T &l_value)
internal::ReturnRefAction< R > ReturnRef(R &x)
PolymorphicAction< internal::SetArgumentPointeeAction< N, T, internal::IsAProtocolMessage< T >::value > > SetArgPointee(const T &x)
internal::DoDefaultAction DoDefault()
PolymorphicAction< internal::ReturnNullAction > ReturnNull()
const GenericPointer< typename T::ValueType > T2 value