/* */ #include "SharedHandle.h" namespace aria2 { SharedCount::SharedCount():refCount_(new RefCount()) {} SharedCount::SharedCount(const SharedCount& s):refCount_(s.refCount_) { refCount_->addRefCount(); } SharedCount::~SharedCount() { refCount_->releaseRefCount(); if(refCount_->getWeakRefCount() == 0) { delete refCount_; } } bool SharedCount::reassign(const SharedCount& s) { s.refCount_->addRefCount(); refCount_->releaseRefCount(); if(refCount_->getWeakRefCount() == 0) { delete refCount_; refCount_ = s.refCount_; return true; } size_t thisCount = refCount_->getStrongRefCount(); refCount_ = s.refCount_; return thisCount == 0; } void SharedCount::swap(SharedCount& r) { std::swap(refCount_, r.refCount_); } WeakCount::WeakCount(const WeakRef& t):refCount_(new RefCount(t)) {} WeakCount::WeakCount(const StrongRef& t):refCount_(new RefCount()) {} WeakCount::WeakCount(const WeakCount& w):refCount_(w.refCount_) { refCount_->addWeakRefCount(); } WeakCount::WeakCount(const SharedCount& s):refCount_(s.refCount_) { refCount_->addWeakRefCount(); } WeakCount::~WeakCount() { refCount_->releaseWeakRefCount(); if(refCount_->getWeakRefCount() == 0) { delete refCount_; } } bool WeakCount::reassign(const SharedCount& s) { s.refCount_->addWeakRefCount(); refCount_->releaseWeakRefCount(); if(refCount_->getWeakRefCount() == 0) { delete refCount_; refCount_ = s.refCount_; return true; } refCount_ = s.refCount_; return false; } bool WeakCount::reassign(const WeakCount& s) { s.refCount_->addWeakRefCount(); refCount_->releaseWeakRefCount(); if(refCount_->getWeakRefCount() == 0) { delete refCount_; refCount_ = s.refCount_; return true; } refCount_ = s.refCount_; return false; } } // namespace aria2