1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker // This file contains the unit tests for the bit utilities.
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include "base/bits.h"
8*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
11*635a8641SAndroid Build Coastguard Worker
12*635a8641SAndroid Build Coastguard Worker #include <limits>
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Worker namespace base {
17*635a8641SAndroid Build Coastguard Worker namespace bits {
18*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,Log2Floor)19*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, Log2Floor) {
20*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-1, Log2Floor(0));
21*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, Log2Floor(1));
22*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, Log2Floor(2));
23*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, Log2Floor(3));
24*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, Log2Floor(4));
25*635a8641SAndroid Build Coastguard Worker for (int i = 3; i < 31; ++i) {
26*635a8641SAndroid Build Coastguard Worker unsigned int value = 1U << i;
27*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, Log2Floor(value));
28*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, Log2Floor(value + 1));
29*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, Log2Floor(value + 2));
30*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i - 1, Log2Floor(value - 1));
31*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i - 1, Log2Floor(value - 2));
32*635a8641SAndroid Build Coastguard Worker }
33*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31, Log2Floor(0xffffffffU));
34*635a8641SAndroid Build Coastguard Worker }
35*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,Log2Ceiling)36*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, Log2Ceiling) {
37*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-1, Log2Ceiling(0));
38*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, Log2Ceiling(1));
39*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, Log2Ceiling(2));
40*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, Log2Ceiling(3));
41*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, Log2Ceiling(4));
42*635a8641SAndroid Build Coastguard Worker for (int i = 3; i < 31; ++i) {
43*635a8641SAndroid Build Coastguard Worker unsigned int value = 1U << i;
44*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, Log2Ceiling(value));
45*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, Log2Ceiling(value + 1));
46*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i + 1, Log2Ceiling(value + 2));
47*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, Log2Ceiling(value - 1));
48*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(i, Log2Ceiling(value - 2));
49*635a8641SAndroid Build Coastguard Worker }
50*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(32, Log2Ceiling(0xffffffffU));
51*635a8641SAndroid Build Coastguard Worker }
52*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,Align)53*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, Align) {
54*635a8641SAndroid Build Coastguard Worker const size_t kSizeTMax = std::numeric_limits<size_t>::max();
55*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0ul, Align(0, 4));
56*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4ul, Align(1, 4));
57*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4096ul, Align(1, 4096));
58*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4096ul, Align(4096, 4096));
59*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4096ul, Align(4095, 4096));
60*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8192ul, Align(4097, 4096));
61*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kSizeTMax - 31, Align(kSizeTMax - 62, 32));
62*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kSizeTMax / 2 + 1, Align(1, kSizeTMax / 2 + 1));
63*635a8641SAndroid Build Coastguard Worker }
64*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountLeadingZeroBits8)65*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountLeadingZeroBits8) {
66*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8u, CountLeadingZeroBits(uint8_t{0}));
67*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(7u, CountLeadingZeroBits(uint8_t{1}));
68*635a8641SAndroid Build Coastguard Worker for (uint8_t shift = 0; shift <= 7; shift++) {
69*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(7u - shift,
70*635a8641SAndroid Build Coastguard Worker CountLeadingZeroBits(static_cast<uint8_t>(1 << shift)));
71*635a8641SAndroid Build Coastguard Worker }
72*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountLeadingZeroBits(uint8_t{0x0f}));
73*635a8641SAndroid Build Coastguard Worker }
74*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountLeadingZeroBits16)75*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountLeadingZeroBits16) {
76*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(16u, CountLeadingZeroBits(uint16_t{0}));
77*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(15u, CountLeadingZeroBits(uint16_t{1}));
78*635a8641SAndroid Build Coastguard Worker for (uint16_t shift = 0; shift <= 15; shift++) {
79*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(15u - shift,
80*635a8641SAndroid Build Coastguard Worker CountLeadingZeroBits(static_cast<uint16_t>(1 << shift)));
81*635a8641SAndroid Build Coastguard Worker }
82*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountLeadingZeroBits(uint16_t{0x0f0f}));
83*635a8641SAndroid Build Coastguard Worker }
84*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountLeadingZeroBits32)85*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountLeadingZeroBits32) {
86*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(32u, CountLeadingZeroBits(uint32_t{0}));
87*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31u, CountLeadingZeroBits(uint32_t{1}));
88*635a8641SAndroid Build Coastguard Worker for (uint32_t shift = 0; shift <= 31; shift++) {
89*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31u - shift, CountLeadingZeroBits(uint32_t{1} << shift));
90*635a8641SAndroid Build Coastguard Worker }
91*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountLeadingZeroBits(uint32_t{0x0f0f0f0f}));
92*635a8641SAndroid Build Coastguard Worker }
93*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountTrailingeZeroBits8)94*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountTrailingeZeroBits8) {
95*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8u, CountTrailingZeroBits(uint8_t{0}));
96*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(7u, CountTrailingZeroBits(uint8_t{128}));
97*635a8641SAndroid Build Coastguard Worker for (uint8_t shift = 0; shift <= 7; shift++) {
98*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(shift, CountTrailingZeroBits(static_cast<uint8_t>(1 << shift)));
99*635a8641SAndroid Build Coastguard Worker }
100*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountTrailingZeroBits(uint8_t{0xf0}));
101*635a8641SAndroid Build Coastguard Worker }
102*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountTrailingeZeroBits16)103*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountTrailingeZeroBits16) {
104*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(16u, CountTrailingZeroBits(uint16_t{0}));
105*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(15u, CountTrailingZeroBits(uint16_t{32768}));
106*635a8641SAndroid Build Coastguard Worker for (uint16_t shift = 0; shift <= 15; shift++) {
107*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(shift, CountTrailingZeroBits(static_cast<uint16_t>(1 << shift)));
108*635a8641SAndroid Build Coastguard Worker }
109*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountTrailingZeroBits(uint16_t{0xf0f0}));
110*635a8641SAndroid Build Coastguard Worker }
111*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountTrailingeZeroBits32)112*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountTrailingeZeroBits32) {
113*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(32u, CountTrailingZeroBits(uint32_t{0}));
114*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31u, CountTrailingZeroBits(uint32_t{1} << 31));
115*635a8641SAndroid Build Coastguard Worker for (uint32_t shift = 0; shift <= 31; shift++) {
116*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(shift, CountTrailingZeroBits(uint32_t{1} << shift));
117*635a8641SAndroid Build Coastguard Worker }
118*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountTrailingZeroBits(uint32_t{0xf0f0f0f0}));
119*635a8641SAndroid Build Coastguard Worker }
120*635a8641SAndroid Build Coastguard Worker
121*635a8641SAndroid Build Coastguard Worker #if defined(ARCH_CPU_64_BITS)
122*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountLeadingZeroBits64)123*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountLeadingZeroBits64) {
124*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(64u, CountLeadingZeroBits(uint64_t{0}));
125*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(63u, CountLeadingZeroBits(uint64_t{1}));
126*635a8641SAndroid Build Coastguard Worker for (uint64_t shift = 0; shift <= 63; shift++) {
127*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(63u - shift, CountLeadingZeroBits(uint64_t{1} << shift));
128*635a8641SAndroid Build Coastguard Worker }
129*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountLeadingZeroBits(uint64_t{0x0f0f0f0f0f0f0f0f}));
130*635a8641SAndroid Build Coastguard Worker }
131*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountTrailingeZeroBits64)132*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountTrailingeZeroBits64) {
133*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(64u, CountTrailingZeroBits(uint64_t{0}));
134*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(63u, CountTrailingZeroBits(uint64_t{1} << 63));
135*635a8641SAndroid Build Coastguard Worker for (uint64_t shift = 0; shift <= 31; shift++) {
136*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(shift, CountTrailingZeroBits(uint64_t{1} << shift));
137*635a8641SAndroid Build Coastguard Worker }
138*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4u, CountTrailingZeroBits(uint64_t{0xf0f0f0f0f0f0f0f0}));
139*635a8641SAndroid Build Coastguard Worker }
140*635a8641SAndroid Build Coastguard Worker
141*635a8641SAndroid Build Coastguard Worker #endif // ARCH_CPU_64_BITS
142*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountLeadingZeroBitsSizeT)143*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountLeadingZeroBitsSizeT) {
144*635a8641SAndroid Build Coastguard Worker #if defined(ARCH_CPU_64_BITS)
145*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(64u, CountLeadingZeroBitsSizeT(size_t{0}));
146*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(63u, CountLeadingZeroBitsSizeT(size_t{1}));
147*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(32u, CountLeadingZeroBitsSizeT(size_t{1} << 31));
148*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1u, CountLeadingZeroBitsSizeT(size_t{1} << 62));
149*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, CountLeadingZeroBitsSizeT(size_t{1} << 63));
150*635a8641SAndroid Build Coastguard Worker #else
151*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(32u, CountLeadingZeroBitsSizeT(size_t{0}));
152*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31u, CountLeadingZeroBitsSizeT(size_t{1}));
153*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1u, CountLeadingZeroBitsSizeT(size_t{1} << 30));
154*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, CountLeadingZeroBitsSizeT(size_t{1} << 31));
155*635a8641SAndroid Build Coastguard Worker #endif // ARCH_CPU_64_BITS
156*635a8641SAndroid Build Coastguard Worker }
157*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,CountTrailingZeroBitsSizeT)158*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, CountTrailingZeroBitsSizeT) {
159*635a8641SAndroid Build Coastguard Worker #if defined(ARCH_CPU_64_BITS)
160*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(64u, CountTrailingZeroBitsSizeT(size_t{0}));
161*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(63u, CountTrailingZeroBitsSizeT(size_t{1} << 63));
162*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31u, CountTrailingZeroBitsSizeT(size_t{1} << 31));
163*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1u, CountTrailingZeroBitsSizeT(size_t{2}));
164*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, CountTrailingZeroBitsSizeT(size_t{1}));
165*635a8641SAndroid Build Coastguard Worker #else
166*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(32u, CountTrailingZeroBitsSizeT(size_t{0}));
167*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31u, CountTrailingZeroBitsSizeT(size_t{1} << 31));
168*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1u, CountTrailingZeroBitsSizeT(size_t{2}));
169*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0u, CountTrailingZeroBitsSizeT(size_t{1}));
170*635a8641SAndroid Build Coastguard Worker #endif // ARCH_CPU_64_BITS
171*635a8641SAndroid Build Coastguard Worker }
172*635a8641SAndroid Build Coastguard Worker
TEST(BitsTest,PowerOfTwo)173*635a8641SAndroid Build Coastguard Worker TEST(BitsTest, PowerOfTwo) {
174*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(-1));
175*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(0));
176*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(IsPowerOfTwo(1));
177*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(IsPowerOfTwo(2));
178*635a8641SAndroid Build Coastguard Worker // Unsigned 64 bit cases.
179*635a8641SAndroid Build Coastguard Worker for (uint32_t i = 2; i < 64; i++) {
180*635a8641SAndroid Build Coastguard Worker const uint64_t val = uint64_t{1} << i;
181*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(val - 1));
182*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(IsPowerOfTwo(val));
183*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(val + 1));
184*635a8641SAndroid Build Coastguard Worker }
185*635a8641SAndroid Build Coastguard Worker // Signed 64 bit cases.
186*635a8641SAndroid Build Coastguard Worker for (uint32_t i = 2; i < 63; i++) {
187*635a8641SAndroid Build Coastguard Worker const int64_t val = int64_t{1} << i;
188*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(val - 1));
189*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(IsPowerOfTwo(val));
190*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(val + 1));
191*635a8641SAndroid Build Coastguard Worker }
192*635a8641SAndroid Build Coastguard Worker // Signed integers with only the last bit set are negative, not powers of two.
193*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(IsPowerOfTwo(int64_t{1} << 63));
194*635a8641SAndroid Build Coastguard Worker }
195*635a8641SAndroid Build Coastguard Worker
196*635a8641SAndroid Build Coastguard Worker } // namespace bits
197*635a8641SAndroid Build Coastguard Worker } // namespace base
198