// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/nekernel-org/nekernel #ifndef _NEKIT_REF_H_ #define _NEKIT_REF_H_ #include #include #include #include #include #include namespace Kernel { /// @brief Reference wrapper class. template class Ref final { public: Ref() = default; ~Ref() = default; public: using Type = T; using ConstType = const T&; using RefType = T&; Ref(Type cls) : fClass(cls) {} Ref& operator=(nullPtr) { return *this; } Ref& operator=(Type* ref) { fClass = *ref; return *this; } Ref& operator=(Type ref) { fClass = ref; return *this; } NE_COPY_DEFAULT(Ref) public: Type operator->() const { return fClass; } Type& Leak() { return fClass; } Type& TryLeak() { MUST_PASS(fClass); return fClass; } Type operator*() { return fClass; } explicit operator bool() { if constexpr (IsVettable) { return Type::kVettable; } else { return false; } } private: Type fClass; }; /// @brief Non Nullable Reference class. template class NonNullRef final { public: using RefType = Ref; using Type = T; NonNullRef() = delete; NonNullRef(Type* ref) : fRef(ref) {} NonNullRef(nullPtr ref) = delete; NonNullRef(RefType ref) : fRef(ref) {} Ref& operator->() { MUST_PASS(fRef); return fRef; } NonNullRef& operator=(const NonNullRef& ref) = delete; NonNullRef(const NonNullRef& ref) = delete; private: Ref fRef{}; }; using RefAny = Ref; using NonNullRefAny = NonNullRef; } // namespace Kernel #endif // ifndef _NEKIT_REF_H_