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 7 namespace base { 8 namespace internal { 9 Flag()10WeakReference::Flag::Flag() : is_valid_(true) {} 11 Invalidate()12void WeakReference::Flag::Invalidate() { 13 is_valid_ = false; 14 } 15 IsValid() const16bool WeakReference::Flag::IsValid() const { 17 return is_valid_; 18 } 19 20 WeakReference::Flag::~Flag() = default; 21 22 WeakReference::WeakReference() = default; 23 WeakReference(const scoped_refptr<Flag> & flag)24WeakReference::WeakReference(const scoped_refptr<Flag>& flag) : flag_(flag) {} 25 26 WeakReference::~WeakReference() = default; 27 28 WeakReference::WeakReference(WeakReference&& other) = default; 29 30 WeakReference::WeakReference(const WeakReference& other) = default; 31 is_valid() const32bool WeakReference::is_valid() const { 33 return flag_ && flag_->IsValid(); 34 } 35 36 WeakReferenceOwner::WeakReferenceOwner() = default; 37 ~WeakReferenceOwner()38WeakReferenceOwner::~WeakReferenceOwner() { 39 Invalidate(); 40 } 41 GetRef() const42WeakReference 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 Invalidate()50void WeakReferenceOwner::Invalidate() { 51 if (flag_) { 52 flag_->Invalidate(); 53 flag_ = nullptr; 54 } 55 } 56 WeakPtrBase()57WeakPtrBase::WeakPtrBase() : ptr_(0) {} 58 59 WeakPtrBase::~WeakPtrBase() = default; 60 WeakPtrBase(const WeakReference & ref,uintptr_t ptr)61WeakPtrBase::WeakPtrBase(const WeakReference& ref, uintptr_t ptr) 62 : ref_(ref), ptr_(ptr) { 63 DCHECK(ptr_); 64 } 65 WeakPtrFactoryBase(uintptr_t ptr)66WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) { 67 DCHECK(ptr_); 68 } 69 ~WeakPtrFactoryBase()70WeakPtrFactoryBase::~WeakPtrFactoryBase() { 71 ptr_ = 0; 72 } 73 74 } // namespace internal 75 } // namespace base 76