blob: 4c8ccae932df1d2e9239903d67fae1745e5b7c1f [file] [log] [blame]
[email protected]0f450362012-06-09 02:11:011// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]59eff912011-02-18 23:29:312// 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]e24f8762011-12-20 00:10:047#include "base/logging.h"
8
[email protected]59eff912011-02-18 23:29:319namespace base {
10namespace internal {
11
taptede7e804c2015-05-14 08:03:3212void BindStateBase::AddRef() {
13 AtomicRefCountInc(&ref_count_);
14}
15
16void BindStateBase::Release() {
17 if (!AtomicRefCountDec(&ref_count_))
18 destructor_(this);
19}
20
tzik77d411392016-03-09 09:47:0321CallbackBase<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]59eff912011-02-18 23:29:3125}
26
tzik77d411392016-03-09 09:47:0327CallbackBase<CopyMode::MoveOnly>&
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
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
42bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal(
43 const CallbackBase& other) const {
[email protected]7296f2762011-11-21 19:23:4444 return bind_state_.get() == other.bind_state_.get() &&
[email protected]59eff912011-02-18 23:29:3145 polymorphic_invoke_ == other.polymorphic_invoke_;
46}
47
tzik77d411392016-03-09 09:47:0348CallbackBase<CopyMode::MoveOnly>::CallbackBase(
49 BindStateBase* bind_state)
50 : bind_state_(bind_state) {
taptede7e804c2015-05-14 08:03:3251 DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1);
[email protected]59eff912011-02-18 23:29:3152}
53
tzik77d411392016-03-09 09:47:0354CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {}
55
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_;
[email protected]59eff912011-02-18 23:29:3161}
62
tzik77d411392016-03-09 09:47:0363CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c)
64 : CallbackBase<CopyMode::MoveOnly>(std::move(c)) {}
65
66CallbackBase<CopyMode::Copyable>&
67CallbackBase<CopyMode::Copyable>::operator=(const CallbackBase& c) {
68 bind_state_ = c.bind_state_;
69 polymorphic_invoke_ = c.polymorphic_invoke_;
70 return *this;
71}
72
73CallbackBase<CopyMode::Copyable>&
74CallbackBase<CopyMode::Copyable>::operator=(CallbackBase&& c) {
75 *static_cast<CallbackBase<CopyMode::MoveOnly>*>(this) = std::move(c);
76 return *this;
77}
78
79template class CallbackBase<CopyMode::MoveOnly>;
80template class CallbackBase<CopyMode::Copyable>;
81
[email protected]59eff912011-02-18 23:29:3182} // namespace internal
[email protected]0f450362012-06-09 02:11:0183} // namespace base