/* * Copyright (c) 2022, Tim Schumacher * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { template class MaybeOwned { AK_MAKE_NONCOPYABLE(MaybeOwned); public: template U> MaybeOwned(NonnullOwnPtr handle) : m_handle(adopt_own(*handle.leak_ptr())) { } // This is made `explicit` to not accidentally create a non-owning MaybeOwned, // which may not always be intended. explicit MaybeOwned(T& handle) : m_handle(&handle) { } MaybeOwned(MaybeOwned&&) = default; MaybeOwned& operator=(MaybeOwned&&) = default; T* ptr() { if (m_handle.template has()) return m_handle.template get(); else return m_handle.template get>(); } T const* ptr() const { if (m_handle.template has()) return m_handle.template get(); else return m_handle.template get>(); } T* operator->() { return ptr(); } T const* operator->() const { return ptr(); } T& operator*() { return *ptr(); } T const& operator*() const { return *ptr(); } private: Variant, T*> m_handle; }; } #if USING_AK_GLOBALLY using AK::MaybeOwned; #endif