#ifndef TEACHOS_MEMORY_ASM_POINTER_HPP #define TEACHOS_MEMORY_ASM_POINTER_HPP namespace teachos::memory { /** * @brief A pointer that is defined in some assembly source file. * * @tparam Type The type of the pointer * @since 0.0.1 */ template struct asm_pointer { /** * @brief The type of the underlying pointer. */ using pointer = Type *; /** * @brief Construct a new asm_pointer for a given assembly-defined pointer. * @param pointer A pointer defined in assembly. */ constexpr asm_pointer(Type *& pointer) : m_pointer{&pointer} { } /** * @brief Access the underlying pointer. * @return The pointer wrapped by this asm_pointer. */ auto constexpr operator*() -> pointer & { return *m_pointer; } /** * @brief Access the underlying pointer. * @return The pointer wrapped by this asm_pointer. */ auto constexpr operator*() const -> pointer const & { return *m_pointer; } private: pointer * m_pointer; }; /** * @copydoc asm_pointer * * @note This specialization allows the use of this type for pointers to constant data. * @since 0.0.1 */ template struct asm_pointer { /** @copydoc asm_pointer::asm_pointer */ constexpr asm_pointer(Type const & pointer) : m_pointer{&pointer} { } /** @copydoc asm_pointer::operator*() */ auto constexpr operator*() -> Type const & { return *m_pointer; } /** @copydoc asm_pointer::operator*() const */ auto constexpr operator*() const -> Type const & { return *m_pointer; } private: Type const * m_pointer; }; } // namespace teachos::memory #endif