/* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. ------------------------------------------- */ #ifndef _NEWKIT_REF_H_ #define _NEWKIT_REF_H_ #include #include #include namespace Kernel { template class Ref final { public: Ref() = default; ~Ref() { if (mm_is_valid_ptr(fClass)) delete fClass; } public: Ref(T* cls) : fClass(cls) {} Ref(T cls) : fClass(nullptr) { fClass = &cls; } Ref& operator=(T ref) { fClass = &ref; return *this; } public: T operator->() const { MUST_PASS(*fClass); return *fClass; } T& Leak() noexcept { return *fClass; } T& TryLeak() const noexcept { MUST_PASS(*fClass); return *fClass; } T operator*() { return *fClass; } operator bool() noexcept { return fClass; } private: T* fClass{nullptr}; }; template class NonNullRef final { public: NonNullRef() = delete; NonNullRef(nullPtr) = delete; NonNullRef(T* ref) : fRef(ref) { MUST_PASS(ref); } Ref& operator->() { MUST_PASS(fRef); return fRef; } NonNullRef& operator=(const NonNullRef& ref) = delete; NonNullRef(const NonNullRef& ref) = default; private: Ref fRef{nullptr}; }; } // namespace Kernel #endif // ifndef _NEWKIT_REF_H_