6 #include <gtest/gtest.h>
12 TEST(MathTests, TestLog2Floor)
14 auto testByteRange = [](
auto type)
16 using T = decltype(type);
17 EXPECT_EQ(log2Floor<T>(-10), -1);
18 EXPECT_EQ(log2Floor<T>(-1), -1);
19 EXPECT_EQ(log2Floor<T>(0), -1);
20 EXPECT_EQ(log2Floor<T>(1), 0);
21 EXPECT_EQ(log2Floor<T>(2), 1);
22 EXPECT_EQ(log2Floor<T>(3), 1);
23 EXPECT_EQ(log2Floor<T>(4), 2);
24 EXPECT_EQ(log2Floor<T>(7), 2);
25 EXPECT_EQ(log2Floor<T>(8), 3);
26 EXPECT_EQ(log2Floor<T>(63), 5);
27 EXPECT_EQ(log2Floor<T>(64), 6);
28 EXPECT_EQ(log2Floor<T>(127), 6);
31 testByteRange(int8_t(0));
32 testByteRange(int16_t(0));
33 testByteRange(int32_t(0));
34 testByteRange(int64_t(0));
36 EXPECT_EQ(log2Floor<uint16_t>(0x7FFF), 14);
37 EXPECT_EQ(log2Floor<uint16_t>(0x8000), 15);
38 EXPECT_EQ(log2Floor<uint16_t>(0xFFFF), 15);
40 EXPECT_EQ(log2Floor<uint32_t>(0x7FFFFFFF), 30);
41 EXPECT_EQ(log2Floor<uint32_t>(0x80000000), 31);
42 EXPECT_EQ(log2Floor<uint32_t>(0xFFFFFFFF), 31);
45 TEST(MathTests, TestRoundUpToPowerOf2)
47 EXPECT_EQ(RoundUpToPowerOf2<int32_t>(-10), 1);
48 EXPECT_EQ(RoundUpToPowerOf2<int32_t>(0), 1);
49 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(0), 1u);
50 EXPECT_EQ(RoundUpToPowerOf2<int32_t>(1), 1);
51 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(1), 1u);
52 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(2), 2u);
53 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(3), 4u);
55 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(255), 256u);
56 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(256), 256u);
57 EXPECT_EQ(RoundUpToPowerOf2<uint32_t>(257), 512u);
58 EXPECT_EQ(RoundUpToPowerOf2<uint64_t>(0xFFFFFFFF), 0x100000000ul);
61 TEST(MathTests, TestRoundUpToMultipleOf)
63 for (
int i = -20; i <= 20; i++)
65 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(i, 1), i);
68 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(0, 5), 0);
69 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(1, 5), 5);
70 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(4, 5), 5);
71 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(5, 5), 5);
72 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(6, 5), 10);
73 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(123, 5), 125);
74 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(8567, 2000), 10'000);
75 EXPECT_EQ(RoundUpToMultipleOf<uint32_t>(8567, 2000), 10'000u);
77 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-1, 7), 0);
78 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-6, 7), 0);
79 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-7, 7), -7);
80 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-8, 7), -7);
81 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-14, 7), -14);
82 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-15, 7), -14);
83 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-14'006, 7), -14'000);
86 EXPECT_EQ(RoundUpToMultipleOf<uint8_t>(13, 7), 14u);
87 EXPECT_EQ(RoundUpToMultipleOf<uint16_t>(13, 7), 14u);
88 EXPECT_EQ(RoundUpToMultipleOf<uint32_t>(13, 7), 14u);
89 EXPECT_EQ(RoundUpToMultipleOf<uint64_t>(13, 7), 14u);
91 EXPECT_EQ(RoundUpToMultipleOf<int8_t>(-13, 7), -7);
92 EXPECT_EQ(RoundUpToMultipleOf<int16_t>(-13, 7), -7);
93 EXPECT_EQ(RoundUpToMultipleOf<int32_t>(-13, 7), -7);
94 EXPECT_EQ(RoundUpToMultipleOf<int64_t>(-13, 7), -7);
97 TEST(MathTests, TestBitsRequiredToRepresent)
99 EXPECT_EQ(BitsRequiredToRepresent<int8_t>(-1), 8);
100 EXPECT_EQ(BitsRequiredToRepresent<int32_t>(-1), 32);
102 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(0), 0);
103 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(1), 1);
104 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(2), 2);
105 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(3), 2);
106 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(4), 3);
107 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(7), 3);
108 EXPECT_EQ(BitsRequiredToRepresent<uint8_t>(8), 4);
118 TEST(MathTests, TestBitWidthOfEnum)
142 enum class TestEnum127
145 OneHundredAndTwentySeven = 127
151 EXPECT_EQ(
BitWidthOfEnum(TestEnum127::OneHundredAndTwentySeven), 7);
TEST(MathTests, TestLog2Floor)
static constexpr int BitsRequiredToRepresent(T value)
static constexpr int BitWidthOfEnum(T endValue)