Jlm
MathTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2023 HÃ¥vard Krogstie <krogstie.havard@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #include <gtest/gtest.h>
7 
8 #include <jlm/util/Math.hpp>
9 
10 using namespace jlm::util;
11 
12 TEST(MathTests, TestLog2Floor)
13 {
14  auto testByteRange = [](auto type)
15  {
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);
29  };
30 
31  testByteRange(int8_t(0));
32  testByteRange(int16_t(0));
33  testByteRange(int32_t(0));
34  testByteRange(int64_t(0));
35 
36  EXPECT_EQ(log2Floor<uint16_t>(0x7FFF), 14);
37  EXPECT_EQ(log2Floor<uint16_t>(0x8000), 15);
38  EXPECT_EQ(log2Floor<uint16_t>(0xFFFF), 15);
39 
40  EXPECT_EQ(log2Floor<uint32_t>(0x7FFFFFFF), 30);
41  EXPECT_EQ(log2Floor<uint32_t>(0x80000000), 31);
42  EXPECT_EQ(log2Floor<uint32_t>(0xFFFFFFFF), 31);
43 }
44 
45 TEST(MathTests, TestRoundUpToPowerOf2)
46 {
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);
54 
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);
59 }
60 
61 TEST(MathTests, TestRoundUpToMultipleOf)
62 {
63  for (int i = -20; i <= 20; i++)
64  {
65  EXPECT_EQ(RoundUpToMultipleOf<int32_t>(i, 1), i);
66  }
67 
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);
76 
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);
84 
85  // Test different int sizes
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);
90 
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);
95 }
96 
97 TEST(MathTests, TestBitsRequiredToRepresent)
98 {
99  EXPECT_EQ(BitsRequiredToRepresent<int8_t>(-1), 8);
100  EXPECT_EQ(BitsRequiredToRepresent<int32_t>(-1), 32);
101 
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);
109 
110  EXPECT_EQ(BitsRequiredToRepresent(0xFFFF), 16);
111  EXPECT_EQ(BitsRequiredToRepresent(0x10000), 17);
112  EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFF), 32);
113  EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFFu), 32);
114  EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFF'FFFF'FFFFll), 64);
115  EXPECT_EQ(BitsRequiredToRepresent(0xFFFF'FFFF'FFFF'FFFFull), 64);
116 }
117 
118 TEST(MathTests, TestBitWidthOfEnum)
119 {
120  enum class TestEnum1
121  {
122  Zero
123  };
124 
125  enum class TestEnum4
126  {
127  Zero,
128  One,
129  Two,
130  Three
131  };
132 
133  enum class TestEnum5
134  {
135  Zero,
136  One,
137  Two,
138  Three,
139  Four
140  };
141 
142  enum class TestEnum127
143  {
144  Zero = 0,
145  OneHundredAndTwentySeven = 127
146  };
147 
148  EXPECT_EQ(BitWidthOfEnum(TestEnum1::Zero), 0);
149  EXPECT_EQ(BitWidthOfEnum(TestEnum4::Three), 2);
150  EXPECT_EQ(BitWidthOfEnum(TestEnum5::Four), 3);
151  EXPECT_EQ(BitWidthOfEnum(TestEnum127::OneHundredAndTwentySeven), 7);
152 }
TEST(MathTests, TestLog2Floor)
Definition: MathTests.cpp:12
static constexpr int BitsRequiredToRepresent(T value)
Definition: Math.hpp:94
static constexpr int BitWidthOfEnum(T endValue)
Definition: Math.hpp:107