/* * ======================================================== * * HCore * Copyright Mahrouss Logic, all rights reserved. * * ======================================================== */ #pragma once #include #include #include namespace HCore { template class OwnPtr; template class NonNullRefPtr; template class OwnPtr final { public: OwnPtr() {} ~OwnPtr() { this->Delete(); } OwnPtr &operator=(const OwnPtr &) = default; OwnPtr(const OwnPtr &) = default; public: template bool New(Args &&...arg) { m_Cls = new T(arg...); return m_Cls; } void Delete() { if (m_Cls) delete m_Cls; m_Cls = nullptr; } T *operator->() const { return m_Cls; }; T *Raw() { return m_Cls; } Ref AsRef() { return Ref(m_Cls); } operator bool() { return m_Cls; } bool operator!() { return !m_Cls; } private: T *m_Cls; }; template OwnPtr make_ptr(Args... args) { OwnPtr ret; ret.template New(forward(args)...); MUST_PASS(ret); return ret; } } // namespace HCore