#ifndef ARBUTILS_NONNULLOWNPTR_HPP #define ARBUTILS_NONNULLOWNPTR_HPP #include "../Assert.hpp" #include "NonNullBorrowedPtr.hpp" #include "BorrowedPtr.hpp" namespace Arbutils::Memory { template class NonNullOwnPtr { T* _ptr; public: inline NonNullOwnPtr(){}; inline NonNullOwnPtr(T* ptr) : _ptr(ptr) { AssertNotNull(ptr); }; NonNullOwnPtr(const NonNullOwnPtr&) = 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); } inline const NonNullBorrowedPtr Borrow() const { return NonNullBorrowedPtr(_ptr); } inline BorrowedPtr BorrowOptional() { return BorrowedPtr(_ptr); } inline const BorrowedPtr BorrowOptional() const { return BorrowedPtr(_ptr); } T* operator->() noexcept { return _ptr; } T* operator->() const noexcept { return _ptr; } inline bool operator==(const NonNullOwnPtr& rhs) const noexcept { return _ptr == rhs._ptr; } inline bool operator!=(const NonNullOwnPtr& rhs) const noexcept { return _ptr != rhs._ptr; } inline bool operator==(const T* rhs) const noexcept { return _ptr == rhs; } inline bool operator!=(const T* rhs) const noexcept { return _ptr != rhs; } }; } #endif // ARBUTILS_NONNULLOWNPTR_HPP