xref: /aosp_15_r20/external/abseil-cpp/absl/numeric/bits_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2020 The Abseil Authors
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include "absl/numeric/bits.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <limits>
18*9356374aSAndroid Build Coastguard Worker #include <type_traits>
19*9356374aSAndroid Build Coastguard Worker 
20*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
21*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
22*9356374aSAndroid Build Coastguard Worker #include "absl/random/random.h"
23*9356374aSAndroid Build Coastguard Worker 
24*9356374aSAndroid Build Coastguard Worker namespace absl {
25*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
26*9356374aSAndroid Build Coastguard Worker namespace {
27*9356374aSAndroid Build Coastguard Worker 
28*9356374aSAndroid Build Coastguard Worker template <typename IntT>
29*9356374aSAndroid Build Coastguard Worker class IntegerTypesTest : public ::testing::Test {};
30*9356374aSAndroid Build Coastguard Worker 
31*9356374aSAndroid Build Coastguard Worker using OneByteIntegerTypes = ::testing::Types<
32*9356374aSAndroid Build Coastguard Worker     unsigned char,
33*9356374aSAndroid Build Coastguard Worker     uint8_t
34*9356374aSAndroid Build Coastguard Worker     >;
35*9356374aSAndroid Build Coastguard Worker 
36*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE(IntegerTypesTest, OneByteIntegerTypes);
37*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST(IntegerTypesTest,HandlesTypes)38*9356374aSAndroid Build Coastguard Worker TYPED_TEST(IntegerTypesTest, HandlesTypes) {
39*9356374aSAndroid Build Coastguard Worker   using UIntType = TypeParam;
40*9356374aSAndroid Build Coastguard Worker 
41*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(UIntType{0x12}, 0), uint8_t{0x12});
42*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(UIntType{0x12}, -4), uint8_t{0x21});
43*9356374aSAndroid Build Coastguard Worker   static_assert(rotl(UIntType{0x12}, 0) == uint8_t{0x12}, "");
44*9356374aSAndroid Build Coastguard Worker 
45*9356374aSAndroid Build Coastguard Worker   static_assert(rotr(UIntType{0x12}, 0) == uint8_t{0x12}, "");
46*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(UIntType{0x12}, 0), uint8_t{0x12});
47*9356374aSAndroid Build Coastguard Worker 
48*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CLZ
49*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(UIntType{}) == 8, "");
50*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(static_cast<UIntType>(-1)) == 0, "");
51*9356374aSAndroid Build Coastguard Worker 
52*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(UIntType{}) == 0, "");
53*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(static_cast<UIntType>(-1)) == 8, "");
54*9356374aSAndroid Build Coastguard Worker 
55*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(UIntType{}) == 8, "");
56*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(static_cast<UIntType>(-1)) == 0, "");
57*9356374aSAndroid Build Coastguard Worker 
58*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(UIntType{}) == 0, "");
59*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(static_cast<UIntType>(-1)) == 8, "");
60*9356374aSAndroid Build Coastguard Worker 
61*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(UIntType{}) == 0, "");
62*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(UIntType{1}) == 1, "");
63*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(static_cast<UIntType>(-1)) == 8, "");
64*9356374aSAndroid Build Coastguard Worker 
65*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(UIntType{}) == 0, "");
66*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(UIntType{1}) == 1, "");
67*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(UIntType{3}) == 2, "");
68*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(static_cast<UIntType>(-1)) == 8, "");
69*9356374aSAndroid Build Coastguard Worker #endif
70*9356374aSAndroid Build Coastguard Worker 
71*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(UIntType{}), 8);
72*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(static_cast<UIntType>(-1)), 0);
73*9356374aSAndroid Build Coastguard Worker 
74*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(UIntType{}), 0);
75*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(static_cast<UIntType>(-1)), 8);
76*9356374aSAndroid Build Coastguard Worker 
77*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(UIntType{}), 8);
78*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(static_cast<UIntType>(-1)), 0);
79*9356374aSAndroid Build Coastguard Worker 
80*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(UIntType{}), 0);
81*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(static_cast<UIntType>(-1)), 8);
82*9356374aSAndroid Build Coastguard Worker 
83*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(UIntType{}), 0);
84*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(UIntType{1}), 1);
85*9356374aSAndroid Build Coastguard Worker 
86*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(UIntType{}));
87*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(static_cast<UIntType>(-1)));
88*9356374aSAndroid Build Coastguard Worker 
89*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(UIntType{}), 0);
90*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(UIntType{1}), 1);
91*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(UIntType{3}), 2);
92*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(static_cast<UIntType>(-1)), 8);
93*9356374aSAndroid Build Coastguard Worker }
94*9356374aSAndroid Build Coastguard Worker 
TEST(Rotate,Left)95*9356374aSAndroid Build Coastguard Worker TEST(Rotate, Left) {
96*9356374aSAndroid Build Coastguard Worker   static_assert(rotl(uint8_t{0x12}, 0) == uint8_t{0x12}, "");
97*9356374aSAndroid Build Coastguard Worker   static_assert(rotl(uint16_t{0x1234}, 0) == uint16_t{0x1234}, "");
98*9356374aSAndroid Build Coastguard Worker   static_assert(rotl(uint32_t{0x12345678UL}, 0) == uint32_t{0x12345678UL}, "");
99*9356374aSAndroid Build Coastguard Worker   static_assert(rotl(uint64_t{0x12345678ABCDEF01ULL}, 0) ==
100*9356374aSAndroid Build Coastguard Worker                     uint64_t{0x12345678ABCDEF01ULL},
101*9356374aSAndroid Build Coastguard Worker                 "");
102*9356374aSAndroid Build Coastguard Worker 
103*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint8_t{0x12}, 0), uint8_t{0x12});
104*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint16_t{0x1234}, 0), uint16_t{0x1234});
105*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint32_t{0x12345678UL}, 0), uint32_t{0x12345678UL});
106*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint64_t{0x12345678ABCDEF01ULL}, 0),
107*9356374aSAndroid Build Coastguard Worker             uint64_t{0x12345678ABCDEF01ULL});
108*9356374aSAndroid Build Coastguard Worker 
109*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint8_t{0x12}, 8), uint8_t{0x12});
110*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint16_t{0x1234}, 16), uint16_t{0x1234});
111*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint32_t{0x12345678UL}, 32), uint32_t{0x12345678UL});
112*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint64_t{0x12345678ABCDEF01ULL}, 64),
113*9356374aSAndroid Build Coastguard Worker             uint64_t{0x12345678ABCDEF01ULL});
114*9356374aSAndroid Build Coastguard Worker 
115*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint8_t{0x12}, -8), uint8_t{0x12});
116*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint16_t{0x1234}, -16), uint16_t{0x1234});
117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint32_t{0x12345678UL}, -32), uint32_t{0x12345678UL});
118*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint64_t{0x12345678ABCDEF01ULL}, -64),
119*9356374aSAndroid Build Coastguard Worker             uint64_t{0x12345678ABCDEF01ULL});
120*9356374aSAndroid Build Coastguard Worker 
121*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint8_t{0x12}, 4), uint8_t{0x21});
122*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint16_t{0x1234}, 4), uint16_t{0x2341});
123*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint32_t{0x12345678UL}, 4), uint32_t{0x23456781UL});
124*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint64_t{0x12345678ABCDEF01ULL}, 4),
125*9356374aSAndroid Build Coastguard Worker             uint64_t{0x2345678ABCDEF011ULL});
126*9356374aSAndroid Build Coastguard Worker 
127*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint8_t{0x12}, -4), uint8_t{0x21});
128*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint16_t{0x1234}, -4), uint16_t{0x4123});
129*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint32_t{0x12345678UL}, -4), uint32_t{0x81234567UL});
130*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotl(uint64_t{0x12345678ABCDEF01ULL}, -4),
131*9356374aSAndroid Build Coastguard Worker             uint64_t{0x112345678ABCDEF0ULL});
132*9356374aSAndroid Build Coastguard Worker }
133*9356374aSAndroid Build Coastguard Worker 
TEST(Rotate,Right)134*9356374aSAndroid Build Coastguard Worker TEST(Rotate, Right) {
135*9356374aSAndroid Build Coastguard Worker   static_assert(rotr(uint8_t{0x12}, 0) == uint8_t{0x12}, "");
136*9356374aSAndroid Build Coastguard Worker   static_assert(rotr(uint16_t{0x1234}, 0) == uint16_t{0x1234}, "");
137*9356374aSAndroid Build Coastguard Worker   static_assert(rotr(uint32_t{0x12345678UL}, 0) == uint32_t{0x12345678UL}, "");
138*9356374aSAndroid Build Coastguard Worker   static_assert(rotr(uint64_t{0x12345678ABCDEF01ULL}, 0) ==
139*9356374aSAndroid Build Coastguard Worker                     uint64_t{0x12345678ABCDEF01ULL},
140*9356374aSAndroid Build Coastguard Worker                 "");
141*9356374aSAndroid Build Coastguard Worker 
142*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint8_t{0x12}, 0), uint8_t{0x12});
143*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint16_t{0x1234}, 0), uint16_t{0x1234});
144*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint32_t{0x12345678UL}, 0), uint32_t{0x12345678UL});
145*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint64_t{0x12345678ABCDEF01ULL}, 0),
146*9356374aSAndroid Build Coastguard Worker             uint64_t{0x12345678ABCDEF01ULL});
147*9356374aSAndroid Build Coastguard Worker 
148*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint8_t{0x12}, 8), uint8_t{0x12});
149*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint16_t{0x1234}, 16), uint16_t{0x1234});
150*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint32_t{0x12345678UL}, 32), uint32_t{0x12345678UL});
151*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint64_t{0x12345678ABCDEF01ULL}, 64),
152*9356374aSAndroid Build Coastguard Worker             uint64_t{0x12345678ABCDEF01ULL});
153*9356374aSAndroid Build Coastguard Worker 
154*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint8_t{0x12}, -8), uint8_t{0x12});
155*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint16_t{0x1234}, -16), uint16_t{0x1234});
156*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint32_t{0x12345678UL}, -32), uint32_t{0x12345678UL});
157*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint64_t{0x12345678ABCDEF01ULL}, -64),
158*9356374aSAndroid Build Coastguard Worker             uint64_t{0x12345678ABCDEF01ULL});
159*9356374aSAndroid Build Coastguard Worker 
160*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint8_t{0x12}, 4), uint8_t{0x21});
161*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint16_t{0x1234}, 4), uint16_t{0x4123});
162*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint32_t{0x12345678UL}, 4), uint32_t{0x81234567UL});
163*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint64_t{0x12345678ABCDEF01ULL}, 4),
164*9356374aSAndroid Build Coastguard Worker             uint64_t{0x112345678ABCDEF0ULL});
165*9356374aSAndroid Build Coastguard Worker 
166*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint8_t{0x12}, -4), uint8_t{0x21});
167*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint16_t{0x1234}, -4), uint16_t{0x2341});
168*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint32_t{0x12345678UL}, -4), uint32_t{0x23456781UL});
169*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(rotr(uint64_t{0x12345678ABCDEF01ULL}, -4),
170*9356374aSAndroid Build Coastguard Worker             uint64_t{0x2345678ABCDEF011ULL});
171*9356374aSAndroid Build Coastguard Worker }
172*9356374aSAndroid Build Coastguard Worker 
TEST(Rotate,Symmetry)173*9356374aSAndroid Build Coastguard Worker TEST(Rotate, Symmetry) {
174*9356374aSAndroid Build Coastguard Worker   // rotr(x, s) is equivalent to rotl(x, -s)
175*9356374aSAndroid Build Coastguard Worker   absl::BitGen rng;
176*9356374aSAndroid Build Coastguard Worker   constexpr int kTrials = 100;
177*9356374aSAndroid Build Coastguard Worker 
178*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
179*9356374aSAndroid Build Coastguard Worker     uint8_t value = absl::Uniform(rng, std::numeric_limits<uint8_t>::min(),
180*9356374aSAndroid Build Coastguard Worker                                   std::numeric_limits<uint8_t>::max());
181*9356374aSAndroid Build Coastguard Worker     int shift = absl::Uniform(rng, -2 * std::numeric_limits<uint8_t>::digits,
182*9356374aSAndroid Build Coastguard Worker                               2 * std::numeric_limits<uint8_t>::digits);
183*9356374aSAndroid Build Coastguard Worker 
184*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(rotl(value, shift), rotr(value, -shift));
185*9356374aSAndroid Build Coastguard Worker   }
186*9356374aSAndroid Build Coastguard Worker 
187*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
188*9356374aSAndroid Build Coastguard Worker     uint16_t value = absl::Uniform(rng, std::numeric_limits<uint16_t>::min(),
189*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<uint16_t>::max());
190*9356374aSAndroid Build Coastguard Worker     int shift = absl::Uniform(rng, -2 * std::numeric_limits<uint16_t>::digits,
191*9356374aSAndroid Build Coastguard Worker                               2 * std::numeric_limits<uint16_t>::digits);
192*9356374aSAndroid Build Coastguard Worker 
193*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(rotl(value, shift), rotr(value, -shift));
194*9356374aSAndroid Build Coastguard Worker   }
195*9356374aSAndroid Build Coastguard Worker 
196*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
197*9356374aSAndroid Build Coastguard Worker     uint32_t value = absl::Uniform(rng, std::numeric_limits<uint32_t>::min(),
198*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<uint32_t>::max());
199*9356374aSAndroid Build Coastguard Worker     int shift = absl::Uniform(rng, -2 * std::numeric_limits<uint32_t>::digits,
200*9356374aSAndroid Build Coastguard Worker                               2 * std::numeric_limits<uint32_t>::digits);
201*9356374aSAndroid Build Coastguard Worker 
202*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(rotl(value, shift), rotr(value, -shift));
203*9356374aSAndroid Build Coastguard Worker   }
204*9356374aSAndroid Build Coastguard Worker 
205*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
206*9356374aSAndroid Build Coastguard Worker     uint64_t value = absl::Uniform(rng, std::numeric_limits<uint64_t>::min(),
207*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<uint64_t>::max());
208*9356374aSAndroid Build Coastguard Worker     int shift = absl::Uniform(rng, -2 * std::numeric_limits<uint64_t>::digits,
209*9356374aSAndroid Build Coastguard Worker                               2 * std::numeric_limits<uint64_t>::digits);
210*9356374aSAndroid Build Coastguard Worker 
211*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(rotl(value, shift), rotr(value, -shift));
212*9356374aSAndroid Build Coastguard Worker   }
213*9356374aSAndroid Build Coastguard Worker }
214*9356374aSAndroid Build Coastguard Worker 
TEST(Counting,LeadingZeroes)215*9356374aSAndroid Build Coastguard Worker TEST(Counting, LeadingZeroes) {
216*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CLZ
217*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(uint8_t{}) == 8, "");
218*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(static_cast<uint8_t>(-1)) == 0, "");
219*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(uint16_t{}) == 16, "");
220*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(static_cast<uint16_t>(-1)) == 0, "");
221*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(uint32_t{}) == 32, "");
222*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(~uint32_t{}) == 0, "");
223*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(uint64_t{}) == 64, "");
224*9356374aSAndroid Build Coastguard Worker   static_assert(countl_zero(~uint64_t{}) == 0, "");
225*9356374aSAndroid Build Coastguard Worker #endif
226*9356374aSAndroid Build Coastguard Worker 
227*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(uint8_t{}), 8);
228*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(static_cast<uint8_t>(-1)), 0);
229*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(uint16_t{}), 16);
230*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(static_cast<uint16_t>(-1)), 0);
231*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(uint32_t{}), 32);
232*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(~uint32_t{}), 0);
233*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(uint64_t{}), 64);
234*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_zero(~uint64_t{}), 0);
235*9356374aSAndroid Build Coastguard Worker 
236*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 8; i++) {
237*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(countl_zero(static_cast<uint8_t>(1u << i)), 7 - i);
238*9356374aSAndroid Build Coastguard Worker   }
239*9356374aSAndroid Build Coastguard Worker 
240*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 16; i++) {
241*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(countl_zero(static_cast<uint16_t>(1u << i)), 15 - i);
242*9356374aSAndroid Build Coastguard Worker   }
243*9356374aSAndroid Build Coastguard Worker 
244*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 32; i++) {
245*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(countl_zero(uint32_t{1} << i), 31 - i);
246*9356374aSAndroid Build Coastguard Worker   }
247*9356374aSAndroid Build Coastguard Worker 
248*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 64; i++) {
249*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(countl_zero(uint64_t{1} << i), 63 - i);
250*9356374aSAndroid Build Coastguard Worker   }
251*9356374aSAndroid Build Coastguard Worker }
252*9356374aSAndroid Build Coastguard Worker 
TEST(Counting,LeadingOnes)253*9356374aSAndroid Build Coastguard Worker TEST(Counting, LeadingOnes) {
254*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CLZ
255*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(uint8_t{}) == 0, "");
256*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(static_cast<uint8_t>(-1)) == 8, "");
257*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(uint16_t{}) == 0, "");
258*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(static_cast<uint16_t>(-1)) == 16, "");
259*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(uint32_t{}) == 0, "");
260*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(~uint32_t{}) == 32, "");
261*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(uint64_t{}) == 0, "");
262*9356374aSAndroid Build Coastguard Worker   static_assert(countl_one(~uint64_t{}) == 64, "");
263*9356374aSAndroid Build Coastguard Worker #endif
264*9356374aSAndroid Build Coastguard Worker 
265*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(uint8_t{}), 0);
266*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(static_cast<uint8_t>(-1)), 8);
267*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(uint16_t{}), 0);
268*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(static_cast<uint16_t>(-1)), 16);
269*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(uint32_t{}), 0);
270*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(~uint32_t{}), 32);
271*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(uint64_t{}), 0);
272*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countl_one(~uint64_t{}), 64);
273*9356374aSAndroid Build Coastguard Worker }
274*9356374aSAndroid Build Coastguard Worker 
TEST(Counting,TrailingZeroes)275*9356374aSAndroid Build Coastguard Worker TEST(Counting, TrailingZeroes) {
276*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CTZ
277*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(uint8_t{}) == 8, "");
278*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(static_cast<uint8_t>(-1)) == 0, "");
279*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(uint16_t{}) == 16, "");
280*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(static_cast<uint16_t>(-1)) == 0, "");
281*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(uint32_t{}) == 32, "");
282*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(~uint32_t{}) == 0, "");
283*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(uint64_t{}) == 64, "");
284*9356374aSAndroid Build Coastguard Worker   static_assert(countr_zero(~uint64_t{}) == 0, "");
285*9356374aSAndroid Build Coastguard Worker #endif
286*9356374aSAndroid Build Coastguard Worker 
287*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(uint8_t{}), 8);
288*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(static_cast<uint8_t>(-1)), 0);
289*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(uint16_t{}), 16);
290*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(static_cast<uint16_t>(-1)), 0);
291*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(uint32_t{}), 32);
292*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(~uint32_t{}), 0);
293*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(uint64_t{}), 64);
294*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_zero(~uint64_t{}), 0);
295*9356374aSAndroid Build Coastguard Worker }
296*9356374aSAndroid Build Coastguard Worker 
TEST(Counting,TrailingOnes)297*9356374aSAndroid Build Coastguard Worker TEST(Counting, TrailingOnes) {
298*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CTZ
299*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(uint8_t{}) == 0, "");
300*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(static_cast<uint8_t>(-1)) == 8, "");
301*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(uint16_t{}) == 0, "");
302*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(static_cast<uint16_t>(-1)) == 16, "");
303*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(uint32_t{}) == 0, "");
304*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(~uint32_t{}) == 32, "");
305*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(uint64_t{}) == 0, "");
306*9356374aSAndroid Build Coastguard Worker   static_assert(countr_one(~uint64_t{}) == 64, "");
307*9356374aSAndroid Build Coastguard Worker #endif
308*9356374aSAndroid Build Coastguard Worker 
309*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(uint8_t{}), 0);
310*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(static_cast<uint8_t>(-1)), 8);
311*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(uint16_t{}), 0);
312*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(static_cast<uint16_t>(-1)), 16);
313*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(uint32_t{}), 0);
314*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(~uint32_t{}), 32);
315*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(uint64_t{}), 0);
316*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(countr_one(~uint64_t{}), 64);
317*9356374aSAndroid Build Coastguard Worker }
318*9356374aSAndroid Build Coastguard Worker 
TEST(Counting,Popcount)319*9356374aSAndroid Build Coastguard Worker TEST(Counting, Popcount) {
320*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_POPCOUNT
321*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint8_t{}) == 0, "");
322*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint8_t{1}) == 1, "");
323*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(static_cast<uint8_t>(-1)) == 8, "");
324*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint16_t{}) == 0, "");
325*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint16_t{1}) == 1, "");
326*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(static_cast<uint16_t>(-1)) == 16, "");
327*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint32_t{}) == 0, "");
328*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint32_t{1}) == 1, "");
329*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(~uint32_t{}) == 32, "");
330*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint64_t{}) == 0, "");
331*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(uint64_t{1}) == 1, "");
332*9356374aSAndroid Build Coastguard Worker   static_assert(popcount(~uint64_t{}) == 64, "");
333*9356374aSAndroid Build Coastguard Worker #endif  // ABSL_INTERNAL_HAS_CONSTEXPR_POPCOUNT
334*9356374aSAndroid Build Coastguard Worker 
335*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint8_t{}), 0);
336*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint8_t{1}), 1);
337*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(static_cast<uint8_t>(-1)), 8);
338*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint16_t{}), 0);
339*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint16_t{1}), 1);
340*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(static_cast<uint16_t>(-1)), 16);
341*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint32_t{}), 0);
342*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint32_t{1}), 1);
343*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(~uint32_t{}), 32);
344*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint64_t{}), 0);
345*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(uint64_t{1}), 1);
346*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(popcount(~uint64_t{}), 64);
347*9356374aSAndroid Build Coastguard Worker 
348*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 8; i++) {
349*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(static_cast<uint8_t>(uint8_t{1} << i)), 1);
350*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(static_cast<uint8_t>(static_cast<uint8_t>(-1) ^
351*9356374aSAndroid Build Coastguard Worker                                             (uint8_t{1} << i))),
352*9356374aSAndroid Build Coastguard Worker               7);
353*9356374aSAndroid Build Coastguard Worker   }
354*9356374aSAndroid Build Coastguard Worker 
355*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 16; i++) {
356*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(static_cast<uint16_t>(uint16_t{1} << i)), 1);
357*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(static_cast<uint16_t>(static_cast<uint16_t>(-1) ^
358*9356374aSAndroid Build Coastguard Worker                                              (uint16_t{1} << i))),
359*9356374aSAndroid Build Coastguard Worker               15);
360*9356374aSAndroid Build Coastguard Worker   }
361*9356374aSAndroid Build Coastguard Worker 
362*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 32; i++) {
363*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(uint32_t{1} << i), 1);
364*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(static_cast<uint32_t>(-1) ^ (uint32_t{1} << i)), 31);
365*9356374aSAndroid Build Coastguard Worker   }
366*9356374aSAndroid Build Coastguard Worker 
367*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 64; i++) {
368*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(uint64_t{1} << i), 1);
369*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(static_cast<uint64_t>(-1) ^ (uint64_t{1} << i)), 63);
370*9356374aSAndroid Build Coastguard Worker   }
371*9356374aSAndroid Build Coastguard Worker }
372*9356374aSAndroid Build Coastguard Worker 
373*9356374aSAndroid Build Coastguard Worker template <typename T>
374*9356374aSAndroid Build Coastguard Worker struct PopcountInput {
375*9356374aSAndroid Build Coastguard Worker   T value = 0;
376*9356374aSAndroid Build Coastguard Worker   int expected = 0;
377*9356374aSAndroid Build Coastguard Worker };
378*9356374aSAndroid Build Coastguard Worker 
379*9356374aSAndroid Build Coastguard Worker template <typename T>
GeneratePopcountInput(absl::BitGen & gen)380*9356374aSAndroid Build Coastguard Worker PopcountInput<T> GeneratePopcountInput(absl::BitGen& gen) {
381*9356374aSAndroid Build Coastguard Worker   PopcountInput<T> ret;
382*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < std::numeric_limits<T>::digits; i++) {
383*9356374aSAndroid Build Coastguard Worker     bool coin = absl::Bernoulli(gen, 0.2);
384*9356374aSAndroid Build Coastguard Worker     if (coin) {
385*9356374aSAndroid Build Coastguard Worker       ret.value |= T{1} << i;
386*9356374aSAndroid Build Coastguard Worker       ret.expected++;
387*9356374aSAndroid Build Coastguard Worker     }
388*9356374aSAndroid Build Coastguard Worker   }
389*9356374aSAndroid Build Coastguard Worker   return ret;
390*9356374aSAndroid Build Coastguard Worker }
391*9356374aSAndroid Build Coastguard Worker 
TEST(Counting,PopcountFuzz)392*9356374aSAndroid Build Coastguard Worker TEST(Counting, PopcountFuzz) {
393*9356374aSAndroid Build Coastguard Worker   absl::BitGen rng;
394*9356374aSAndroid Build Coastguard Worker   constexpr int kTrials = 100;
395*9356374aSAndroid Build Coastguard Worker 
396*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
397*9356374aSAndroid Build Coastguard Worker     auto input = GeneratePopcountInput<uint8_t>(rng);
398*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(input.value), input.expected);
399*9356374aSAndroid Build Coastguard Worker   }
400*9356374aSAndroid Build Coastguard Worker 
401*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
402*9356374aSAndroid Build Coastguard Worker     auto input = GeneratePopcountInput<uint16_t>(rng);
403*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(input.value), input.expected);
404*9356374aSAndroid Build Coastguard Worker   }
405*9356374aSAndroid Build Coastguard Worker 
406*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
407*9356374aSAndroid Build Coastguard Worker     auto input = GeneratePopcountInput<uint32_t>(rng);
408*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(input.value), input.expected);
409*9356374aSAndroid Build Coastguard Worker   }
410*9356374aSAndroid Build Coastguard Worker 
411*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kTrials; ++i) {
412*9356374aSAndroid Build Coastguard Worker     auto input = GeneratePopcountInput<uint64_t>(rng);
413*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(popcount(input.value), input.expected);
414*9356374aSAndroid Build Coastguard Worker   }
415*9356374aSAndroid Build Coastguard Worker }
416*9356374aSAndroid Build Coastguard Worker 
TEST(IntegralPowersOfTwo,SingleBit)417*9356374aSAndroid Build Coastguard Worker TEST(IntegralPowersOfTwo, SingleBit) {
418*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(uint8_t{}));
419*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(static_cast<uint8_t>(-1)));
420*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(uint16_t{}));
421*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(static_cast<uint16_t>(-1)));
422*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(uint32_t{}));
423*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(~uint32_t{}));
424*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(uint64_t{}));
425*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(~uint64_t{}));
426*9356374aSAndroid Build Coastguard Worker 
427*9356374aSAndroid Build Coastguard Worker   static_assert(!has_single_bit(0u), "");
428*9356374aSAndroid Build Coastguard Worker   static_assert(has_single_bit(1u), "");
429*9356374aSAndroid Build Coastguard Worker   static_assert(has_single_bit(2u), "");
430*9356374aSAndroid Build Coastguard Worker   static_assert(!has_single_bit(3u), "");
431*9356374aSAndroid Build Coastguard Worker   static_assert(has_single_bit(4u), "");
432*9356374aSAndroid Build Coastguard Worker   static_assert(!has_single_bit(1337u), "");
433*9356374aSAndroid Build Coastguard Worker   static_assert(has_single_bit(65536u), "");
434*9356374aSAndroid Build Coastguard Worker   static_assert(has_single_bit(uint32_t{1} << 30), "");
435*9356374aSAndroid Build Coastguard Worker   static_assert(has_single_bit(uint64_t{1} << 42), "");
436*9356374aSAndroid Build Coastguard Worker 
437*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(0u));
438*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(1u));
439*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(2u));
440*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(3u));
441*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(4u));
442*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(has_single_bit(1337u));
443*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(65536u));
444*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(uint32_t{1} << 30));
445*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(uint64_t{1} << 42));
446*9356374aSAndroid Build Coastguard Worker 
447*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(
448*9356374aSAndroid Build Coastguard Worker       static_cast<uint8_t>(std::numeric_limits<uint8_t>::max() / 2 + 1)));
449*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(
450*9356374aSAndroid Build Coastguard Worker       static_cast<uint16_t>(std::numeric_limits<uint16_t>::max() / 2 + 1)));
451*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(
452*9356374aSAndroid Build Coastguard Worker       static_cast<uint32_t>(std::numeric_limits<uint32_t>::max() / 2 + 1)));
453*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(has_single_bit(
454*9356374aSAndroid Build Coastguard Worker       static_cast<uint64_t>(std::numeric_limits<uint64_t>::max() / 2 + 1)));
455*9356374aSAndroid Build Coastguard Worker }
456*9356374aSAndroid Build Coastguard Worker 
457*9356374aSAndroid Build Coastguard Worker template <typename T, T arg, T = bit_ceil(arg)>
IsBitCeilConstantExpression(int)458*9356374aSAndroid Build Coastguard Worker bool IsBitCeilConstantExpression(int) {
459*9356374aSAndroid Build Coastguard Worker   return true;
460*9356374aSAndroid Build Coastguard Worker }
461*9356374aSAndroid Build Coastguard Worker template <typename T, T arg>
IsBitCeilConstantExpression(char)462*9356374aSAndroid Build Coastguard Worker bool IsBitCeilConstantExpression(char) {
463*9356374aSAndroid Build Coastguard Worker   return false;
464*9356374aSAndroid Build Coastguard Worker }
465*9356374aSAndroid Build Coastguard Worker 
TEST(IntegralPowersOfTwo,Ceiling)466*9356374aSAndroid Build Coastguard Worker TEST(IntegralPowersOfTwo, Ceiling) {
467*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CLZ
468*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(0u) == 1, "");
469*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(1u) == 1, "");
470*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(2u) == 2, "");
471*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(3u) == 4, "");
472*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(4u) == 4, "");
473*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(1337u) == 2048, "");
474*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(65536u) == 65536, "");
475*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(65536u - 1337u) == 65536, "");
476*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(uint32_t{0x80000000}) == uint32_t{0x80000000}, "");
477*9356374aSAndroid Build Coastguard Worker   static_assert(bit_ceil(uint64_t{0x40000000000}) == uint64_t{0x40000000000},
478*9356374aSAndroid Build Coastguard Worker                 "");
479*9356374aSAndroid Build Coastguard Worker   static_assert(
480*9356374aSAndroid Build Coastguard Worker       bit_ceil(uint64_t{0x8000000000000000}) == uint64_t{0x8000000000000000},
481*9356374aSAndroid Build Coastguard Worker       "");
482*9356374aSAndroid Build Coastguard Worker 
483*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint8_t, uint8_t{0x0}>(0)));
484*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint8_t, uint8_t{0x80}>(0)));
485*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((IsBitCeilConstantExpression<uint8_t, uint8_t{0x81}>(0)));
486*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((IsBitCeilConstantExpression<uint8_t, uint8_t{0xff}>(0)));
487*9356374aSAndroid Build Coastguard Worker 
488*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint16_t, uint16_t{0x0}>(0)));
489*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint16_t, uint16_t{0x8000}>(0)));
490*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((IsBitCeilConstantExpression<uint16_t, uint16_t{0x8001}>(0)));
491*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((IsBitCeilConstantExpression<uint16_t, uint16_t{0xffff}>(0)));
492*9356374aSAndroid Build Coastguard Worker 
493*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint32_t, uint32_t{0x0}>(0)));
494*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint32_t, uint32_t{0x80000000}>(0)));
495*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
496*9356374aSAndroid Build Coastguard Worker       (IsBitCeilConstantExpression<uint32_t, uint32_t{0x80000001}>(0)));
497*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
498*9356374aSAndroid Build Coastguard Worker       (IsBitCeilConstantExpression<uint32_t, uint32_t{0xffffffff}>(0)));
499*9356374aSAndroid Build Coastguard Worker 
500*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((IsBitCeilConstantExpression<uint64_t, uint64_t{0x0}>(0)));
501*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
502*9356374aSAndroid Build Coastguard Worker       (IsBitCeilConstantExpression<uint64_t, uint64_t{0x8000000000000000}>(0)));
503*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
504*9356374aSAndroid Build Coastguard Worker       (IsBitCeilConstantExpression<uint64_t, uint64_t{0x8000000000000001}>(0)));
505*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
506*9356374aSAndroid Build Coastguard Worker       (IsBitCeilConstantExpression<uint64_t, uint64_t{0xffffffffffffffff}>(0)));
507*9356374aSAndroid Build Coastguard Worker #endif
508*9356374aSAndroid Build Coastguard Worker 
509*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(0u), 1);
510*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(1u), 1);
511*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(2u), 2);
512*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(3u), 4);
513*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(4u), 4);
514*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(1337u), 2048);
515*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(65536u), 65536);
516*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(65536u - 1337u), 65536);
517*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_ceil(uint64_t{0x40000000000}), uint64_t{0x40000000000});
518*9356374aSAndroid Build Coastguard Worker }
519*9356374aSAndroid Build Coastguard Worker 
TEST(IntegralPowersOfTwo,Floor)520*9356374aSAndroid Build Coastguard Worker TEST(IntegralPowersOfTwo, Floor) {
521*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CLZ
522*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(0u) == 0, "");
523*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(1u) == 1, "");
524*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(2u) == 2, "");
525*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(3u) == 2, "");
526*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(4u) == 4, "");
527*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(1337u) == 1024, "");
528*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(65536u) == 65536, "");
529*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(65536u - 1337u) == 32768, "");
530*9356374aSAndroid Build Coastguard Worker   static_assert(bit_floor(uint64_t{0x40000000000}) == uint64_t{0x40000000000},
531*9356374aSAndroid Build Coastguard Worker                 "");
532*9356374aSAndroid Build Coastguard Worker #endif
533*9356374aSAndroid Build Coastguard Worker 
534*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(0u), 0);
535*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(1u), 1);
536*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(2u), 2);
537*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(3u), 2);
538*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(4u), 4);
539*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(1337u), 1024);
540*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(65536u), 65536);
541*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(65536u - 1337u), 32768);
542*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_floor(uint64_t{0x40000000000}), uint64_t{0x40000000000});
543*9356374aSAndroid Build Coastguard Worker 
544*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 8; i++) {
545*9356374aSAndroid Build Coastguard Worker     uint8_t input = uint8_t{1} << i;
546*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_floor(input), input);
547*9356374aSAndroid Build Coastguard Worker     if (i > 0) {
548*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(bit_floor(static_cast<uint8_t>(input + 1)), input);
549*9356374aSAndroid Build Coastguard Worker     }
550*9356374aSAndroid Build Coastguard Worker   }
551*9356374aSAndroid Build Coastguard Worker 
552*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 16; i++) {
553*9356374aSAndroid Build Coastguard Worker     uint16_t input = uint16_t{1} << i;
554*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_floor(input), input);
555*9356374aSAndroid Build Coastguard Worker     if (i > 0) {
556*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(bit_floor(static_cast<uint16_t>(input + 1)), input);
557*9356374aSAndroid Build Coastguard Worker     }
558*9356374aSAndroid Build Coastguard Worker   }
559*9356374aSAndroid Build Coastguard Worker 
560*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 32; i++) {
561*9356374aSAndroid Build Coastguard Worker     uint32_t input = uint32_t{1} << i;
562*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_floor(input), input);
563*9356374aSAndroid Build Coastguard Worker     if (i > 0) {
564*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(bit_floor(input + 1), input);
565*9356374aSAndroid Build Coastguard Worker     }
566*9356374aSAndroid Build Coastguard Worker   }
567*9356374aSAndroid Build Coastguard Worker 
568*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 64; i++) {
569*9356374aSAndroid Build Coastguard Worker     uint64_t input = uint64_t{1} << i;
570*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_floor(input), input);
571*9356374aSAndroid Build Coastguard Worker     if (i > 0) {
572*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(bit_floor(input + 1), input);
573*9356374aSAndroid Build Coastguard Worker     }
574*9356374aSAndroid Build Coastguard Worker   }
575*9356374aSAndroid Build Coastguard Worker }
576*9356374aSAndroid Build Coastguard Worker 
TEST(IntegralPowersOfTwo,Width)577*9356374aSAndroid Build Coastguard Worker TEST(IntegralPowersOfTwo, Width) {
578*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_HAS_CONSTEXPR_CLZ
579*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint8_t{}) == 0, "");
580*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint8_t{1}) == 1, "");
581*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint8_t{3}) == 2, "");
582*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(static_cast<uint8_t>(-1)) == 8, "");
583*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint16_t{}) == 0, "");
584*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint16_t{1}) == 1, "");
585*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint16_t{3}) == 2, "");
586*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(static_cast<uint16_t>(-1)) == 16, "");
587*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint32_t{}) == 0, "");
588*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint32_t{1}) == 1, "");
589*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint32_t{3}) == 2, "");
590*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(~uint32_t{}) == 32, "");
591*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint64_t{}) == 0, "");
592*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint64_t{1}) == 1, "");
593*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(uint64_t{3}) == 2, "");
594*9356374aSAndroid Build Coastguard Worker   static_assert(bit_width(~uint64_t{}) == 64, "");
595*9356374aSAndroid Build Coastguard Worker #endif
596*9356374aSAndroid Build Coastguard Worker 
597*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint8_t{}), 0);
598*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint8_t{1}), 1);
599*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint8_t{3}), 2);
600*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(static_cast<uint8_t>(-1)), 8);
601*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint16_t{}), 0);
602*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint16_t{1}), 1);
603*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint16_t{3}), 2);
604*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(static_cast<uint16_t>(-1)), 16);
605*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint32_t{}), 0);
606*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint32_t{1}), 1);
607*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint32_t{3}), 2);
608*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(~uint32_t{}), 32);
609*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint64_t{}), 0);
610*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint64_t{1}), 1);
611*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(uint64_t{3}), 2);
612*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(bit_width(~uint64_t{}), 64);
613*9356374aSAndroid Build Coastguard Worker 
614*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 8; i++) {
615*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_width(static_cast<uint8_t>(uint8_t{1} << i)), i + 1);
616*9356374aSAndroid Build Coastguard Worker   }
617*9356374aSAndroid Build Coastguard Worker 
618*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 16; i++) {
619*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_width(static_cast<uint16_t>(uint16_t{1} << i)), i + 1);
620*9356374aSAndroid Build Coastguard Worker   }
621*9356374aSAndroid Build Coastguard Worker 
622*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 32; i++) {
623*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_width(uint32_t{1} << i), i + 1);
624*9356374aSAndroid Build Coastguard Worker   }
625*9356374aSAndroid Build Coastguard Worker 
626*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 64; i++) {
627*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(bit_width(uint64_t{1} << i), i + 1);
628*9356374aSAndroid Build Coastguard Worker   }
629*9356374aSAndroid Build Coastguard Worker }
630*9356374aSAndroid Build Coastguard Worker 
631*9356374aSAndroid Build Coastguard Worker // On GCC and Clang, anticiapte that implementations will be constexpr
632*9356374aSAndroid Build Coastguard Worker #if defined(__GNUC__)
633*9356374aSAndroid Build Coastguard Worker static_assert(ABSL_INTERNAL_HAS_CONSTEXPR_POPCOUNT,
634*9356374aSAndroid Build Coastguard Worker               "popcount should be constexpr");
635*9356374aSAndroid Build Coastguard Worker static_assert(ABSL_INTERNAL_HAS_CONSTEXPR_CLZ, "clz should be constexpr");
636*9356374aSAndroid Build Coastguard Worker static_assert(ABSL_INTERNAL_HAS_CONSTEXPR_CTZ, "ctz should be constexpr");
637*9356374aSAndroid Build Coastguard Worker #endif
638*9356374aSAndroid Build Coastguard Worker 
639*9356374aSAndroid Build Coastguard Worker }  // namespace
640*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
641*9356374aSAndroid Build Coastguard Worker }  // namespace absl
642