From b7d967361d440000025138e643bbf4744e7f34cf Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 15 Jun 2015 04:22:01 +0300 Subject: [PATCH] vm::ptr conversion operator fixed --- Utilities/BEType.h | 2 +- rpcs3/Emu/Memory/vm_ptr.h | 41 ++++++++++++++++++++++++--------------- rpcs3/Emu/Memory/vm_ref.h | 14 ++++++------- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/Utilities/BEType.h b/Utilities/BEType.h index 274d7d7e0a..1413ddd7d6 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -695,7 +695,7 @@ public: return *this; } - //template operator std::enable_if_t::value, CT>() const + //template::value>> operator CT() const //{ // return value(); //} diff --git a/rpcs3/Emu/Memory/vm_ptr.h b/rpcs3/Emu/Memory/vm_ptr.h index dfa1797f72..63b7dfd455 100644 --- a/rpcs3/Emu/Memory/vm_ptr.h +++ b/rpcs3/Emu/Memory/vm_ptr.h @@ -45,17 +45,15 @@ namespace vm return get_ptr(); } - template std::add_lvalue_reference_t operator [](u32 index) const + std::add_lvalue_reference_t operator [](u32 index) const { + static_assert(!std::is_void::value, "vm::_ptr_base<> error: operator[] is not available for void pointers"); + return vm::get_ref(vm::cast(m_addr + sizeof32(T) * index)); } - template operator _ptr_base() const - { - return{ convert_le_be(vm::cast(m_addr)) }; - } - - template operator std::enable_if_t::value, _ptr_base>() const + // enable only the conversions which are originally possible between pointer types + template::value>> operator _ptr_base() const { return{ convert_le_be(vm::cast(m_addr)) }; } @@ -69,6 +67,8 @@ namespace vm { return m_addr != 0; } + + _ptr_base& operator =(const _ptr_base&) = default; }; template @@ -123,6 +123,8 @@ namespace vm { return m_addr != 0; } + + _ptr_base& operator =(const _ptr_base&) = default; }; template @@ -201,16 +203,21 @@ namespace vm std::is_void::value || std::is_same, std::remove_cv_t>::value, RT>; + + // helper SFINAE type for vm::_ptr_base pointer arithmetic operators and indirection (disabled for void and function pointers) + template using if_arithmetical_t = std::enable_if_t< + !std::is_void::value && !std::is_function::value, + RT>; } // indirection operator for vm::_ptr_base -template std::enable_if_t::value, T&> operator *(const vm::_ptr_base& ptr) +template vm::if_arithmetical_t operator *(const vm::_ptr_base& ptr) { return vm::get_ref(vm::cast(ptr.m_addr)); } // postfix increment operator for vm::_ptr_base -template std::enable_if_t::value, vm::_ptr_base> operator ++(vm::_ptr_base& ptr, int) +template vm::if_arithmetical_t> operator ++(vm::_ptr_base& ptr, int) { const AT result = ptr.m_addr; ptr.m_addr += sizeof32(T); @@ -218,14 +225,14 @@ template std::enable_if_t::value, vm:: } // prefix increment operator for vm::_ptr_base -template std::enable_if_t::value, vm::_ptr_base&> operator ++(vm::_ptr_base& ptr) +template vm::if_arithmetical_t&> operator ++(vm::_ptr_base& ptr) { ptr.m_addr += sizeof32(T); return ptr; } // postfix decrement operator for vm::_ptr_base -template std::enable_if_t::value, vm::_ptr_base> operator --(vm::_ptr_base& ptr, int) +template vm::if_arithmetical_t> operator --(vm::_ptr_base& ptr, int) { const AT result = ptr.m_addr; ptr.m_addr -= sizeof32(T); @@ -233,34 +240,34 @@ template std::enable_if_t::value, vm:: } // prefix decrement operator for vm::_ptr_base -template std::enable_if_t::value, vm::_ptr_base&> operator --(vm::_ptr_base& ptr) +template vm::if_arithmetical_t&> operator --(vm::_ptr_base& ptr) { ptr.m_addr -= sizeof32(T); return ptr; } // addition assignment operator for vm::_ptr_base (pointer += integer) -template std::enable_if_t::value, vm::_ptr_base&> operator +=(vm::_ptr_base& ptr, to_ne_t count) +template vm::if_arithmetical_t&> operator +=(vm::_ptr_base& ptr, to_ne_t count) { ptr.m_addr += count * sizeof32(T); return ptr; } // subtraction assignment operator for vm::_ptr_base (pointer -= integer) -template std::enable_if_t::value, vm::_ptr_base&> operator -=(vm::_ptr_base& ptr, to_ne_t count) +template vm::if_arithmetical_t&> operator -=(vm::_ptr_base& ptr, to_ne_t count) { ptr.m_addr -= count * sizeof32(T); return ptr; } // addition operator for vm::_ptr_base (pointer + integer) -template std::enable_if_t::value, vm::_ptr_base> operator +(const vm::_ptr_base& ptr, to_ne_t count) +template vm::if_arithmetical_t> operator +(const vm::_ptr_base& ptr, to_ne_t count) { return{ convert_le_be(ptr.m_addr + count * sizeof32(T)) }; } // subtraction operator for vm::_ptr_base (pointer - integer) -template std::enable_if_t::value, vm::_ptr_base> operator -(const vm::_ptr_base& ptr, to_ne_t count) +template vm::if_arithmetical_t> operator -(const vm::_ptr_base& ptr, to_ne_t count) { return{ convert_le_be(ptr.m_addr - count * sizeof32(T)) }; } @@ -269,6 +276,8 @@ template std::enable_if_t::value, vm:: template std::enable_if_t< !std::is_void::value && !std::is_void::value && + !std::is_function::value && + !std::is_function::value && std::is_same, std::remove_cv_t>::value, u32> operator -(const vm::_ptr_base& left, const vm::_ptr_base& right) { diff --git a/rpcs3/Emu/Memory/vm_ref.h b/rpcs3/Emu/Memory/vm_ref.h index 2aa453a2b6..a9ef324903 100644 --- a/rpcs3/Emu/Memory/vm_ref.h +++ b/rpcs3/Emu/Memory/vm_ref.h @@ -32,23 +32,21 @@ namespace vm return vm::priv_ref(vm::cast(m_addr)); } - // conversion operator - //template operator std::enable_if_t::value, CT>() + // TODO: conversion operator (seems hard to define it correctly) + //template::value || std::is_convertible, CT>::value>> operator CT() const //{ // return get_ref(); //} - // temporarily, because SFINAE doesn't work for some reason: - operator to_ne_t() const { return get_ref(); } - operator T() const - { - return get_ref(); - } + //operator T() const + //{ + // return get_ref(); + //} // copy assignment operator _ref_base& operator =(const _ref_base& right)