diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h index e02d1479ce..e56b63cae2 100644 --- a/Userland/Libraries/LibCore/Stream.h +++ b/Userland/Libraries/LibCore/Stream.h @@ -24,6 +24,48 @@ namespace Core::Stream { +template T> +class Handle { +public: + template U> + Handle(NonnullOwnPtr handle) + : m_handle(adopt_own(*handle.leak_ptr())) + { + } + + // This is made `explicit` to not accidentally create a non-owning Handle, + // which may not always be intended. + explicit Handle(T& handle) + : m_handle(&handle) + { + } + + 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; +}; + /// The base, abstract class for stream operations. This class defines the /// operations one can perform on every stream in LibCore. class Stream {