| Index: base/callback_internal.cc
|
| diff --git a/base/callback_internal.cc b/base/callback_internal.cc
|
| index 2553fe7e1b64bf20c67dde90800377dc44b58fc2..4c8ccae932df1d2e9239903d67fae1745e5b7c1f 100644
|
| --- a/base/callback_internal.cc
|
| +++ b/base/callback_internal.cc
|
| @@ -18,29 +18,66 @@ void BindStateBase::Release() {
|
| destructor_(this);
|
| }
|
|
|
| -CallbackBase::CallbackBase(const CallbackBase& c) = default;
|
| -CallbackBase& CallbackBase::operator=(const CallbackBase& c) = default;
|
| +CallbackBase<CopyMode::MoveOnly>::CallbackBase(CallbackBase&& c)
|
| + : bind_state_(std::move(c.bind_state_)),
|
| + polymorphic_invoke_(c.polymorphic_invoke_) {
|
| + c.polymorphic_invoke_ = nullptr;
|
| +}
|
| +
|
| +CallbackBase<CopyMode::MoveOnly>&
|
| +CallbackBase<CopyMode::MoveOnly>::operator=(CallbackBase&& c) {
|
| + bind_state_ = std::move(c.bind_state_);
|
| + polymorphic_invoke_ = c.polymorphic_invoke_;
|
| + c.polymorphic_invoke_ = nullptr;
|
| + return *this;
|
| +}
|
|
|
| -void CallbackBase::Reset() {
|
| - polymorphic_invoke_ = NULL;
|
| +void CallbackBase<CopyMode::MoveOnly>::Reset() {
|
| + polymorphic_invoke_ = nullptr;
|
| // NULL the bind_state_ last, since it may be holding the last ref to whatever
|
| // object owns us, and we may be deleted after that.
|
| - bind_state_ = NULL;
|
| + bind_state_ = nullptr;
|
| }
|
|
|
| -bool CallbackBase::Equals(const CallbackBase& other) const {
|
| +bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal(
|
| + const CallbackBase& other) const {
|
| return bind_state_.get() == other.bind_state_.get() &&
|
| polymorphic_invoke_ == other.polymorphic_invoke_;
|
| }
|
|
|
| -CallbackBase::CallbackBase(BindStateBase* bind_state)
|
| - : bind_state_(bind_state),
|
| - polymorphic_invoke_(NULL) {
|
| +CallbackBase<CopyMode::MoveOnly>::CallbackBase(
|
| + BindStateBase* bind_state)
|
| + : bind_state_(bind_state) {
|
| DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1);
|
| }
|
|
|
| -CallbackBase::~CallbackBase() {
|
| +CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {}
|
| +
|
| +CallbackBase<CopyMode::Copyable>::CallbackBase(
|
| + const CallbackBase& c)
|
| + : CallbackBase<CopyMode::MoveOnly>(nullptr) {
|
| + bind_state_ = c.bind_state_;
|
| + polymorphic_invoke_ = c.polymorphic_invoke_;
|
| +}
|
| +
|
| +CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c)
|
| + : CallbackBase<CopyMode::MoveOnly>(std::move(c)) {}
|
| +
|
| +CallbackBase<CopyMode::Copyable>&
|
| +CallbackBase<CopyMode::Copyable>::operator=(const CallbackBase& c) {
|
| + bind_state_ = c.bind_state_;
|
| + polymorphic_invoke_ = c.polymorphic_invoke_;
|
| + return *this;
|
| }
|
|
|
| +CallbackBase<CopyMode::Copyable>&
|
| +CallbackBase<CopyMode::Copyable>::operator=(CallbackBase&& c) {
|
| + *static_cast<CallbackBase<CopyMode::MoveOnly>*>(this) = std::move(c);
|
| + return *this;
|
| +}
|
| +
|
| +template class CallbackBase<CopyMode::MoveOnly>;
|
| +template class CallbackBase<CopyMode::Copyable>;
|
| +
|
| } // namespace internal
|
| } // namespace base
|
|
|