/* **************************************************************************** */ /* */ /* ::: :::::::: */ /* weak_ptr.ipp :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/01/20 12:58:44 by maldavid #+# #+# */ /* Updated: 2024/01/20 12:58:44 by maldavid ### ########.fr */ /* */ /* **************************************************************************** */ namespace unstd { template WeakPtr::WeakPtr() : _ref(NULL), _ptr(NULL) {} template WeakPtr::WeakPtr(const WeakPtr& rhs) : _ref(rhs._ref), _ptr(rhs._ptr) { if(_ptr && _ref) _ref->weak++; } template WeakPtr::WeakPtr(const SharedPtr& shared) : _ref(shared._ref), _ptr(shared._ptr) { if(_ptr && _ref) _ref->weak++; } template WeakPtr& WeakPtr::operator=(const WeakPtr& rhs) { if(_ptr == rhs._ptr) return *this; safeRelease(); _ptr = rhs._ptr; _ref = rhs._ref; return *this; } template WeakPtr& WeakPtr::operator=(const SharedPtr& shared) { if(_ptr == shared._ptr) return *this; safeRelease(); _ptr = shared._ptr; _ref = shared._ref; _ref->weak++; return *this; } template void WeakPtr::reset() { safeRelease(); _ptr = NULL; _ref = NULL; } template void WeakPtr::swap(WeakPtr& rhs) { T* tmptr = _ptr; bits::RefCount* tmpref = _ref; _ptr = rhs._ptr; _ref = rhs._ref; rhs._ptr = tmptr; rhs._ref = tmpref; } template bool WeakPtr::expired() const { return (_ptr && _ref && _ref->shared > 0); } template SharedPtr WeakPtr::lock() const { return (expired() ? SharedPtr() : SharedPtr(_ptr)); } template void WeakPtr::safeRelease() { if(_ref == NULL) return; _ref->weak--; if(_ref && _ref->shared <= 0) { delete _ptr; _ptr = NULL; delete _ref; _ref = NULL; } } template WeakPtr::~WeakPtr() { if(_ptr && _ref && _ref->shared > 0) safeRelease(); } }