xref: /aosp_15_r20/external/libchrome/base/callback_internal.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/callback_internal.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker namespace base {
10*635a8641SAndroid Build Coastguard Worker namespace internal {
11*635a8641SAndroid Build Coastguard Worker 
12*635a8641SAndroid Build Coastguard Worker namespace {
13*635a8641SAndroid Build Coastguard Worker 
ReturnFalse(const BindStateBase *)14*635a8641SAndroid Build Coastguard Worker bool ReturnFalse(const BindStateBase*) {
15*635a8641SAndroid Build Coastguard Worker   return false;
16*635a8641SAndroid Build Coastguard Worker }
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker }  // namespace
19*635a8641SAndroid Build Coastguard Worker 
Destruct(const BindStateBase * bind_state)20*635a8641SAndroid Build Coastguard Worker void BindStateBaseRefCountTraits::Destruct(const BindStateBase* bind_state) {
21*635a8641SAndroid Build Coastguard Worker   bind_state->destructor_(bind_state);
22*635a8641SAndroid Build Coastguard Worker }
23*635a8641SAndroid Build Coastguard Worker 
BindStateBase(InvokeFuncStorage polymorphic_invoke,void (* destructor)(const BindStateBase *))24*635a8641SAndroid Build Coastguard Worker BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
25*635a8641SAndroid Build Coastguard Worker                              void (*destructor)(const BindStateBase*))
26*635a8641SAndroid Build Coastguard Worker     : BindStateBase(polymorphic_invoke, destructor, &ReturnFalse) {
27*635a8641SAndroid Build Coastguard Worker }
28*635a8641SAndroid Build Coastguard Worker 
BindStateBase(InvokeFuncStorage polymorphic_invoke,void (* destructor)(const BindStateBase *),bool (* is_cancelled)(const BindStateBase *))29*635a8641SAndroid Build Coastguard Worker BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke,
30*635a8641SAndroid Build Coastguard Worker                              void (*destructor)(const BindStateBase*),
31*635a8641SAndroid Build Coastguard Worker                              bool (*is_cancelled)(const BindStateBase*))
32*635a8641SAndroid Build Coastguard Worker     : polymorphic_invoke_(polymorphic_invoke),
33*635a8641SAndroid Build Coastguard Worker       destructor_(destructor),
34*635a8641SAndroid Build Coastguard Worker       is_cancelled_(is_cancelled) {}
35*635a8641SAndroid Build Coastguard Worker 
36*635a8641SAndroid Build Coastguard Worker CallbackBase& CallbackBase::operator=(CallbackBase&& c) noexcept = default;
CallbackBase(const CallbackBaseCopyable & c)37*635a8641SAndroid Build Coastguard Worker CallbackBase::CallbackBase(const CallbackBaseCopyable& c)
38*635a8641SAndroid Build Coastguard Worker     : bind_state_(c.bind_state_) {}
39*635a8641SAndroid Build Coastguard Worker 
operator =(const CallbackBaseCopyable & c)40*635a8641SAndroid Build Coastguard Worker CallbackBase& CallbackBase::operator=(const CallbackBaseCopyable& c) {
41*635a8641SAndroid Build Coastguard Worker   bind_state_ = c.bind_state_;
42*635a8641SAndroid Build Coastguard Worker   return *this;
43*635a8641SAndroid Build Coastguard Worker }
44*635a8641SAndroid Build Coastguard Worker 
CallbackBase(CallbackBaseCopyable && c)45*635a8641SAndroid Build Coastguard Worker CallbackBase::CallbackBase(CallbackBaseCopyable&& c) noexcept
46*635a8641SAndroid Build Coastguard Worker     : bind_state_(std::move(c.bind_state_)) {}
47*635a8641SAndroid Build Coastguard Worker 
operator =(CallbackBaseCopyable && c)48*635a8641SAndroid Build Coastguard Worker CallbackBase& CallbackBase::operator=(CallbackBaseCopyable&& c) noexcept {
49*635a8641SAndroid Build Coastguard Worker   bind_state_ = std::move(c.bind_state_);
50*635a8641SAndroid Build Coastguard Worker   return *this;
51*635a8641SAndroid Build Coastguard Worker }
52*635a8641SAndroid Build Coastguard Worker 
Reset()53*635a8641SAndroid Build Coastguard Worker void CallbackBase::Reset() {
54*635a8641SAndroid Build Coastguard Worker   // NULL the bind_state_ last, since it may be holding the last ref to whatever
55*635a8641SAndroid Build Coastguard Worker   // object owns us, and we may be deleted after that.
56*635a8641SAndroid Build Coastguard Worker   bind_state_ = nullptr;
57*635a8641SAndroid Build Coastguard Worker }
58*635a8641SAndroid Build Coastguard Worker 
IsCancelled() const59*635a8641SAndroid Build Coastguard Worker bool CallbackBase::IsCancelled() const {
60*635a8641SAndroid Build Coastguard Worker   DCHECK(bind_state_);
61*635a8641SAndroid Build Coastguard Worker   return bind_state_->IsCancelled();
62*635a8641SAndroid Build Coastguard Worker }
63*635a8641SAndroid Build Coastguard Worker 
EqualsInternal(const CallbackBase & other) const64*635a8641SAndroid Build Coastguard Worker bool CallbackBase::EqualsInternal(const CallbackBase& other) const {
65*635a8641SAndroid Build Coastguard Worker   return bind_state_ == other.bind_state_;
66*635a8641SAndroid Build Coastguard Worker }
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker CallbackBase::~CallbackBase() = default;
69*635a8641SAndroid Build Coastguard Worker 
CallbackBaseCopyable(const CallbackBaseCopyable & c)70*635a8641SAndroid Build Coastguard Worker CallbackBaseCopyable::CallbackBaseCopyable(const CallbackBaseCopyable& c) {
71*635a8641SAndroid Build Coastguard Worker   bind_state_ = c.bind_state_;
72*635a8641SAndroid Build Coastguard Worker }
73*635a8641SAndroid Build Coastguard Worker 
operator =(const CallbackBaseCopyable & c)74*635a8641SAndroid Build Coastguard Worker CallbackBaseCopyable& CallbackBaseCopyable::operator=(
75*635a8641SAndroid Build Coastguard Worker     const CallbackBaseCopyable& c) {
76*635a8641SAndroid Build Coastguard Worker   bind_state_ = c.bind_state_;
77*635a8641SAndroid Build Coastguard Worker   return *this;
78*635a8641SAndroid Build Coastguard Worker }
79*635a8641SAndroid Build Coastguard Worker 
80*635a8641SAndroid Build Coastguard Worker CallbackBaseCopyable& CallbackBaseCopyable::operator=(
81*635a8641SAndroid Build Coastguard Worker     CallbackBaseCopyable&& c) noexcept = default;
82*635a8641SAndroid Build Coastguard Worker 
83*635a8641SAndroid Build Coastguard Worker }  // namespace internal
84*635a8641SAndroid Build Coastguard Worker }  // namespace base
85