diff --git a/Libraries/LibCore/ObjectPtr.h b/Libraries/LibCore/ObjectPtr.h new file mode 100644 index 0000000000..1c4942da82 --- /dev/null +++ b/Libraries/LibCore/ObjectPtr.h @@ -0,0 +1,53 @@ +#pragma once + +#include + +// This is a stopgap pointer. It's not meant to stick around forever. + +template +class ObjectPtr { +public: + ObjectPtr() {} + ObjectPtr(T* ptr) : m_ptr(ptr) {} + ~ObjectPtr() + { + if (m_ptr && !m_ptr->parent()) + delete m_ptr; + } + + ObjectPtr(const ObjectPtr& other) + : m_ptr(other.m_ptr) + { + } + + ObjectPtr(ObjectPtr&& other) + { + m_ptr = exchange(other.m_ptr, nullptr); + } + + ObjectPtr& operator=(const ObjectPtr& other) + { + m_ptr = other.m_ptr; + return *this; + } + + ObjectPtr& operator=(ObjectPtr&& other) + { + if (this != &other) { + m_ptr = exchange(other.m_ptr, nullptr); + } + return *this; + } + + T* operator->() { return m_ptr; } + const T* operator->() const { return m_ptr; } + + operator T*() { return m_ptr; } + operator const T*() const { return m_ptr; } + + T& operator*() { return *m_ptr; } + const T& operator*() const { return *m_ptr; } + +private: + T* m_ptr { nullptr }; +};