1 //===-- Unittests for bitset ----------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "src/__support/CPP/bitset.h"
10 #include "test/UnitTest/Test.h"
12 TEST(LlvmLibcBitsetTest
, SetBitForSizeEqualToOne
) {
13 LIBC_NAMESPACE::cpp::bitset
<1> bitset
;
14 EXPECT_FALSE(bitset
.test(0));
16 EXPECT_TRUE(bitset
.test(0));
19 TEST(LlvmLibcBitsetTest
, SetsBitsForSizeEqualToTwo
) {
20 LIBC_NAMESPACE::cpp::bitset
<2> bitset
;
22 EXPECT_TRUE(bitset
.test(0));
24 EXPECT_TRUE(bitset
.test(1));
27 TEST(LlvmLibcBitsetTest
, SetsAllBitsForSizeLessThanEight
) {
28 LIBC_NAMESPACE::cpp::bitset
<7> bitset
;
29 for (size_t i
= 0; i
< 7; ++i
)
31 // Verify all bits are now set.
32 for (size_t j
= 0; j
< 7; ++j
)
33 EXPECT_TRUE(bitset
.test(j
));
36 TEST(LlvmLibcBitsetTest
, SetsAllBitsForSizeLessThanSixteen
) {
37 LIBC_NAMESPACE::cpp::bitset
<15> bitset
;
38 for (size_t i
= 0; i
< 15; ++i
)
40 // Verify all bits are now set.
41 for (size_t j
= 0; j
< 15; ++j
)
42 EXPECT_TRUE(bitset
.test(j
));
45 TEST(LlvmLibcBitsetTest
, SetsAllBitsForSizeLessThanThirtyTwo
) {
46 LIBC_NAMESPACE::cpp::bitset
<31> bitset
;
47 for (size_t i
= 0; i
< 31; ++i
)
49 // Verify all bits are now set.
50 for (size_t j
= 0; j
< 31; ++j
)
51 EXPECT_TRUE(bitset
.test(j
));
54 TEST(LlvmLibcBitsetTest
, DefaultHasNoSetBits
) {
55 LIBC_NAMESPACE::cpp::bitset
<64> bitset
;
56 for (size_t i
= 0; i
< 64; ++i
) {
57 EXPECT_FALSE(bitset
.test(i
));
59 // Same for odd number.
60 LIBC_NAMESPACE::cpp::bitset
<65> odd_bitset
;
61 for (size_t i
= 0; i
< 65; ++i
) {
62 EXPECT_FALSE(odd_bitset
.test(i
));
66 TEST(LlvmLibcBitsetTest
, SettingBitXDoesNotSetBitY
) {
67 for (size_t i
= 0; i
< 256; ++i
) {
68 // Initialize within the loop to start with a fresh bitset.
69 LIBC_NAMESPACE::cpp::bitset
<256> bitset
;
72 for (size_t neighbor
= 0; neighbor
< 256; ++neighbor
) {
74 EXPECT_TRUE(bitset
.test(neighbor
));
76 EXPECT_FALSE(bitset
.test(neighbor
));
79 // Same for odd number.
80 for (size_t i
= 0; i
< 255; ++i
) {
82 LIBC_NAMESPACE::cpp::bitset
<255> bitset
;
85 for (size_t neighbor
= 0; neighbor
< 255; ++neighbor
) {
87 EXPECT_TRUE(bitset
.test(neighbor
));
89 EXPECT_FALSE(bitset
.test(neighbor
));
94 TEST(LlvmLibcBitsetTest
, SettingBitXDoesNotResetBitY
) {
95 LIBC_NAMESPACE::cpp::bitset
<128> bitset
;
96 for (size_t i
= 0; i
< 128; ++i
)
99 // Verify all bits are now set.
100 for (size_t j
= 0; j
< 128; ++j
)
101 EXPECT_TRUE(bitset
.test(j
));
104 TEST(LlvmLibcBitsetTest
, FlipTest
) {
105 LIBC_NAMESPACE::cpp::bitset
<128> bitset
;
109 // Verify all bits are now set.
110 for (size_t j
= 0; j
< 128; ++j
)
111 EXPECT_TRUE(bitset
.test(j
));
115 // Verify all bits are now unset.
116 for (size_t j
= 0; j
< 128; ++j
)
117 EXPECT_FALSE(bitset
.test(j
));
120 for (size_t j
= 0; j
< 64; ++j
)
124 for (size_t j
= 0; j
< 128; ++j
)
125 EXPECT_EQ(bitset
.test(j
), (j
% 2) == 0);
129 // Check that the odd set of bits is now true.
130 for (size_t j
= 0; j
< 128; ++j
)
131 EXPECT_EQ(bitset
.test(j
), j
% 2 != 0);
133 // Set the first half of the bits.
134 for (size_t j
= 0; j
< 64; ++j
)
137 // The pattern should now be 111...1110101...010
139 // Flip to get 000...0001010...101
142 // Verify that the first half of bits are false and the even bits in the
143 // second half are true.
144 for (size_t j
= 0; j
< 128; ++j
)
145 EXPECT_EQ(bitset
.test(j
), (j
> 63) && (j
% 2 == 0));
148 TEST(LlvmLibcBitsetTest
, EqualTest
) {
149 LIBC_NAMESPACE::cpp::bitset
<128> bitset_a
;
150 LIBC_NAMESPACE::cpp::bitset
<128> bitset_b
;
152 // New sets should be empty, and so they should be equal.
153 ASSERT_TRUE(bitset_a
== bitset_b
);
157 // Setting one bit should be enough.
158 ASSERT_FALSE(bitset_a
== bitset_b
);
162 // Setting the same bit on a different unit shouldn't be equal.
163 ASSERT_FALSE(bitset_a
== bitset_b
);
167 // The first unit matching shouldn't be equal.
168 ASSERT_FALSE(bitset_a
== bitset_b
);
172 // Now they should be equal.
173 ASSERT_TRUE(bitset_a
== bitset_b
);
176 TEST(LlvmLibcBitsetTest
, SetRangeTest
) {
177 LIBC_NAMESPACE::cpp::bitset
<256> bitset
;
179 // Range from 1 to 1 should only set bit 1
180 bitset
.set_range(1, 1);
182 for (size_t j
= 0; j
< 256; ++j
)
183 EXPECT_EQ(bitset
.test(j
), j
== 1);
185 // reset all bits back to 0.
188 // Range from 2 to 5 should set bits 2-5
189 bitset
.set_range(2, 5);
190 for (size_t j
= 0; j
< 256; ++j
)
191 EXPECT_EQ(bitset
.test(j
), (j
>= 2 && j
<= 5));
194 // Check setting exactly one unit
195 bitset
.set_range(0, 63);
196 for (size_t j
= 0; j
< 256; ++j
)
197 EXPECT_EQ(bitset
.test(j
), j
<= 63);
200 // Check ranges across unit boundaries work.
201 bitset
.set_range(1, 64);
202 for (size_t j
= 0; j
< 256; ++j
)
203 EXPECT_EQ(bitset
.test(j
), (j
>= 1 && j
<= 64));
206 // Same, but closer together.
207 bitset
.set_range(63, 64);
208 for (size_t j
= 0; j
< 256; ++j
)
209 EXPECT_EQ(bitset
.test(j
), (j
>= 63 && j
<= 64));
212 // Check that ranges with a unit in the middle work.
213 bitset
.set_range(63, 129);
214 for (size_t j
= 0; j
< 256; ++j
)
215 EXPECT_EQ(bitset
.test(j
), (j
>= 63 && j
<= 129));
218 // Check that the whole range being set works.
219 bitset
.set_range(0, 255);
220 for (size_t j
= 0; j
< 256; ++j
)
221 EXPECT_TRUE(bitset
.test(j
));