blob: f97be22fd2755fbdd84133aca0e1d86eda7236a9 [file] [log] [blame]
Dan Gohmancb89afc2010-01-05 15:04:49 +00001//===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Dan Gohman3f5e9152010-04-30 20:50:28 +000010// Some of these tests fail on PowerPC for unknown reasons.
11#ifndef __ppc__
12
Dan Gohmancb89afc2010-01-05 15:04:49 +000013#include "llvm/ADT/BitVector.h"
Benjamin Kramer904cf822012-06-16 10:51:07 +000014#include "llvm/ADT/SmallBitVector.h"
Dan Gohmancb89afc2010-01-05 15:04:49 +000015#include "gtest/gtest.h"
16
17using namespace llvm;
18
19namespace {
20
Benjamin Kramer904cf822012-06-16 10:51:07 +000021// Test fixture
22template <typename T>
23class BitVectorTest : public ::testing::Test { };
24
25// Test both BitVector and SmallBitVector with the same suite of tests.
26typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;
27TYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes);
28
29TYPED_TEST(BitVectorTest, TrivialOperation) {
30 TypeParam Vec;
Dan Gohmancb89afc2010-01-05 15:04:49 +000031 EXPECT_EQ(0U, Vec.count());
32 EXPECT_EQ(0U, Vec.size());
33 EXPECT_FALSE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000034 EXPECT_TRUE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000035 EXPECT_TRUE(Vec.none());
36 EXPECT_TRUE(Vec.empty());
37
38 Vec.resize(5, true);
39 EXPECT_EQ(5U, Vec.count());
40 EXPECT_EQ(5U, Vec.size());
41 EXPECT_TRUE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000042 EXPECT_TRUE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000043 EXPECT_FALSE(Vec.none());
44 EXPECT_FALSE(Vec.empty());
45
46 Vec.resize(11);
47 EXPECT_EQ(5U, Vec.count());
48 EXPECT_EQ(11U, Vec.size());
49 EXPECT_TRUE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000050 EXPECT_FALSE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000051 EXPECT_FALSE(Vec.none());
52 EXPECT_FALSE(Vec.empty());
53
Benjamin Kramer904cf822012-06-16 10:51:07 +000054 TypeParam Inv = Vec;
Jakob Stoklund Olesen00570222012-05-14 15:46:27 +000055 Inv.flip();
Dan Gohmancb89afc2010-01-05 15:04:49 +000056 EXPECT_EQ(6U, Inv.count());
57 EXPECT_EQ(11U, Inv.size());
58 EXPECT_TRUE(Inv.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000059 EXPECT_FALSE(Inv.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000060 EXPECT_FALSE(Inv.none());
61 EXPECT_FALSE(Inv.empty());
62
63 EXPECT_FALSE(Inv == Vec);
64 EXPECT_TRUE(Inv != Vec);
Jakob Stoklund Olesen00570222012-05-14 15:46:27 +000065 Vec.flip();
Dan Gohmancb89afc2010-01-05 15:04:49 +000066 EXPECT_TRUE(Inv == Vec);
67 EXPECT_FALSE(Inv != Vec);
68
69 // Add some "interesting" data to Vec.
70 Vec.resize(23, true);
71 Vec.resize(25, false);
72 Vec.resize(26, true);
73 Vec.resize(29, false);
74 Vec.resize(33, true);
Dan Gohman3f5e9152010-04-30 20:50:28 +000075 Vec.resize(57, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000076 unsigned Count = 0;
77 for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
78 ++Count;
79 EXPECT_TRUE(Vec[i]);
80 EXPECT_TRUE(Vec.test(i));
81 }
82 EXPECT_EQ(Count, Vec.count());
83 EXPECT_EQ(Count, 23u);
84 EXPECT_FALSE(Vec[0]);
85 EXPECT_TRUE(Vec[32]);
Dan Gohman3f5e9152010-04-30 20:50:28 +000086 EXPECT_FALSE(Vec[56]);
87 Vec.resize(61, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000088
Benjamin Kramer904cf822012-06-16 10:51:07 +000089 TypeParam Copy = Vec;
90 TypeParam Alt(3, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000091 Alt.resize(6, true);
92 std::swap(Alt, Vec);
93 EXPECT_TRUE(Copy == Alt);
94 EXPECT_TRUE(Vec.size() == 6);
95 EXPECT_TRUE(Vec.count() == 3);
96 EXPECT_TRUE(Vec.find_first() == 3);
97 std::swap(Copy, Vec);
98
99 // Add some more "interesting" data.
100 Vec.resize(68, true);
101 Vec.resize(78, false);
102 Vec.resize(89, true);
103 Vec.resize(90, false);
104 Vec.resize(91, true);
105 Vec.resize(130, false);
106 Count = 0;
107 for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
108 ++Count;
109 EXPECT_TRUE(Vec[i]);
110 EXPECT_TRUE(Vec.test(i));
111 }
112 EXPECT_EQ(Count, Vec.count());
113 EXPECT_EQ(Count, 42u);
114 EXPECT_FALSE(Vec[0]);
115 EXPECT_TRUE(Vec[32]);
116 EXPECT_FALSE(Vec[60]);
117 EXPECT_FALSE(Vec[129]);
118
119 Vec.flip(60);
120 EXPECT_TRUE(Vec[60]);
121 EXPECT_EQ(Count + 1, Vec.count());
122 Vec.flip(60);
123 EXPECT_FALSE(Vec[60]);
124 EXPECT_EQ(Count, Vec.count());
125
126 Vec.reset(32);
127 EXPECT_FALSE(Vec[32]);
128 EXPECT_EQ(Count - 1, Vec.count());
129 Vec.set(32);
130 EXPECT_TRUE(Vec[32]);
131 EXPECT_EQ(Count, Vec.count());
132
133 Vec.flip();
134 EXPECT_EQ(Vec.size() - Count, Vec.count());
135
136 Vec.reset();
137 EXPECT_EQ(0U, Vec.count());
138 EXPECT_EQ(130U, Vec.size());
139 EXPECT_FALSE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +0000140 EXPECT_FALSE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000141 EXPECT_TRUE(Vec.none());
142 EXPECT_FALSE(Vec.empty());
143
Benjamin Kramer597253d2013-06-07 14:14:38 +0000144 Vec.flip();
145 EXPECT_EQ(130U, Vec.count());
146 EXPECT_EQ(130U, Vec.size());
147 EXPECT_TRUE(Vec.any());
148 EXPECT_TRUE(Vec.all());
149 EXPECT_FALSE(Vec.none());
150 EXPECT_FALSE(Vec.empty());
151
Benjamin Kramer904cf822012-06-16 10:51:07 +0000152 Inv = TypeParam().flip();
Dan Gohmancb89afc2010-01-05 15:04:49 +0000153 EXPECT_EQ(0U, Inv.count());
154 EXPECT_EQ(0U, Inv.size());
155 EXPECT_FALSE(Inv.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +0000156 EXPECT_TRUE(Inv.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000157 EXPECT_TRUE(Inv.none());
158 EXPECT_TRUE(Inv.empty());
159
160 Vec.clear();
161 EXPECT_EQ(0U, Vec.count());
162 EXPECT_EQ(0U, Vec.size());
163 EXPECT_FALSE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +0000164 EXPECT_TRUE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000165 EXPECT_TRUE(Vec.none());
166 EXPECT_TRUE(Vec.empty());
167}
168
Benjamin Kramer904cf822012-06-16 10:51:07 +0000169TYPED_TEST(BitVectorTest, CompoundAssignment) {
170 TypeParam A;
Dan Gohmane7962c92010-02-10 05:54:04 +0000171 A.resize(10);
172 A.set(4);
173 A.set(7);
174
Benjamin Kramer904cf822012-06-16 10:51:07 +0000175 TypeParam B;
Dan Gohmane7962c92010-02-10 05:54:04 +0000176 B.resize(50);
177 B.set(5);
178 B.set(18);
179
180 A |= B;
181 EXPECT_TRUE(A.test(4));
182 EXPECT_TRUE(A.test(5));
183 EXPECT_TRUE(A.test(7));
184 EXPECT_TRUE(A.test(18));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000185 EXPECT_EQ(4U, A.count());
186 EXPECT_EQ(50U, A.size());
Dan Gohmane7962c92010-02-10 05:54:04 +0000187
188 B.resize(10);
189 B.set();
190 B.reset(2);
191 B.reset(7);
192 A &= B;
193 EXPECT_FALSE(A.test(2));
194 EXPECT_FALSE(A.test(7));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000195 EXPECT_EQ(2U, A.count());
196 EXPECT_EQ(50U, A.size());
Dan Gohmane7962c92010-02-10 05:54:04 +0000197
198 B.resize(100);
199 B.set();
200
201 A ^= B;
202 EXPECT_TRUE(A.test(2));
203 EXPECT_TRUE(A.test(7));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000204 EXPECT_EQ(98U, A.count());
205 EXPECT_EQ(100U, A.size());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000206}
Dan Gohmane7962c92010-02-10 05:54:04 +0000207
Benjamin Kramer904cf822012-06-16 10:51:07 +0000208TYPED_TEST(BitVectorTest, ProxyIndex) {
209 TypeParam Vec(3);
Dan Gohman3f5e9152010-04-30 20:50:28 +0000210 EXPECT_TRUE(Vec.none());
211 Vec[0] = Vec[1] = Vec[2] = true;
212 EXPECT_EQ(Vec.size(), Vec.count());
213 Vec[2] = Vec[1] = Vec[0] = false;
214 EXPECT_TRUE(Vec.none());
215}
216
Benjamin Kramer904cf822012-06-16 10:51:07 +0000217TYPED_TEST(BitVectorTest, PortableBitMask) {
218 TypeParam A;
Jakob Stoklund Olesenff5bad02012-01-17 01:24:32 +0000219 const uint32_t Mask1[] = { 0x80000000, 6, 5 };
220
221 A.resize(10);
222 A.setBitsInMask(Mask1, 3);
223 EXPECT_EQ(10u, A.size());
224 EXPECT_FALSE(A.test(0));
225
226 A.resize(32);
227 A.setBitsInMask(Mask1, 3);
228 EXPECT_FALSE(A.test(0));
229 EXPECT_TRUE(A.test(31));
230 EXPECT_EQ(1u, A.count());
231
232 A.resize(33);
233 A.setBitsInMask(Mask1, 1);
234 EXPECT_EQ(1u, A.count());
235 A.setBitsInMask(Mask1, 2);
236 EXPECT_EQ(1u, A.count());
237
238 A.resize(34);
239 A.setBitsInMask(Mask1, 2);
240 EXPECT_EQ(2u, A.count());
241
242 A.resize(65);
243 A.setBitsInMask(Mask1, 3);
244 EXPECT_EQ(4u, A.count());
245
246 A.setBitsNotInMask(Mask1, 1);
247 EXPECT_EQ(32u+3u, A.count());
248
249 A.setBitsNotInMask(Mask1, 3);
250 EXPECT_EQ(65u, A.count());
251
252 A.resize(96);
253 EXPECT_EQ(65u, A.count());
254
255 A.clear();
256 A.resize(128);
257 A.setBitsNotInMask(Mask1, 3);
258 EXPECT_EQ(96u-5u, A.count());
259
260 A.clearBitsNotInMask(Mask1, 1);
261 EXPECT_EQ(64-4u, A.count());
262}
Dan Gohmane7962c92010-02-10 05:54:04 +0000263
Benjamin Kramer904cf822012-06-16 10:51:07 +0000264TYPED_TEST(BitVectorTest, BinOps) {
265 TypeParam A;
266 TypeParam B;
Jakob Stoklund Olesen03a38112012-05-14 15:01:19 +0000267
268 A.resize(65);
269 EXPECT_FALSE(A.anyCommon(B));
270 EXPECT_FALSE(B.anyCommon(B));
271
272 B.resize(64);
273 A.set(64);
274 EXPECT_FALSE(A.anyCommon(B));
275 EXPECT_FALSE(B.anyCommon(A));
276
277 B.set(63);
278 EXPECT_FALSE(A.anyCommon(B));
279 EXPECT_FALSE(B.anyCommon(A));
280
281 A.set(63);
282 EXPECT_TRUE(A.anyCommon(B));
283 EXPECT_TRUE(B.anyCommon(A));
284
285 B.resize(70);
286 B.set(64);
287 B.reset(63);
288 A.resize(64);
289 EXPECT_FALSE(A.anyCommon(B));
290 EXPECT_FALSE(B.anyCommon(A));
291}
Owen Anderson3a1c35a2012-10-15 22:05:27 +0000292
293TYPED_TEST(BitVectorTest, RangeOps) {
294 TypeParam A;
295 A.resize(256);
296 A.reset();
297 A.set(1, 255);
298
299 EXPECT_FALSE(A.test(0));
300 EXPECT_TRUE( A.test(1));
301 EXPECT_TRUE( A.test(23));
302 EXPECT_TRUE( A.test(254));
303 EXPECT_FALSE(A.test(255));
304
305 TypeParam B;
306 B.resize(256);
307 B.set();
308 B.reset(1, 255);
309
310 EXPECT_TRUE( B.test(0));
311 EXPECT_FALSE(B.test(1));
312 EXPECT_FALSE(B.test(23));
313 EXPECT_FALSE(B.test(254));
314 EXPECT_TRUE( B.test(255));
315
316 TypeParam C;
317 C.resize(3);
318 C.reset();
319 C.set(0, 1);
320
321 EXPECT_TRUE(C.test(0));
322 EXPECT_FALSE( C.test(1));
323 EXPECT_FALSE( C.test(2));
324
325 TypeParam D;
326 D.resize(3);
327 D.set();
328 D.reset(0, 1);
329
330 EXPECT_FALSE(D.test(0));
331 EXPECT_TRUE( D.test(1));
332 EXPECT_TRUE( D.test(2));
Owen Andersone3f7be32012-10-16 06:04:27 +0000333
334 TypeParam E;
335 E.resize(128);
336 E.reset();
337 E.set(1, 33);
338
339 EXPECT_FALSE(E.test(0));
340 EXPECT_TRUE( E.test(1));
341 EXPECT_TRUE( E.test(32));
342 EXPECT_FALSE(E.test(33));
Owen Anderson3a1c35a2012-10-15 22:05:27 +0000343}
Jakob Stoklund Olesen03a38112012-05-14 15:01:19 +0000344}
Dale Johannesence97b752010-02-09 22:15:27 +0000345#endif