From 6ffd71ffaefeb39066694eca9c4ea2cbea2a8dfd Mon Sep 17 00:00:00 2001 From: mitaclaw <140017135+mitaclaw@users.noreply.github.com> Date: Mon, 24 Jun 2024 00:05:46 -0700 Subject: [PATCH] BitUtils: Constexpr BitCastToArray, Remove BitCastFromArray `std::bit_cast` participates in overload resolution only if `sizeof(To) == sizeof(From)` and both `To` and `From` are *TriviallyCopyable* types, so the static assertions here can be removed. `[[nodiscard]]` was added as well. --- Source/Core/Common/BitUtils.h | 47 ++------------------- Source/Core/Core/HW/DSPHLE/UCodes/AX.h | 2 +- Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp | 4 +- 3 files changed, 7 insertions(+), 46 deletions(-) diff --git a/Source/Core/Common/BitUtils.h b/Source/Core/Common/BitUtils.h index b20baa20f2..8b1b196c24 100644 --- a/Source/Core/Common/BitUtils.h +++ b/Source/Core/Common/BitUtils.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include #include #include @@ -166,50 +167,10 @@ inline auto BitCastPtr(PtrType* ptr) noexcept -> BitCastPtrType } // Similar to BitCastPtr, but specifically for aliasing structs to arrays. -template > -inline auto BitCastToArray(const T& obj) noexcept -> Container +template +[[nodiscard]] constexpr auto BitCastToArray(const From& obj) noexcept { - static_assert(sizeof(T) % sizeof(ArrayType) == 0, - "Size of array type must be a factor of size of source type."); - static_assert(std::is_trivially_copyable(), - "BitCastToArray source type must be trivially copyable."); - static_assert(std::is_trivially_copyable(), - "BitCastToArray array type must be trivially copyable."); - - Container result; - std::memcpy(result.data(), &obj, sizeof(T)); - return result; -} - -template > -inline void BitCastFromArray(const Container& array, T& obj) noexcept -{ - static_assert(sizeof(T) % sizeof(ArrayType) == 0, - "Size of array type must be a factor of size of destination type."); - static_assert(std::is_trivially_copyable(), - "BitCastFromArray array type must be trivially copyable."); - static_assert(std::is_trivially_copyable(), - "BitCastFromArray destination type must be trivially copyable."); - - std::memcpy(&obj, array.data(), sizeof(T)); -} - -template > -inline auto BitCastFromArray(const Container& array) noexcept -> T -{ - static_assert(sizeof(T) % sizeof(ArrayType) == 0, - "Size of array type must be a factor of size of destination type."); - static_assert(std::is_trivially_copyable(), - "BitCastFromArray array type must be trivially copyable."); - static_assert(std::is_trivially_copyable(), - "BitCastFromArray destination type must be trivially copyable."); - - T obj; - std::memcpy(&obj, array.data(), sizeof(T)); - return obj; + return std::bit_cast>(obj); } template diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AX.h b/Source/Core/Core/HW/DSPHLE/UCodes/AX.h index a4d8cb05f4..108a98e351 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AX.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AX.h @@ -143,7 +143,7 @@ protected: pb_mem[update_off] = update_val; } - Common::BitCastFromArray(pb_mem, pb); + pb = std::bit_cast(pb_mem); } virtual void HandleCommandList(); diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp index 36cd154f9b..53be74371d 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/AXWii.cpp @@ -397,7 +397,7 @@ bool AXWiiUCode::ExtractUpdatesFields(AXPBWii& pb, u16* num_updates, u16* update // Remove the updates data from the PB memmove(&pb_mem[41], &pb_mem[46], sizeof(pb) - 2 * 46); - Common::BitCastFromArray(pb_mem, pb); + pb = std::bit_cast(pb_mem); return true; } @@ -416,7 +416,7 @@ void AXWiiUCode::ReinjectUpdatesFields(AXPBWii& pb, u16* num_updates, u32 update pb_mem[44] = updates_addr >> 16; pb_mem[45] = updates_addr & 0xFFFF; - Common::BitCastFromArray(pb_mem, pb); + pb = std::bit_cast(pb_mem); } void AXWiiUCode::ProcessPBList(u32 pb_addr)