xref: /third_party/gn/src/base/memory/weak_ptr.cc (revision 6d528ed9)
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
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/memory/weak_ptr.h"
6
7namespace base {
8namespace internal {
9
10WeakReference::Flag::Flag() : is_valid_(true) {}
11
12void WeakReference::Flag::Invalidate() {
13  is_valid_ = false;
14}
15
16bool WeakReference::Flag::IsValid() const {
17  return is_valid_;
18}
19
20WeakReference::Flag::~Flag() = default;
21
22WeakReference::WeakReference() = default;
23
24WeakReference::WeakReference(const scoped_refptr<Flag>& flag) : flag_(flag) {}
25
26WeakReference::~WeakReference() = default;
27
28WeakReference::WeakReference(WeakReference&& other) = default;
29
30WeakReference::WeakReference(const WeakReference& other) = default;
31
32bool WeakReference::is_valid() const {
33  return flag_ && flag_->IsValid();
34}
35
36WeakReferenceOwner::WeakReferenceOwner() = default;
37
38WeakReferenceOwner::~WeakReferenceOwner() {
39  Invalidate();
40}
41
42WeakReference WeakReferenceOwner::GetRef() const {
43  // If we hold the last reference to the Flag then create a new one.
44  if (!HasRefs())
45    flag_ = new WeakReference::Flag();
46
47  return WeakReference(flag_);
48}
49
50void WeakReferenceOwner::Invalidate() {
51  if (flag_) {
52    flag_->Invalidate();
53    flag_ = nullptr;
54  }
55}
56
57WeakPtrBase::WeakPtrBase() : ptr_(0) {}
58
59WeakPtrBase::~WeakPtrBase() = default;
60
61WeakPtrBase::WeakPtrBase(const WeakReference& ref, uintptr_t ptr)
62    : ref_(ref), ptr_(ptr) {
63  DCHECK(ptr_);
64}
65
66WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) {
67  DCHECK(ptr_);
68}
69
70WeakPtrFactoryBase::~WeakPtrFactoryBase() {
71  ptr_ = 0;
72}
73
74}  // namespace internal
75}  // namespace base
76