summaryrefslogtreecommitdiff
path: root/Source/UnitTests/Common/BitUtilsTest.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2025-09-17 04:42:22 -0400
committerGitHub <noreply@github.com>2025-09-17 04:42:22 -0400
commitfce5f7c74ed069459b3c298b6e2459dd76f987d7 (patch)
treefb5a14dd8355a7de21fa599bb8c9f05736b3bd1a /Source/UnitTests/Common/BitUtilsTest.cpp
parentba7bf19b102d1b27f594c780c9d75970a276213a (diff)
parente9f58193a7c15643cd60c1e975ae34f49a6b4b5b (diff)
Merge pull request #13874 from sepalani/bitcast-ptr
Common/BitUtils: Add operator[] to BitCastPtrType
Diffstat (limited to 'Source/UnitTests/Common/BitUtilsTest.cpp')
-rw-r--r--Source/UnitTests/Common/BitUtilsTest.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/Source/UnitTests/Common/BitUtilsTest.cpp b/Source/UnitTests/Common/BitUtilsTest.cpp
index 8244941cf8..a140d07f54 100644
--- a/Source/UnitTests/Common/BitUtilsTest.cpp
+++ b/Source/UnitTests/Common/BitUtilsTest.cpp
@@ -3,6 +3,9 @@
#include <gtest/gtest.h>
+#include <bit>
+#include <vector>
+
#include "Common/BitUtils.h"
#include "Common/CommonTypes.h"
@@ -88,3 +91,52 @@ TEST(BitUtils, IsValidLowMask)
EXPECT_FALSE(Common::IsValidLowMask((u64) ~(0b10000)));
EXPECT_FALSE(Common::IsValidLowMask((u64)(~((u64)(~0b0) >> 1) | 0b1111)));
}
+
+TEST(BitUtils, BitCastPtr)
+{
+ EXPECT_EQ(std::endian::native, std::endian::little);
+
+ std::vector<u8> data{0, 1, 0, 2, 0, 3, 0, 0xFF, 0xFF};
+ u8* buffer = data.data();
+
+ EXPECT_EQ(s16(1), Common::BitCastPtr<s16>(buffer + 1));
+ Common::BitCastPtr<s16>(buffer + 1) = s16(-1);
+ EXPECT_EQ(u16(0xFFFF), Common::BitCastPtr<u16>(buffer + 1));
+ EXPECT_EQ(data, std::vector<u8>({0, 0xFF, 0xFF, 2, 0, 3, 0, 0xFF, 0xFF}));
+
+ EXPECT_EQ(s32(0xFFFF0003), Common::BitCastPtr<s32>(buffer + 1)[1]);
+ Common::BitCastPtr<u32>(buffer + 1)[1] = u32(0xFFFFFFFF);
+ EXPECT_EQ(s32(-1), Common::BitCastPtr<s32>(buffer + 1)[1]);
+ EXPECT_EQ(data, std::vector<u8>({0, 0xFF, 0xFF, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF}));
+
+#pragma pack(push, 1)
+ struct MyStruct
+ {
+ u16 v16;
+ u8 v8;
+ };
+#pragma pack(pop)
+
+ MyStruct s1 = Common::BitCastPtr<MyStruct>(buffer + 1);
+ EXPECT_EQ(u16(0xFFFF), s1.v16);
+ EXPECT_EQ(u8(2), s1.v8);
+ s1.v16 = 4;
+ s1.v8 = 5;
+ Common::BitCastPtr<MyStruct>(buffer + 1) = s1;
+ EXPECT_EQ(s16(4), Common::BitCastPtr<s16>(buffer + 1));
+ EXPECT_EQ(s8(5), Common::BitCastPtr<s8>(buffer + 3));
+ EXPECT_EQ(data, std::vector<u8>({0, 4, 0, 5, 0, 0xFF, 0xFF, 0xFF, 0xFF}));
+
+ auto struct_array = Common::BitCastPtr<MyStruct>(buffer + 1);
+ const MyStruct s1_again = struct_array[0];
+ EXPECT_EQ(u16(4), s1_again.v16);
+ EXPECT_EQ(u8(5), s1_again.v8);
+ MyStruct s2 = struct_array[1];
+ EXPECT_EQ(u16(0xFF00), s2.v16);
+ EXPECT_EQ(u8(0xFF), s2.v8);
+ struct_array[1] = s1_again;
+ s2 = struct_array[1];
+ EXPECT_EQ(u16(4), s2.v16);
+ EXPECT_EQ(u8(5), s2.v8);
+ EXPECT_EQ(data, std::vector<u8>({0, 4, 0, 5, 4, 0, 5, 0xFF, 0xFF}));
+}