#ifndef ARBUTILS_NONNULLOWNPTR_HPP #define ARBUTILS_NONNULLOWNPTR_HPP #include "OwnPtr.hpp" #include "../Assert.hpp" #include "NonNullBorrowedPtr.hpp" namespace Arbutils::Memory { template class NonNullOwnPtr{ T* _ptr; public: inline explicit NonNullOwnPtr(T* ptr) : _ptr(ptr){ AssertNotNull(ptr); }; NonNullOwnPtr(const NonNullOwnPtr&) = delete; NonNullOwnPtr& operator=(OwnPtr const&) = delete; inline ~NonNullOwnPtr() noexcept { delete _ptr; } inline constexpr T* GetUnsafe() noexcept { return _ptr; } inline constexpr const T* GetUnsafe() const noexcept { return _ptr; } inline NonNullBorrowedPtr Borrow(){ return NonNullBorrowedPtr(_ptr); } T* operator->() noexcept { return _ptr; } const T* operator->() const noexcept { return _ptr; } }; } #endif // ARBUTILS_NONNULLOWNPTR_HPP