/* * Copyright (c) 2024, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { template requires(!IsLvalueReference && !IsRvalueReference) class [[nodiscard]] NonnullRawPtr { public: using ValueType = T; NonnullRawPtr() = delete; NonnullRawPtr(T& other) : m_ptr(&other) { } NonnullRawPtr(NonnullRawPtr const& other) : m_ptr(other.m_ptr) { } NonnullRawPtr(NonnullRawPtr&& other) : m_ptr(other.m_ptr) { } NonnullRawPtr& operator=(NonnullRawPtr const& other) { m_ptr = other.m_ptr; return *this; } NonnullRawPtr& operator=(NonnullRawPtr&& other) { m_ptr = other.m_ptr; return *this; } operator bool() const = delete; bool operator!() const = delete; operator T&() { return *m_ptr; } operator T const&() const { return *m_ptr; } [[nodiscard]] ALWAYS_INLINE T& value() { return *m_ptr; } [[nodiscard]] ALWAYS_INLINE T const& value() const { return *m_ptr; } [[nodiscard]] ALWAYS_INLINE T& operator*() { return value(); } [[nodiscard]] ALWAYS_INLINE T const& operator*() const { return value(); } ALWAYS_INLINE RETURNS_NONNULL T* operator->() { return &value(); } ALWAYS_INLINE RETURNS_NONNULL T const* operator->() const { return &value(); } private: T* m_ptr; }; template struct Traits> : public DefaultTraits> { static unsigned hash(NonnullRawPtr const& handle) { return Traits::hash(handle); } }; namespace Detail { template inline constexpr bool IsHashCompatible, T> = true; template inline constexpr bool IsHashCompatible> = true; } } #if USING_AK_GLOBALLY using AK::NonnullRawPtr; #endif