BitVectorTest.cpp revision 597253da97ec4fa5fa4a03c2230ed026b1b6aad6
1cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
2cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//
3cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//                     The LLVM Compiler Infrastructure
4cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//
5cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// This file is distributed under the University of Illinois Open Source
6cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// License. See LICENSE.TXT for details.
7cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//
8cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//===----------------------------------------------------------------------===//
9cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
103f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman// Some of these tests fail on PowerPC for unknown reasons.
113f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman#ifndef __ppc__
123f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman
13cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman#include "llvm/ADT/BitVector.h"
14904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer#include "llvm/ADT/SmallBitVector.h"
15cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman#include "gtest/gtest.h"
16cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
17cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohmanusing namespace llvm;
18cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
19cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohmannamespace {
20cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
21904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer// Test fixture
22904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramertemplate <typename T>
23904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramerclass BitVectorTest : public ::testing::Test { };
24904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer
25904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer// Test both BitVector and SmallBitVector with the same suite of tests.
26904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramertypedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;
27904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes);
28904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer
29904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, TrivialOperation) {
30904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam Vec;
31cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
32cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.size());
33cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
34fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
35cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
36cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.empty());
37cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
38cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(5, true);
39cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(5U, Vec.count());
40cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(5U, Vec.size());
41cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.any());
42fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
43cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.none());
44cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.empty());
45cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
46cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(11);
47cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(5U, Vec.count());
48cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(11U, Vec.size());
49cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.any());
50fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_FALSE(Vec.all());
51cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.none());
52cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.empty());
53cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
54904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam Inv = Vec;
5500570224891da83c5066b8d135232f96786dbd56Jakob Stoklund Olesen  Inv.flip();
56cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(6U, Inv.count());
57cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(11U, Inv.size());
58cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.any());
59fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_FALSE(Inv.all());
60cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.none());
61cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.empty());
62cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
63cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv == Vec);
64cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv != Vec);
6500570224891da83c5066b8d135232f96786dbd56Jakob Stoklund Olesen  Vec.flip();
66cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv == Vec);
67cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv != Vec);
68cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
69cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  // Add some "interesting" data to Vec.
70cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(23, true);
71cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(25, false);
72cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(26, true);
73cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(29, false);
74cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(33, true);
753f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec.resize(57, false);
76cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  unsigned Count = 0;
77cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
78cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    ++Count;
79cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec[i]);
80cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec.test(i));
81cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  }
82cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
83cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, 23u);
84cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[0]);
85cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[32]);
863f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_FALSE(Vec[56]);
873f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec.resize(61, false);
88cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
89904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam Copy = Vec;
90904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam Alt(3, false);
91cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Alt.resize(6, true);
92cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  std::swap(Alt, Vec);
93cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Copy == Alt);
94cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.size() == 6);
95cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.count() == 3);
96cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.find_first() == 3);
97cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  std::swap(Copy, Vec);
98cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
99cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  // Add some more "interesting" data.
100cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(68, true);
101cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(78, false);
102cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(89, true);
103cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(90, false);
104cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(91, true);
105cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(130, false);
106cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Count = 0;
107cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
108cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    ++Count;
109cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec[i]);
110cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec.test(i));
111cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  }
112cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
113cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, 42u);
114cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[0]);
115cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[32]);
116cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[60]);
117cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[129]);
118cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
119cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.flip(60);
120cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[60]);
121cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count + 1, Vec.count());
122cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.flip(60);
123cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[60]);
124cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
125cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
126cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.reset(32);
127cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[32]);
128cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count - 1, Vec.count());
129cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.set(32);
130cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[32]);
131cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
132cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
133cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.flip();
134cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Vec.size() - Count, Vec.count());
135cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
136cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.reset();
137cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
138cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(130U, Vec.size());
139cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
140fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_FALSE(Vec.all());
141cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
142cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.empty());
143cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
144597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  Vec.flip();
145597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  EXPECT_EQ(130U, Vec.count());
146597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  EXPECT_EQ(130U, Vec.size());
147597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  EXPECT_TRUE(Vec.any());
148597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  EXPECT_TRUE(Vec.all());
149597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  EXPECT_FALSE(Vec.none());
150597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer  EXPECT_FALSE(Vec.empty());
151597253da97ec4fa5fa4a03c2230ed026b1b6aad6Benjamin Kramer
152904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  Inv = TypeParam().flip();
153cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Inv.count());
154cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Inv.size());
155cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.any());
156fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Inv.all());
157cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.none());
158cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.empty());
159cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
160cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.clear();
161cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
162cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.size());
163cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
164fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
165cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
166cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.empty());
167cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman}
168cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
169904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, CompoundAssignment) {
170904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam A;
171e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.resize(10);
172e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.set(4);
173e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.set(7);
174e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
175904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam B;
176e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(50);
177e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set(5);
178e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set(18);
179e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
180e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A |= B;
181e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(4));
182e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(5));
183e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(7));
184e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(18));
185c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(4U, A.count());
186c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(50U, A.size());
187e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
188e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(10);
189e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set();
190e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.reset(2);
191e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.reset(7);
192e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A &= B;
193e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_FALSE(A.test(2));
194e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_FALSE(A.test(7));
195c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(2U, A.count());
196c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(50U, A.size());
197e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
198e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(100);
199e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set();
200e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
201e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A ^= B;
202e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(2));
203e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(7));
204c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(98U, A.count());
205c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(100U, A.size());
206cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman}
207e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
208904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, ProxyIndex) {
209904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam Vec(3);
2103f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_TRUE(Vec.none());
2113f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec[0] = Vec[1] = Vec[2] = true;
2123f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_EQ(Vec.size(), Vec.count());
2133f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec[2] = Vec[1] = Vec[0] = false;
2143f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_TRUE(Vec.none());
2153f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman}
2163f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman
217904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, PortableBitMask) {
218904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam A;
219ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  const uint32_t Mask1[] = { 0x80000000, 6, 5 };
220ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
221ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(10);
222ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 3);
223ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(10u, A.size());
224ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_FALSE(A.test(0));
225ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
226ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(32);
227ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 3);
228ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_FALSE(A.test(0));
229ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_TRUE(A.test(31));
230ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(1u, A.count());
231ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
232ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(33);
233ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 1);
234ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(1u, A.count());
235ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 2);
236ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(1u, A.count());
237ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
238ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(34);
239ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 2);
240ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(2u, A.count());
241ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
242ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(65);
243ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 3);
244ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(4u, A.count());
245ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
246ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsNotInMask(Mask1, 1);
247ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(32u+3u, A.count());
248ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
249ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsNotInMask(Mask1, 3);
250ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(65u, A.count());
251ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
252ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(96);
253ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(65u, A.count());
254ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
255ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.clear();
256ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(128);
257ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsNotInMask(Mask1, 3);
258ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(96u-5u, A.count());
259ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
260ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.clearBitsNotInMask(Mask1, 1);
261ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(64-4u, A.count());
262ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen}
263e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
264904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, BinOps) {
265904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam A;
266904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam B;
26703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
26803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.resize(65);
26903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
27003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(B));
27103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
27203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.resize(64);
27303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.set(64);
27403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
27503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(A));
27603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
27703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.set(63);
27803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
27903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(A));
28003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
28103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.set(63);
28203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_TRUE(A.anyCommon(B));
28303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_TRUE(B.anyCommon(A));
28403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
28503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.resize(70);
28603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.set(64);
28703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.reset(63);
28803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.resize(64);
28903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
29003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(A));
29103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen}
2923a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
2933a1c35afbd02b012690c35ec827424c27792ec3fOwen AndersonTYPED_TEST(BitVectorTest, RangeOps) {
2943a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam A;
2953a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  A.resize(256);
2963a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  A.reset();
2973a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  A.set(1, 255);
2983a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
2993a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(A.test(0));
3003a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( A.test(1));
3013a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( A.test(23));
3023a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( A.test(254));
3033a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(A.test(255));
3043a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3053a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam B;
3063a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  B.resize(256);
3073a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  B.set();
3083a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  B.reset(1, 255);
3093a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3103a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( B.test(0));
3113a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(B.test(1));
3123a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(B.test(23));
3133a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(B.test(254));
3143a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( B.test(255));
3153a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3163a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam C;
3173a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  C.resize(3);
3183a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  C.reset();
3193a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  C.set(0, 1);
3203a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3213a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE(C.test(0));
3223a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE( C.test(1));
3233a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE( C.test(2));
3243a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3253a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam D;
3263a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  D.resize(3);
3273a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  D.set();
3283a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  D.reset(0, 1);
3293a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3303a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(D.test(0));
3313a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( D.test(1));
3323a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( D.test(2));
333e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson
334e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  TypeParam E;
335e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  E.resize(128);
336e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  E.reset();
337e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  E.set(1, 33);
338e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson
339e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_FALSE(E.test(0));
340e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_TRUE( E.test(1));
341e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_TRUE( E.test(32));
342e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_FALSE(E.test(33));
3433a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson}
34403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen}
345ce97b75c1d507808abcb67635cfcdce2f48e53c9Dale Johannesen#endif
346