OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/callback_internal.h" | 5 #include "base/callback_internal.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 | 8 |
9 namespace base { | 9 namespace base { |
10 namespace internal { | 10 namespace internal { |
11 | 11 |
12 void BindStateBase::AddRef() { | 12 void BindStateBase::AddRef() { |
13 AtomicRefCountInc(&ref_count_); | 13 AtomicRefCountInc(&ref_count_); |
14 } | 14 } |
15 | 15 |
16 void BindStateBase::Release() { | 16 void BindStateBase::Release() { |
17 if (!AtomicRefCountDec(&ref_count_)) | 17 if (!AtomicRefCountDec(&ref_count_)) |
18 destructor_(this); | 18 destructor_(this); |
19 } | 19 } |
20 | 20 |
21 CallbackBase::CallbackBase(const CallbackBase& c) = default; | 21 CallbackBase<CopyMode::MoveOnly>::CallbackBase(CallbackBase&& c) |
22 CallbackBase& CallbackBase::operator=(const CallbackBase& c) = default; | 22 : bind_state_(std::move(c.bind_state_)), |
| 23 polymorphic_invoke_(c.polymorphic_invoke_) { |
| 24 c.polymorphic_invoke_ = nullptr; |
| 25 } |
23 | 26 |
24 void CallbackBase::Reset() { | 27 CallbackBase<CopyMode::MoveOnly>& |
25 polymorphic_invoke_ = NULL; | 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; |
26 // NULL the bind_state_ last, since it may be holding the last ref to whatever | 37 // NULL the bind_state_ last, since it may be holding the last ref to whatever |
27 // object owns us, and we may be deleted after that. | 38 // object owns us, and we may be deleted after that. |
28 bind_state_ = NULL; | 39 bind_state_ = nullptr; |
29 } | 40 } |
30 | 41 |
31 bool CallbackBase::Equals(const CallbackBase& other) const { | 42 bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal( |
| 43 const CallbackBase& other) const { |
32 return bind_state_.get() == other.bind_state_.get() && | 44 return bind_state_.get() == other.bind_state_.get() && |
33 polymorphic_invoke_ == other.polymorphic_invoke_; | 45 polymorphic_invoke_ == other.polymorphic_invoke_; |
34 } | 46 } |
35 | 47 |
36 CallbackBase::CallbackBase(BindStateBase* bind_state) | 48 CallbackBase<CopyMode::MoveOnly>::CallbackBase( |
37 : bind_state_(bind_state), | 49 BindStateBase* bind_state) |
38 polymorphic_invoke_(NULL) { | 50 : bind_state_(bind_state) { |
39 DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1); | 51 DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1); |
40 } | 52 } |
41 | 53 |
42 CallbackBase::~CallbackBase() { | 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_; |
43 } | 61 } |
44 | 62 |
| 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 |
45 } // namespace internal | 82 } // namespace internal |
46 } // namespace base | 83 } // namespace base |
OLD | NEW |