/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #ifdef KERNEL # include #endif namespace AK { template concept PointerTypeName = IsPointer; template class Userspace { public: Userspace() = default; // Disable default implementations that would use surprising integer promotion. bool operator==(Userspace const&) const = delete; bool operator<=(Userspace const&) const = delete; bool operator>=(Userspace const&) const = delete; bool operator<(Userspace const&) const = delete; bool operator>(Userspace const&) const = delete; #ifdef KERNEL Userspace(FlatPtr ptr) : m_ptr(ptr) { } explicit operator bool() const { return m_ptr != 0; } FlatPtr ptr() const { return m_ptr; } VirtualAddress vaddr() const { return VirtualAddress(m_ptr); } T unsafe_userspace_ptr() const { return reinterpret_cast(m_ptr); } #else Userspace(T ptr) : m_ptr(ptr) { } explicit operator bool() const { return m_ptr != nullptr; } T ptr() const { return m_ptr; } #endif private: #ifdef KERNEL FlatPtr m_ptr { 0 }; #else T m_ptr { nullptr }; #endif }; template inline Userspace static_ptr_cast(Userspace const& ptr) { #ifdef KERNEL auto casted_ptr = static_cast(ptr.unsafe_userspace_ptr()); #else auto casted_ptr = static_cast(ptr.ptr()); #endif return Userspace(reinterpret_cast(casted_ptr)); } } #if USING_AK_GLOBALLY using AK::static_ptr_cast; using AK::Userspace; #endif