duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

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 }