/* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, Leon Albrecht * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace AK { template class Ptr32 { public: constexpr Ptr32() = default; Ptr32(T* const ptr) : m_ptr((u32) reinterpret_cast(ptr)) { VERIFY((reinterpret_cast(ptr) & 0xFFFFFFFFULL) == static_cast(m_ptr)); } T& operator*() { return *static_cast(*this); } T const& operator*() const { return *static_cast(*this); } T* operator->() { return *this; } T const* operator->() const { return *this; } operator T*() { return reinterpret_cast(static_cast(m_ptr)); } operator T const*() const { return reinterpret_cast(static_cast(m_ptr)); } T& operator[](size_t index) { return static_cast(*this)[index]; } T const& operator[](size_t index) const { return static_cast(*this)[index]; } constexpr explicit operator bool() { return m_ptr; } template constexpr bool operator==(Ptr32 other) { return m_ptr == other.m_ptr; } constexpr Ptr32 operator+(u32 other) const { Ptr32 ptr {}; ptr.m_ptr = m_ptr + other; return ptr; } constexpr Ptr32 operator-(u32 other) const { Ptr32 ptr {}; ptr.m_ptr = m_ptr - other; return ptr; } private: u32 m_ptr { 0 }; }; } #if USING_AK_GLOBALLY using AK::Ptr32; #endif