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