merging
This commit is contained in:
parent
af4cfd5088
commit
8654c1ca10
@ -360,15 +360,21 @@ class Action {
|
|||||||
|
|
||||||
// Constructs a null Action. Needed for storing Action objects in
|
// Constructs a null Action. Needed for storing Action objects in
|
||||||
// STL containers.
|
// STL containers.
|
||||||
Action() : impl_(NULL) {}
|
Action() {}
|
||||||
|
|
||||||
// Constructs an Action from its implementation. A NULL impl is
|
#if GTEST_LANG_CXX11
|
||||||
// used to represent the "do-default" action.
|
// Construct an Action from a specified callable.
|
||||||
|
// This cannot take std::function directly, because then Action would not be
|
||||||
|
// directly constructible from lambda (it would require two conversions).
|
||||||
|
template <typename G,
|
||||||
|
typename = typename ::std::enable_if<
|
||||||
|
::std::is_constructible<::std::function<F>, G>::value>::type>
|
||||||
|
Action(G&& fun) : fun_(::std::forward<G>(fun)) {} // NOLINT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Constructs an Action from its implementation.
|
||||||
explicit Action(ActionInterface<F>* impl) : impl_(impl) {}
|
explicit Action(ActionInterface<F>* impl) : impl_(impl) {}
|
||||||
|
|
||||||
// Copy constructor.
|
|
||||||
Action(const Action& action) : impl_(action.impl_) {}
|
|
||||||
|
|
||||||
// This constructor allows us to turn an Action<Func> object into an
|
// This constructor allows us to turn an Action<Func> object into an
|
||||||
// Action<F>, as long as F's arguments can be implicitly converted
|
// Action<F>, as long as F's arguments can be implicitly converted
|
||||||
// to Func's and Func's return type can be implicitly converted to
|
// to Func's and Func's return type can be implicitly converted to
|
||||||
@ -377,7 +383,13 @@ class Action {
|
|||||||
explicit Action(const Action<Func>& action);
|
explicit Action(const Action<Func>& action);
|
||||||
|
|
||||||
// Returns true iff this is the DoDefault() action.
|
// Returns true iff this is the DoDefault() action.
|
||||||
bool IsDoDefault() const { return impl_.get() == NULL; }
|
bool IsDoDefault() const {
|
||||||
|
#if GTEST_LANG_CXX11
|
||||||
|
return impl_ == nullptr && fun_ == nullptr;
|
||||||
|
#else
|
||||||
|
return impl_ == NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Performs the action. Note that this method is const even though
|
// Performs the action. Note that this method is const even though
|
||||||
// the corresponding method in ActionInterface is not. The reason
|
// the corresponding method in ActionInterface is not. The reason
|
||||||
@ -385,14 +397,15 @@ class Action {
|
|||||||
// another concrete action, not that the concrete action it binds to
|
// another concrete action, not that the concrete action it binds to
|
||||||
// cannot change state. (Think of the difference between a const
|
// cannot change state. (Think of the difference between a const
|
||||||
// pointer and a pointer to const.)
|
// pointer and a pointer to const.)
|
||||||
Result Perform(const ArgumentTuple& args) const {
|
Result Perform(ArgumentTuple args) const {
|
||||||
internal::Assert(
|
if (IsDoDefault()) {
|
||||||
!IsDoDefault(), __FILE__, __LINE__,
|
internal::IllegalDoDefault(__FILE__, __LINE__);
|
||||||
"You are using DoDefault() inside a composite action like "
|
}
|
||||||
"DoAll() or WithArgs(). This is not supported for technical "
|
#if GTEST_LANG_CXX11
|
||||||
"reasons. Please instead spell out the default action, or "
|
if (fun_ != nullptr) {
|
||||||
"assign the default action to an Action variable and use "
|
return internal::Apply(fun_, ::std::move(args));
|
||||||
"the variable in various places.");
|
}
|
||||||
|
#endif
|
||||||
return impl_->Perform(args);
|
return impl_->Perform(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,6 +413,18 @@ class Action {
|
|||||||
template <typename F1, typename F2>
|
template <typename F1, typename F2>
|
||||||
friend class internal::ActionAdaptor;
|
friend class internal::ActionAdaptor;
|
||||||
|
|
||||||
|
template <typename G>
|
||||||
|
friend class Action;
|
||||||
|
|
||||||
|
// In C++11, Action can be implemented either as a generic functor (through
|
||||||
|
// std::function), or legacy ActionInterface. In C++98, only ActionInterface
|
||||||
|
// is available. The invariants are as follows:
|
||||||
|
// * in C++98, impl_ is null iff this is the default action
|
||||||
|
// * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff
|
||||||
|
// this is the default action
|
||||||
|
#if GTEST_LANG_CXX11
|
||||||
|
::std::function<F> fun_;
|
||||||
|
#endif
|
||||||
internal::linked_ptr<ActionInterface<F> > impl_;
|
internal::linked_ptr<ActionInterface<F> > impl_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -531,6 +556,9 @@ struct ByMoveWrapper {
|
|||||||
// statement, and conversion of the result of Return to Action<T(U)> is a
|
// statement, and conversion of the result of Return to Action<T(U)> is a
|
||||||
// good place for that.
|
// good place for that.
|
||||||
//
|
//
|
||||||
|
// The real life example of the above scenario happens when an invocation
|
||||||
|
// of gtl::Container() is passed into Return.
|
||||||
|
//
|
||||||
template <typename R>
|
template <typename R>
|
||||||
class ReturnAction {
|
class ReturnAction {
|
||||||
public:
|
public:
|
||||||
@ -750,7 +778,7 @@ class DoDefaultAction {
|
|||||||
// This template type conversion operator allows DoDefault() to be
|
// This template type conversion operator allows DoDefault() to be
|
||||||
// used in any function.
|
// used in any function.
|
||||||
template <typename F>
|
template <typename F>
|
||||||
operator Action<F>() const { return Action<F>(NULL); }
|
operator Action<F>() const { return Action<F>(); } // NOLINT
|
||||||
};
|
};
|
||||||
|
|
||||||
// Implements the Assign action to set a given pointer referent to a
|
// Implements the Assign action to set a given pointer referent to a
|
||||||
@ -886,6 +914,28 @@ class InvokeMethodWithoutArgsAction {
|
|||||||
GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction);
|
GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Implements the InvokeWithoutArgs(callback) action.
|
||||||
|
template <typename CallbackType>
|
||||||
|
class InvokeCallbackWithoutArgsAction {
|
||||||
|
public:
|
||||||
|
// The c'tor takes ownership of the callback.
|
||||||
|
explicit InvokeCallbackWithoutArgsAction(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 return type can be implicitly
|
||||||
|
// converted to that of the mock function.
|
||||||
|
template <typename Result, typename ArgumentTuple>
|
||||||
|
Result Perform(const ArgumentTuple&) const { return callback_->Run(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
const internal::linked_ptr<CallbackType> callback_;
|
||||||
|
|
||||||
|
GTEST_DISALLOW_ASSIGN_(InvokeCallbackWithoutArgsAction);
|
||||||
|
};
|
||||||
|
|
||||||
// Implements the IgnoreResult(action) action.
|
// Implements the IgnoreResult(action) action.
|
||||||
template <typename A>
|
template <typename A>
|
||||||
class IgnoreResultAction {
|
class IgnoreResultAction {
|
||||||
@ -1053,7 +1103,13 @@ typedef internal::IgnoredValue Unused;
|
|||||||
template <typename To>
|
template <typename To>
|
||||||
template <typename From>
|
template <typename From>
|
||||||
Action<To>::Action(const Action<From>& from)
|
Action<To>::Action(const Action<From>& from)
|
||||||
: impl_(new internal::ActionAdaptor<To, From>(from)) {}
|
:
|
||||||
|
#if GTEST_LANG_CXX11
|
||||||
|
fun_(from.fun_),
|
||||||
|
#endif
|
||||||
|
impl_(from.impl_ == NULL ? NULL
|
||||||
|
: new internal::ActionAdaptor<To, From>(from)) {
|
||||||
|
}
|
||||||
|
|
||||||
// Creates an action that returns 'value'. 'value' is passed by value
|
// Creates an action that returns 'value'. 'value' is passed by value
|
||||||
// instead of const reference - otherwise Return("string literal")
|
// instead of const reference - otherwise Return("string literal")
|
||||||
|
Loading…
Reference in New Issue
Block a user