diff --git a/rpcs3/Emu/Memory/atomic.h b/rpcs3/Emu/Memory/atomic.h index d9dd6e96db..b4436c3de9 100644 --- a/rpcs3/Emu/Memory/atomic.h +++ b/rpcs3/Emu/Memory/atomic.h @@ -197,11 +197,11 @@ public: } }; -__forceinline static u64 operator ++(_atomic_base>& left, int) +template inline static typename std::enable_if::value, T>::type operator ++(_atomic_base>& left, int) { - u64 result; + T result; - left.atomic_op([&result](be_t& value) + left.atomic_op([&result](be_t& value) { result = value++; }); @@ -209,7 +209,7 @@ __forceinline static u64 operator ++(_atomic_base>& left, int) return result; } -__forceinline static u64 operator --(_atomic_base>& left, int) +template inline static typename std::enable_if::value, T>::type operator --(_atomic_base>& left, int) { u64 result; @@ -221,11 +221,11 @@ __forceinline static u64 operator --(_atomic_base>& left, int) return result; } -__forceinline static u64 operator +=(_atomic_base>& left, u64 right) +template inline static typename std::enable_if::value, T>::type operator +=(_atomic_base>& left, T2 right) { - u64 result; + T result; - left.atomic_op([&result, right](be_t& value) + left.atomic_op([&result, right](be_t& value) { result = (value += right); }); @@ -233,6 +233,18 @@ __forceinline static u64 operator +=(_atomic_base>& left, u64 right) return result; } +template inline static typename std::enable_if::value, T>::type operator -=(_atomic_base>& left, T2 right) +{ + T result; + + left.atomic_op([&result, right](be_t& value) + { + result = (value -= right); + }); + + return result; +} + template using atomic_le_t = _atomic_base; template using atomic_be_t = _atomic_base::type>;