[email protected] | 0f45036 | 2012-06-09 02:11:01 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 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 | |
[email protected] | e24f876 | 2011-12-20 00:10:04 | [diff] [blame] | 7 | #include "base/logging.h" |
| 8 | |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 9 | namespace base { |
| 10 | namespace internal { |
| 11 | |
tapted | e7e804c | 2015-05-14 08:03:32 | [diff] [blame] | 12 | void BindStateBase::AddRef() { |
| 13 | AtomicRefCountInc(&ref_count_); |
| 14 | } |
| 15 | |
| 16 | void BindStateBase::Release() { |
| 17 | if (!AtomicRefCountDec(&ref_count_)) |
| 18 | destructor_(this); |
| 19 | } |
| 20 | |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame^] | 21 | CallbackBase<CopyMode::MoveOnly>::CallbackBase(CallbackBase&& c) |
| 22 | : bind_state_(std::move(c.bind_state_)), |
| 23 | polymorphic_invoke_(c.polymorphic_invoke_) { |
| 24 | c.polymorphic_invoke_ = nullptr; |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 25 | } |
| 26 | |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame^] | 27 | CallbackBase<CopyMode::MoveOnly>& |
| 28 | CallbackBase<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 | |
| 35 | void 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 | |
| 42 | bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal( |
| 43 | const CallbackBase& other) const { |
[email protected] | 7296f276 | 2011-11-21 19:23:44 | [diff] [blame] | 44 | return bind_state_.get() == other.bind_state_.get() && |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 45 | polymorphic_invoke_ == other.polymorphic_invoke_; |
| 46 | } |
| 47 | |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame^] | 48 | CallbackBase<CopyMode::MoveOnly>::CallbackBase( |
| 49 | BindStateBase* bind_state) |
| 50 | : bind_state_(bind_state) { |
tapted | e7e804c | 2015-05-14 08:03:32 | [diff] [blame] | 51 | DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1); |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 52 | } |
| 53 | |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame^] | 54 | CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {} |
| 55 | |
| 56 | CallbackBase<CopyMode::Copyable>::CallbackBase( |
| 57 | const CallbackBase& c) |
| 58 | : CallbackBase<CopyMode::MoveOnly>(nullptr) { |
| 59 | bind_state_ = c.bind_state_; |
| 60 | polymorphic_invoke_ = c.polymorphic_invoke_; |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 61 | } |
| 62 | |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame^] | 63 | CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c) |
| 64 | : CallbackBase<CopyMode::MoveOnly>(std::move(c)) {} |
| 65 | |
| 66 | CallbackBase<CopyMode::Copyable>& |
| 67 | CallbackBase<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>& |
| 74 | CallbackBase<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 | |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 82 | } // namespace internal |
[email protected] | 0f45036 | 2012-06-09 02:11:01 | [diff] [blame] | 83 | } // namespace base |