[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 | |||||
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 12 | namespace { |
13 | |||||
14 | bool ReturnFalse(const BindStateBase*) { | ||||
15 | return false; | ||||
16 | } | ||||
17 | |||||
18 | } // namespace | ||||
19 | |||||
tzik | 65adef8 | 2017-03-30 06:45:21 | [diff] [blame^] | 20 | void BindStateBaseRefCountTraits::Destruct(const BindStateBase* bind_state) { |
21 | bind_state->destructor_(bind_state); | ||||
22 | } | ||||
23 | |||||
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 24 | BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke, |
tzik | 30e0c31 | 2016-09-21 08:06:54 | [diff] [blame] | 25 | void (*destructor)(const BindStateBase*)) |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 26 | : BindStateBase(polymorphic_invoke, destructor, &ReturnFalse) { |
27 | } | ||||
28 | |||||
tzik | f1b37772 | 2016-09-08 06:58:07 | [diff] [blame] | 29 | BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke, |
tzik | 30e0c31 | 2016-09-21 08:06:54 | [diff] [blame] | 30 | void (*destructor)(const BindStateBase*), |
tzik | 59aa6bb1 | 2016-09-08 10:58:53 | [diff] [blame] | 31 | bool (*is_cancelled)(const BindStateBase*)) |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 32 | : polymorphic_invoke_(polymorphic_invoke), |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 33 | destructor_(destructor), |
34 | is_cancelled_(is_cancelled) {} | ||||
tzik | f1b37772 | 2016-09-08 06:58:07 | [diff] [blame] | 35 | |
tzik | 9edfd1de | 2016-07-20 12:56:45 | [diff] [blame] | 36 | CallbackBase<CopyMode::MoveOnly>::CallbackBase(CallbackBase&& c) = default; |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 37 | |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 38 | CallbackBase<CopyMode::MoveOnly>& |
tzik | 9edfd1de | 2016-07-20 12:56:45 | [diff] [blame] | 39 | CallbackBase<CopyMode::MoveOnly>::operator=(CallbackBase&& c) = default; |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 40 | |
tzik | 27d1e31 | 2016-09-13 05:28:59 | [diff] [blame] | 41 | CallbackBase<CopyMode::MoveOnly>::CallbackBase( |
42 | const CallbackBase<CopyMode::Copyable>& c) | ||||
43 | : bind_state_(c.bind_state_) {} | ||||
44 | |||||
45 | CallbackBase<CopyMode::MoveOnly>& CallbackBase<CopyMode::MoveOnly>::operator=( | ||||
46 | const CallbackBase<CopyMode::Copyable>& c) { | ||||
47 | bind_state_ = c.bind_state_; | ||||
48 | return *this; | ||||
49 | } | ||||
50 | |||||
tzik | f44c2f8d | 2017-03-08 08:41:15 | [diff] [blame] | 51 | CallbackBase<CopyMode::MoveOnly>::CallbackBase( |
52 | CallbackBase<CopyMode::Copyable>&& c) | ||||
53 | : bind_state_(std::move(c.bind_state_)) {} | ||||
54 | |||||
55 | CallbackBase<CopyMode::MoveOnly>& CallbackBase<CopyMode::MoveOnly>::operator=( | ||||
56 | CallbackBase<CopyMode::Copyable>&& c) { | ||||
57 | bind_state_ = std::move(c.bind_state_); | ||||
58 | return *this; | ||||
59 | } | ||||
60 | |||||
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 61 | void CallbackBase<CopyMode::MoveOnly>::Reset() { |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 62 | // NULL the bind_state_ last, since it may be holding the last ref to whatever |
63 | // object owns us, and we may be deleted after that. | ||||
64 | bind_state_ = nullptr; | ||||
65 | } | ||||
66 | |||||
tzik | 59aa6bb1 | 2016-09-08 10:58:53 | [diff] [blame] | 67 | bool CallbackBase<CopyMode::MoveOnly>::IsCancelled() const { |
68 | DCHECK(bind_state_); | ||||
69 | return bind_state_->IsCancelled(); | ||||
70 | } | ||||
71 | |||||
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 72 | bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal( |
73 | const CallbackBase& other) const { | ||||
tzik | 1886c27 | 2016-09-08 05:45:38 | [diff] [blame] | 74 | return bind_state_ == other.bind_state_; |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 75 | } |
76 | |||||
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 77 | CallbackBase<CopyMode::MoveOnly>::CallbackBase( |
78 | BindStateBase* bind_state) | ||||
79 | : bind_state_(bind_state) { | ||||
tzik | 65adef8 | 2017-03-30 06:45:21 | [diff] [blame^] | 80 | DCHECK(!bind_state_.get() || bind_state_->HasOneRef()); |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 81 | } |
82 | |||||
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 83 | CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {} |
84 | |||||
85 | CallbackBase<CopyMode::Copyable>::CallbackBase( | ||||
86 | const CallbackBase& c) | ||||
87 | : CallbackBase<CopyMode::MoveOnly>(nullptr) { | ||||
88 | bind_state_ = c.bind_state_; | ||||
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 89 | } |
90 | |||||
tzik | 9edfd1de | 2016-07-20 12:56:45 | [diff] [blame] | 91 | CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c) = default; |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 92 | |
93 | CallbackBase<CopyMode::Copyable>& | ||||
94 | CallbackBase<CopyMode::Copyable>::operator=(const CallbackBase& c) { | ||||
95 | bind_state_ = c.bind_state_; | ||||
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 96 | return *this; |
97 | } | ||||
98 | |||||
99 | CallbackBase<CopyMode::Copyable>& | ||||
tzik | 9edfd1de | 2016-07-20 12:56:45 | [diff] [blame] | 100 | CallbackBase<CopyMode::Copyable>::operator=(CallbackBase&& c) = default; |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 101 | |
102 | template class CallbackBase<CopyMode::MoveOnly>; | ||||
103 | template class CallbackBase<CopyMode::Copyable>; | ||||
104 | |||||
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 105 | } // namespace internal |
[email protected] | 0f45036 | 2012-06-09 02:11:01 | [diff] [blame] | 106 | } // namespace base |