diff --git a/src/common-tests/CMakeLists.txt b/src/common-tests/CMakeLists.txt index e9ebb3b64..a571640ca 100644 --- a/src/common-tests/CMakeLists.txt +++ b/src/common-tests/CMakeLists.txt @@ -1,4 +1,5 @@ add_executable(common-tests + bitutils_tests.cpp event_tests.cpp rectangle_tests.cpp ) diff --git a/src/common-tests/bitutils_tests.cpp b/src/common-tests/bitutils_tests.cpp new file mode 100644 index 000000000..3c036bc69 --- /dev/null +++ b/src/common-tests/bitutils_tests.cpp @@ -0,0 +1,68 @@ +#include "common/bitutils.h" +#include "gtest/gtest.h" +#include + +template +static inline constexpr unsigned ManualCountLeadingZeros(T value) +{ + constexpr unsigned BITS = sizeof(T) * 8u; + constexpr T MASK = T(1) << (BITS - 1); + + unsigned count = 0; + for (unsigned i = 0; i < BITS && (value & MASK) == 0; i++) + { + count++; + value <<= 1; + } + + return count; +} + +template +static inline constexpr unsigned ManualCountTrailingZeros(T value) +{ + constexpr unsigned BITS = sizeof(T) * 8u; + constexpr auto MASK = static_cast>(1); + + auto u_value = static_cast>(value); + + unsigned count = 0; + for (unsigned i = 0; i < BITS && (u_value & MASK) != MASK; i++) + { + count++; + u_value >>= 1; + } + + return count; +} + +TEST(BitUtils, Test8Bit) +{ + ASSERT_EQ(CountLeadingZeros(u8(1)), ManualCountLeadingZeros(u8(1))); + ASSERT_EQ(CountLeadingZeros(u8(2)), ManualCountLeadingZeros(u8(2))); + ASSERT_EQ(CountLeadingZeros(u8(4)), ManualCountLeadingZeros(u8(4))); + ASSERT_EQ(CountLeadingZeros(u8(8)), ManualCountLeadingZeros(u8(8))); + ASSERT_EQ(CountLeadingZeros(u8(16)), ManualCountLeadingZeros(u8(16))); + ASSERT_EQ(CountLeadingZeros(u8(32)), ManualCountLeadingZeros(u8(32))); + ASSERT_EQ(CountLeadingZeros(u8(64)), ManualCountLeadingZeros(u8(64))); + ASSERT_EQ(CountLeadingZeros(u8(128)), ManualCountLeadingZeros(u8(128))); + + ASSERT_EQ(CountTrailingZeros(u8(1)), ManualCountTrailingZeros(u8(1))); + ASSERT_EQ(CountTrailingZeros(u8(2)), ManualCountTrailingZeros(u8(2))); + ASSERT_EQ(CountTrailingZeros(u8(4)), ManualCountTrailingZeros(u8(4))); + ASSERT_EQ(CountTrailingZeros(u8(8)), ManualCountTrailingZeros(u8(8))); + ASSERT_EQ(CountTrailingZeros(u8(16)), ManualCountTrailingZeros(u8(16))); + ASSERT_EQ(CountTrailingZeros(u8(32)), ManualCountTrailingZeros(u8(32))); + ASSERT_EQ(CountTrailingZeros(u8(64)), ManualCountTrailingZeros(u8(64))); + ASSERT_EQ(CountTrailingZeros(u8(128)), ManualCountTrailingZeros(u8(128))); +} + +TEST(BitUtils, Test16Bit) +{ + for (u32 i = 1; i < 0x10000; i++) + { + u16 value = Truncate16(i); + ASSERT_EQ(CountLeadingZeros(value), ManualCountLeadingZeros(value)); + ASSERT_EQ(CountTrailingZeros(value), ManualCountTrailingZeros(value)); + } +} diff --git a/src/common-tests/common-tests.vcxproj b/src/common-tests/common-tests.vcxproj index 1a5fe26b5..9f69e06f7 100644 --- a/src/common-tests/common-tests.vcxproj +++ b/src/common-tests/common-tests.vcxproj @@ -44,6 +44,7 @@ + diff --git a/src/common-tests/common-tests.vcxproj.filters b/src/common-tests/common-tests.vcxproj.filters index b37bace2d..bf5fc0c76 100644 --- a/src/common-tests/common-tests.vcxproj.filters +++ b/src/common-tests/common-tests.vcxproj.filters @@ -4,5 +4,6 @@ + \ No newline at end of file