Add an insert() method to MapVector. Adds the first MapVector unit test.
[oota-llvm.git] / unittests / ADT / BitVectorTest.cpp
1 //===- 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
10 // Some of these tests fail on PowerPC for unknown reasons.
11 #ifndef __ppc__
12
13 #include "llvm/ADT/BitVector.h"
14 #include "llvm/ADT/SmallBitVector.h"
15 #include "gtest/gtest.h"
16
17 using namespace llvm;
18
19 namespace {
20
21 // Test fixture
22 template <typename T>
23 class BitVectorTest : public ::testing::Test { };
24
25 // Test both BitVector and SmallBitVector with the same suite of tests.
26 typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;
27 TYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes);
28
29 TYPED_TEST(BitVectorTest, TrivialOperation) {
30   TypeParam Vec;
31   EXPECT_EQ(0U, Vec.count());
32   EXPECT_EQ(0U, Vec.size());
33   EXPECT_FALSE(Vec.any());
34   EXPECT_TRUE(Vec.all());
35   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());
42   EXPECT_TRUE(Vec.all());
43   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());
50   EXPECT_FALSE(Vec.all());
51   EXPECT_FALSE(Vec.none());
52   EXPECT_FALSE(Vec.empty());
53
54   TypeParam Inv = Vec;
55   Inv.flip();
56   EXPECT_EQ(6U, Inv.count());
57   EXPECT_EQ(11U, Inv.size());
58   EXPECT_TRUE(Inv.any());
59   EXPECT_FALSE(Inv.all());
60   EXPECT_FALSE(Inv.none());
61   EXPECT_FALSE(Inv.empty());
62
63   EXPECT_FALSE(Inv == Vec);
64   EXPECT_TRUE(Inv != Vec);
65   Vec.flip();
66   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);
75   Vec.resize(57, false);
76   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]);
86   EXPECT_FALSE(Vec[56]);
87   Vec.resize(61, false);
88
89   TypeParam Copy = Vec;
90   TypeParam Alt(3, false);
91   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());
140   EXPECT_FALSE(Vec.all());
141   EXPECT_TRUE(Vec.none());
142   EXPECT_FALSE(Vec.empty());
143
144   Inv = TypeParam().flip();
145   EXPECT_EQ(0U, Inv.count());
146   EXPECT_EQ(0U, Inv.size());
147   EXPECT_FALSE(Inv.any());
148   EXPECT_TRUE(Inv.all());
149   EXPECT_TRUE(Inv.none());
150   EXPECT_TRUE(Inv.empty());
151
152   Vec.clear();
153   EXPECT_EQ(0U, Vec.count());
154   EXPECT_EQ(0U, Vec.size());
155   EXPECT_FALSE(Vec.any());
156   EXPECT_TRUE(Vec.all());
157   EXPECT_TRUE(Vec.none());
158   EXPECT_TRUE(Vec.empty());
159 }
160
161 TYPED_TEST(BitVectorTest, CompoundAssignment) {
162   TypeParam A;
163   A.resize(10);
164   A.set(4);
165   A.set(7);
166
167   TypeParam B;
168   B.resize(50);
169   B.set(5);
170   B.set(18);
171
172   A |= B;
173   EXPECT_TRUE(A.test(4));
174   EXPECT_TRUE(A.test(5));
175   EXPECT_TRUE(A.test(7));
176   EXPECT_TRUE(A.test(18));
177   EXPECT_EQ(4U, A.count());
178   EXPECT_EQ(50U, A.size());
179
180   B.resize(10);
181   B.set();
182   B.reset(2);
183   B.reset(7);
184   A &= B;
185   EXPECT_FALSE(A.test(2));
186   EXPECT_FALSE(A.test(7));
187   EXPECT_EQ(2U, A.count());
188   EXPECT_EQ(50U, A.size());
189
190   B.resize(100);
191   B.set();
192
193   A ^= B;
194   EXPECT_TRUE(A.test(2));
195   EXPECT_TRUE(A.test(7));
196   EXPECT_EQ(98U, A.count());
197   EXPECT_EQ(100U, A.size());
198 }
199
200 TYPED_TEST(BitVectorTest, ProxyIndex) {
201   TypeParam Vec(3);
202   EXPECT_TRUE(Vec.none());
203   Vec[0] = Vec[1] = Vec[2] = true;
204   EXPECT_EQ(Vec.size(), Vec.count());
205   Vec[2] = Vec[1] = Vec[0] = false;
206   EXPECT_TRUE(Vec.none());
207 }
208
209 TYPED_TEST(BitVectorTest, PortableBitMask) {
210   TypeParam A;
211   const uint32_t Mask1[] = { 0x80000000, 6, 5 };
212
213   A.resize(10);
214   A.setBitsInMask(Mask1, 3);
215   EXPECT_EQ(10u, A.size());
216   EXPECT_FALSE(A.test(0));
217
218   A.resize(32);
219   A.setBitsInMask(Mask1, 3);
220   EXPECT_FALSE(A.test(0));
221   EXPECT_TRUE(A.test(31));
222   EXPECT_EQ(1u, A.count());
223
224   A.resize(33);
225   A.setBitsInMask(Mask1, 1);
226   EXPECT_EQ(1u, A.count());
227   A.setBitsInMask(Mask1, 2);
228   EXPECT_EQ(1u, A.count());
229
230   A.resize(34);
231   A.setBitsInMask(Mask1, 2);
232   EXPECT_EQ(2u, A.count());
233
234   A.resize(65);
235   A.setBitsInMask(Mask1, 3);
236   EXPECT_EQ(4u, A.count());
237
238   A.setBitsNotInMask(Mask1, 1);
239   EXPECT_EQ(32u+3u, A.count());
240
241   A.setBitsNotInMask(Mask1, 3);
242   EXPECT_EQ(65u, A.count());
243
244   A.resize(96);
245   EXPECT_EQ(65u, A.count());
246
247   A.clear();
248   A.resize(128);
249   A.setBitsNotInMask(Mask1, 3);
250   EXPECT_EQ(96u-5u, A.count());
251
252   A.clearBitsNotInMask(Mask1, 1);
253   EXPECT_EQ(64-4u, A.count());
254 }
255
256 TYPED_TEST(BitVectorTest, BinOps) {
257   TypeParam A;
258   TypeParam B;
259
260   A.resize(65);
261   EXPECT_FALSE(A.anyCommon(B));
262   EXPECT_FALSE(B.anyCommon(B));
263
264   B.resize(64);
265   A.set(64);
266   EXPECT_FALSE(A.anyCommon(B));
267   EXPECT_FALSE(B.anyCommon(A));
268
269   B.set(63);
270   EXPECT_FALSE(A.anyCommon(B));
271   EXPECT_FALSE(B.anyCommon(A));
272
273   A.set(63);
274   EXPECT_TRUE(A.anyCommon(B));
275   EXPECT_TRUE(B.anyCommon(A));
276
277   B.resize(70);
278   B.set(64);
279   B.reset(63);
280   A.resize(64);
281   EXPECT_FALSE(A.anyCommon(B));
282   EXPECT_FALSE(B.anyCommon(A));
283 }
284
285 TYPED_TEST(BitVectorTest, RangeOps) {
286   TypeParam A;
287   A.resize(256);
288   A.reset();
289   A.set(1, 255);
290
291   EXPECT_FALSE(A.test(0));
292   EXPECT_TRUE( A.test(1));
293   EXPECT_TRUE( A.test(23));
294   EXPECT_TRUE( A.test(254));
295   EXPECT_FALSE(A.test(255));
296
297   TypeParam B;
298   B.resize(256);
299   B.set();
300   B.reset(1, 255);
301
302   EXPECT_TRUE( B.test(0));
303   EXPECT_FALSE(B.test(1));
304   EXPECT_FALSE(B.test(23));
305   EXPECT_FALSE(B.test(254));
306   EXPECT_TRUE( B.test(255));
307
308   TypeParam C;
309   C.resize(3);
310   C.reset();
311   C.set(0, 1);
312
313   EXPECT_TRUE(C.test(0));
314   EXPECT_FALSE( C.test(1));
315   EXPECT_FALSE( C.test(2));
316
317   TypeParam D;
318   D.resize(3);
319   D.set();
320   D.reset(0, 1);
321
322   EXPECT_FALSE(D.test(0));
323   EXPECT_TRUE( D.test(1));
324   EXPECT_TRUE( D.test(2));
325
326   TypeParam E;
327   E.resize(128);
328   E.reset();
329   E.set(1, 33);
330
331   EXPECT_FALSE(E.test(0));
332   EXPECT_TRUE( E.test(1));
333   EXPECT_TRUE( E.test(32));
334   EXPECT_FALSE(E.test(33));
335 }
336 }
337 #endif