From b3292298c976279765926c9927f2e4cfe38b3ede Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 10 May 2018 09:54:35 -0400 Subject: BitUtils: Add C++14/C++17 compatible equivalent of std::bit_cast from C++2a Given bit conversions between types are quite common in emulation (particularly when it comes to floating-point among other things) it makes sense to provide a utility function that keeps all the boilerplate contained; especially considering it makes it harder to accidentally misuse std::memcpy (such as accidentally transposing arguments, etc). Another benefit of this function is that it doesn't require separating declarations from assignments, allowing variables to be declared const. This makes the scenario of of uninitialized variables being used less likely to occur. --- Source/UnitTests/Common/BitUtilsTest.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'Source/UnitTests/Common/BitUtilsTest.cpp') diff --git a/Source/UnitTests/Common/BitUtilsTest.cpp b/Source/UnitTests/Common/BitUtilsTest.cpp index 4785f9dcef..e847e908bd 100644 --- a/Source/UnitTests/Common/BitUtilsTest.cpp +++ b/Source/UnitTests/Common/BitUtilsTest.cpp @@ -127,3 +127,16 @@ TEST(BitUtils, IsValidLowMask) EXPECT_FALSE(Common::IsValidLowMask((u64) ~(0b10000))); EXPECT_FALSE(Common::IsValidLowMask((u64)(~((u64)(~0b0) >> 1) | 0b1111))); } + +TEST(BitUtils, BitCast) +{ + EXPECT_EQ(0x00000000U, Common::BitCast(0.0f)); + EXPECT_EQ(0x80000000U, Common::BitCast(-0.0f)); + EXPECT_EQ(0x3F800000U, Common::BitCast(1.0f)); + EXPECT_EQ(0xBF800000U, Common::BitCast(-1.0f)); + + EXPECT_EQ(0x0000000000000000ULL, Common::BitCast(0.0)); + EXPECT_EQ(0x8000000000000000ULL, Common::BitCast(-0.0)); + EXPECT_EQ(0x3FF0000000000000ULL, Common::BitCast(1.0)); + EXPECT_EQ(0xBFF0000000000000ULL, Common::BitCast(-1.0)); +} -- cgit v1.2.3