bitutils_tests.cpp (2394B)
1 // SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #include "common/bitutils.h" 5 #include "gtest/gtest.h" 6 #include <type_traits> 7 8 template<typename T> 9 static inline constexpr unsigned ManualCountLeadingZeros(T value) 10 { 11 constexpr unsigned BITS = sizeof(T) * 8u; 12 constexpr T MASK = T(1) << (BITS - 1); 13 14 unsigned count = 0; 15 for (unsigned i = 0; i < BITS && (value & MASK) == 0; i++) 16 { 17 count++; 18 value <<= 1; 19 } 20 21 return count; 22 } 23 24 template<typename T> 25 static inline constexpr unsigned ManualCountTrailingZeros(T value) 26 { 27 constexpr unsigned BITS = sizeof(T) * 8u; 28 constexpr auto MASK = static_cast<std::make_unsigned_t<T>>(1); 29 30 auto u_value = static_cast<std::make_unsigned_t<T>>(value); 31 32 unsigned count = 0; 33 for (unsigned i = 0; i < BITS && (u_value & MASK) != MASK; i++) 34 { 35 count++; 36 u_value >>= 1; 37 } 38 39 return count; 40 } 41 42 TEST(BitUtils, Test8Bit) 43 { 44 ASSERT_EQ(CountLeadingZeros(u8(1)), ManualCountLeadingZeros(u8(1))); 45 ASSERT_EQ(CountLeadingZeros(u8(2)), ManualCountLeadingZeros(u8(2))); 46 ASSERT_EQ(CountLeadingZeros(u8(4)), ManualCountLeadingZeros(u8(4))); 47 ASSERT_EQ(CountLeadingZeros(u8(8)), ManualCountLeadingZeros(u8(8))); 48 ASSERT_EQ(CountLeadingZeros(u8(16)), ManualCountLeadingZeros(u8(16))); 49 ASSERT_EQ(CountLeadingZeros(u8(32)), ManualCountLeadingZeros(u8(32))); 50 ASSERT_EQ(CountLeadingZeros(u8(64)), ManualCountLeadingZeros(u8(64))); 51 ASSERT_EQ(CountLeadingZeros(u8(128)), ManualCountLeadingZeros(u8(128))); 52 53 ASSERT_EQ(CountTrailingZeros(u8(1)), ManualCountTrailingZeros(u8(1))); 54 ASSERT_EQ(CountTrailingZeros(u8(2)), ManualCountTrailingZeros(u8(2))); 55 ASSERT_EQ(CountTrailingZeros(u8(4)), ManualCountTrailingZeros(u8(4))); 56 ASSERT_EQ(CountTrailingZeros(u8(8)), ManualCountTrailingZeros(u8(8))); 57 ASSERT_EQ(CountTrailingZeros(u8(16)), ManualCountTrailingZeros(u8(16))); 58 ASSERT_EQ(CountTrailingZeros(u8(32)), ManualCountTrailingZeros(u8(32))); 59 ASSERT_EQ(CountTrailingZeros(u8(64)), ManualCountTrailingZeros(u8(64))); 60 ASSERT_EQ(CountTrailingZeros(u8(128)), ManualCountTrailingZeros(u8(128))); 61 } 62 63 TEST(BitUtils, Test16Bit) 64 { 65 for (u32 i = 1; i < 0x10000; i++) 66 { 67 u16 value = Truncate16(i); 68 ASSERT_EQ(CountLeadingZeros(value), ManualCountLeadingZeros(value)); 69 ASSERT_EQ(CountTrailingZeros(value), ManualCountTrailingZeros(value)); 70 } 71 }