#pragma once #include "Weakable.h" namespace AK { template class WeakPtr { friend class Weakable; public: WeakPtr() { } WeakPtr(std::nullptr_t) { } operator bool() const { return ptr(); } T* ptr() { return m_link ? m_link->ptr() : nullptr; } const T* ptr() const { return m_link ? m_link->ptr() : nullptr; } bool isNull() const { return !m_link || !m_link->ptr(); } private: WeakPtr(RetainPtr>&& link) : m_link(std::move(link)) { } RetainPtr> m_link; }; template inline WeakPtr Weakable::makeWeakPtr() { if (!m_link) m_link = adopt(*new WeakLink(*this)); return WeakPtr(m_link.copyRef()); } } using AK::WeakPtr;