blob: a9fc133c72e26c1c40790a6890a4d26388c4c0f1 [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"
14#include "gtest/gtest.h"
15
16using namespace llvm;
17
18namespace {
19
20TEST(BitVectorTest, TrivialOperation) {
21 BitVector Vec;
22 EXPECT_EQ(0U, Vec.count());
23 EXPECT_EQ(0U, Vec.size());
24 EXPECT_FALSE(Vec.any());
25 EXPECT_TRUE(Vec.none());
26 EXPECT_TRUE(Vec.empty());
27
28 Vec.resize(5, true);
29 EXPECT_EQ(5U, Vec.count());
30 EXPECT_EQ(5U, Vec.size());
31 EXPECT_TRUE(Vec.any());
32 EXPECT_FALSE(Vec.none());
33 EXPECT_FALSE(Vec.empty());
34
35 Vec.resize(11);
36 EXPECT_EQ(5U, Vec.count());
37 EXPECT_EQ(11U, Vec.size());
38 EXPECT_TRUE(Vec.any());
39 EXPECT_FALSE(Vec.none());
40 EXPECT_FALSE(Vec.empty());
41
42 BitVector Inv = ~Vec;
43 EXPECT_EQ(6U, Inv.count());
44 EXPECT_EQ(11U, Inv.size());
45 EXPECT_TRUE(Inv.any());
46 EXPECT_FALSE(Inv.none());
47 EXPECT_FALSE(Inv.empty());
48
49 EXPECT_FALSE(Inv == Vec);
50 EXPECT_TRUE(Inv != Vec);
51 Vec = ~Vec;
52 EXPECT_TRUE(Inv == Vec);
53 EXPECT_FALSE(Inv != Vec);
54
55 // Add some "interesting" data to Vec.
56 Vec.resize(23, true);
57 Vec.resize(25, false);
58 Vec.resize(26, true);
59 Vec.resize(29, false);
60 Vec.resize(33, true);
Dan Gohman3f5e9152010-04-30 20:50:28 +000061 Vec.resize(57, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000062 unsigned Count = 0;
63 for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
64 ++Count;
65 EXPECT_TRUE(Vec[i]);
66 EXPECT_TRUE(Vec.test(i));
67 }
68 EXPECT_EQ(Count, Vec.count());
69 EXPECT_EQ(Count, 23u);
70 EXPECT_FALSE(Vec[0]);
71 EXPECT_TRUE(Vec[32]);
Dan Gohman3f5e9152010-04-30 20:50:28 +000072 EXPECT_FALSE(Vec[56]);
73 Vec.resize(61, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000074
75 BitVector Copy = Vec;
76 BitVector Alt(3, false);
77 Alt.resize(6, true);
78 std::swap(Alt, Vec);
79 EXPECT_TRUE(Copy == Alt);
80 EXPECT_TRUE(Vec.size() == 6);
81 EXPECT_TRUE(Vec.count() == 3);
82 EXPECT_TRUE(Vec.find_first() == 3);
83 std::swap(Copy, Vec);
84
85 // Add some more "interesting" data.
86 Vec.resize(68, true);
87 Vec.resize(78, false);
88 Vec.resize(89, true);
89 Vec.resize(90, false);
90 Vec.resize(91, true);
91 Vec.resize(130, false);
92 Count = 0;
93 for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
94 ++Count;
95 EXPECT_TRUE(Vec[i]);
96 EXPECT_TRUE(Vec.test(i));
97 }
98 EXPECT_EQ(Count, Vec.count());
99 EXPECT_EQ(Count, 42u);
100 EXPECT_FALSE(Vec[0]);
101 EXPECT_TRUE(Vec[32]);
102 EXPECT_FALSE(Vec[60]);
103 EXPECT_FALSE(Vec[129]);
104
105 Vec.flip(60);
106 EXPECT_TRUE(Vec[60]);
107 EXPECT_EQ(Count + 1, Vec.count());
108 Vec.flip(60);
109 EXPECT_FALSE(Vec[60]);
110 EXPECT_EQ(Count, Vec.count());
111
112 Vec.reset(32);
113 EXPECT_FALSE(Vec[32]);
114 EXPECT_EQ(Count - 1, Vec.count());
115 Vec.set(32);
116 EXPECT_TRUE(Vec[32]);
117 EXPECT_EQ(Count, Vec.count());
118
119 Vec.flip();
120 EXPECT_EQ(Vec.size() - Count, Vec.count());
121
122 Vec.reset();
123 EXPECT_EQ(0U, Vec.count());
124 EXPECT_EQ(130U, Vec.size());
125 EXPECT_FALSE(Vec.any());
126 EXPECT_TRUE(Vec.none());
127 EXPECT_FALSE(Vec.empty());
128
129 Inv = ~BitVector();
130 EXPECT_EQ(0U, Inv.count());
131 EXPECT_EQ(0U, Inv.size());
132 EXPECT_FALSE(Inv.any());
133 EXPECT_TRUE(Inv.none());
134 EXPECT_TRUE(Inv.empty());
135
136 Vec.clear();
137 EXPECT_EQ(0U, Vec.count());
138 EXPECT_EQ(0U, Vec.size());
139 EXPECT_FALSE(Vec.any());
140 EXPECT_TRUE(Vec.none());
141 EXPECT_TRUE(Vec.empty());
142}
143
Dan Gohmane7962c92010-02-10 05:54:04 +0000144TEST(BitVectorTest, CompoundAssignment) {
145 BitVector A;
146 A.resize(10);
147 A.set(4);
148 A.set(7);
149
150 BitVector B;
151 B.resize(50);
152 B.set(5);
153 B.set(18);
154
155 A |= B;
156 EXPECT_TRUE(A.test(4));
157 EXPECT_TRUE(A.test(5));
158 EXPECT_TRUE(A.test(7));
159 EXPECT_TRUE(A.test(18));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000160 EXPECT_EQ(4U, A.count());
161 EXPECT_EQ(50U, A.size());
Dan Gohmane7962c92010-02-10 05:54:04 +0000162
163 B.resize(10);
164 B.set();
165 B.reset(2);
166 B.reset(7);
167 A &= B;
168 EXPECT_FALSE(A.test(2));
169 EXPECT_FALSE(A.test(7));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000170 EXPECT_EQ(2U, A.count());
171 EXPECT_EQ(50U, A.size());
Dan Gohmane7962c92010-02-10 05:54:04 +0000172
173 B.resize(100);
174 B.set();
175
176 A ^= B;
177 EXPECT_TRUE(A.test(2));
178 EXPECT_TRUE(A.test(7));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000179 EXPECT_EQ(98U, A.count());
180 EXPECT_EQ(100U, A.size());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000181}
Dan Gohmane7962c92010-02-10 05:54:04 +0000182
Dan Gohman3f5e9152010-04-30 20:50:28 +0000183TEST(BitVectorTest, ProxyIndex) {
184 BitVector Vec(3);
185 EXPECT_TRUE(Vec.none());
186 Vec[0] = Vec[1] = Vec[2] = true;
187 EXPECT_EQ(Vec.size(), Vec.count());
188 Vec[2] = Vec[1] = Vec[0] = false;
189 EXPECT_TRUE(Vec.none());
190}
191
Dan Gohmane7962c92010-02-10 05:54:04 +0000192}
193
Dale Johannesence97b752010-02-09 22:15:27 +0000194#endif