1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/callback_internal.h" 6 7 #include "base/logging.h" 8 9 namespace base { 10 namespace internal { 11 AddRef()12void BindStateBase::AddRef() { 13 AtomicRefCountInc(&ref_count_); 14 } 15 Release()16void BindStateBase::Release() { 17 if (!AtomicRefCountDec(&ref_count_)) 18 destructor_(this); 19 } 20 CallbackBase(CallbackBase && c)21CallbackBase<CopyMode::MoveOnly>::CallbackBase(CallbackBase&& c) 22 : bind_state_(std::move(c.bind_state_)), 23 polymorphic_invoke_(c.polymorphic_invoke_) { 24 c.polymorphic_invoke_ = nullptr; 25 } 26 27 CallbackBase<CopyMode::MoveOnly>& operator =(CallbackBase && c)28CallbackBase<CopyMode::MoveOnly>::operator=(CallbackBase&& c) { 29 bind_state_ = std::move(c.bind_state_); 30 polymorphic_invoke_ = c.polymorphic_invoke_; 31 c.polymorphic_invoke_ = nullptr; 32 return *this; 33 } 34 Reset()35void CallbackBase<CopyMode::MoveOnly>::Reset() { 36 polymorphic_invoke_ = nullptr; 37 // NULL the bind_state_ last, since it may be holding the last ref to whatever 38 // object owns us, and we may be deleted after that. 39 bind_state_ = nullptr; 40 } 41 EqualsInternal(const CallbackBase & other) const42bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal( 43 const CallbackBase& other) const { 44 return bind_state_.get() == other.bind_state_.get() && 45 polymorphic_invoke_ == other.polymorphic_invoke_; 46 } 47 CallbackBase(BindStateBase * bind_state)48CallbackBase<CopyMode::MoveOnly>::CallbackBase( 49 BindStateBase* bind_state) 50 : bind_state_(bind_state) { 51 DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1); 52 } 53 ~CallbackBase()54CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {} 55 CallbackBase(const CallbackBase & c)56CallbackBase<CopyMode::Copyable>::CallbackBase( 57 const CallbackBase& c) 58 : CallbackBase<CopyMode::MoveOnly>(nullptr) { 59 bind_state_ = c.bind_state_; 60 polymorphic_invoke_ = c.polymorphic_invoke_; 61 } 62 CallbackBase(CallbackBase && c)63CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c) 64 : CallbackBase<CopyMode::MoveOnly>(std::move(c)) {} 65 66 CallbackBase<CopyMode::Copyable>& operator =(const CallbackBase & c)67CallbackBase<CopyMode::Copyable>::operator=(const CallbackBase& c) { 68 bind_state_ = c.bind_state_; 69 polymorphic_invoke_ = c.polymorphic_invoke_; 70 return *this; 71 } 72 73 CallbackBase<CopyMode::Copyable>& operator =(CallbackBase && c)74CallbackBase<CopyMode::Copyable>::operator=(CallbackBase&& c) { 75 *static_cast<CallbackBase<CopyMode::MoveOnly>*>(this) = std::move(c); 76 return *this; 77 } 78 79 template class CallbackBase<CopyMode::MoveOnly>; 80 template class CallbackBase<CopyMode::Copyable>; 81 82 } // namespace internal 83 } // namespace base 84