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.
11496cf2308acf4bb719a015517f27dff10db7de49Rafael Espindola#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
152a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  Vec.resize(64);
153a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_EQ(64U, Vec.count());
154a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_EQ(64U, Vec.size());
155a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_TRUE(Vec.any());
156a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_TRUE(Vec.all());
157a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_FALSE(Vec.none());
158a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_FALSE(Vec.empty());
159a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer
160a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  Vec.flip();
161a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_EQ(0U, Vec.count());
162a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_EQ(64U, Vec.size());
163a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_FALSE(Vec.any());
164a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_FALSE(Vec.all());
165a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_TRUE(Vec.none());
166a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer  EXPECT_FALSE(Vec.empty());
167a77376dae1e26572f94aa52b63f89749b785bc33Benjamin Kramer
168904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  Inv = TypeParam().flip();
169cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Inv.count());
170cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Inv.size());
171cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.any());
172fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Inv.all());
173cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.none());
174cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.empty());
175cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
176cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.clear();
177cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
178cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.size());
179cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
180fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
181cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
182cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.empty());
183cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman}
184cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
185904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, CompoundAssignment) {
186904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam A;
187e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.resize(10);
188e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.set(4);
189e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.set(7);
190e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
191904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam B;
192e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(50);
193e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set(5);
194e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set(18);
195e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
196e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A |= B;
197e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(4));
198e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(5));
199e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(7));
200e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(18));
201c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(4U, A.count());
202c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(50U, A.size());
203e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
204e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(10);
205e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set();
206e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.reset(2);
207e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.reset(7);
208e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A &= B;
209e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_FALSE(A.test(2));
210e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_FALSE(A.test(7));
211c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(2U, A.count());
212c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(50U, A.size());
213e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
214e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(100);
215e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set();
216e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
217e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A ^= B;
218e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(2));
219e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(7));
220c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(98U, A.count());
221c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(100U, A.size());
222cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman}
223e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
224904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, ProxyIndex) {
225904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam Vec(3);
2263f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_TRUE(Vec.none());
2273f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec[0] = Vec[1] = Vec[2] = true;
2283f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_EQ(Vec.size(), Vec.count());
2293f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec[2] = Vec[1] = Vec[0] = false;
2303f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_TRUE(Vec.none());
2313f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman}
2323f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman
233904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, PortableBitMask) {
234904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam A;
235ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  const uint32_t Mask1[] = { 0x80000000, 6, 5 };
236ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
237ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(10);
238ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 3);
239ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(10u, A.size());
240ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_FALSE(A.test(0));
241ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
242ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(32);
243ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 3);
244ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_FALSE(A.test(0));
245ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_TRUE(A.test(31));
246ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(1u, A.count());
247ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
248ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(33);
249ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 1);
250ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(1u, A.count());
251ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 2);
252ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(1u, A.count());
253ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
254ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(34);
255ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 2);
256ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(2u, A.count());
257ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
258ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(65);
259ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsInMask(Mask1, 3);
260ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(4u, A.count());
261ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
262ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsNotInMask(Mask1, 1);
263ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(32u+3u, A.count());
264ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
265ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsNotInMask(Mask1, 3);
266ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(65u, A.count());
267ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
268ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(96);
269ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(65u, A.count());
270ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
271ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.clear();
272ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.resize(128);
273ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.setBitsNotInMask(Mask1, 3);
274ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(96u-5u, A.count());
275ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen
276ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  A.clearBitsNotInMask(Mask1, 1);
277ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen  EXPECT_EQ(64-4u, A.count());
278ff5bad078782b6472d6cd0974bf08fe3473050e6Jakob Stoklund Olesen}
279e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
280904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin KramerTYPED_TEST(BitVectorTest, BinOps) {
281904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam A;
282904cf82f270b9d7bd26df2261f8776efdc9e2fa2Benjamin Kramer  TypeParam B;
28303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
28403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.resize(65);
28503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
28603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(B));
28703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
28803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.resize(64);
28903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.set(64);
29003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
29103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(A));
29203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
29303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.set(63);
29403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
29503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(A));
29603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
29703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.set(63);
29803a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_TRUE(A.anyCommon(B));
29903a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_TRUE(B.anyCommon(A));
30003a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen
30103a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.resize(70);
30203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.set(64);
30303a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  B.reset(63);
30403a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  A.resize(64);
30503a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(A.anyCommon(B));
30603a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen  EXPECT_FALSE(B.anyCommon(A));
30703a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen}
3083a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3093a1c35afbd02b012690c35ec827424c27792ec3fOwen AndersonTYPED_TEST(BitVectorTest, RangeOps) {
3103a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam A;
3113a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  A.resize(256);
3123a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  A.reset();
3133a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  A.set(1, 255);
3143a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3153a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(A.test(0));
3163a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( A.test(1));
3173a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( A.test(23));
3183a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( A.test(254));
3193a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(A.test(255));
3203a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3213a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam B;
3223a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  B.resize(256);
3233a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  B.set();
3243a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  B.reset(1, 255);
3253a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3263a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( B.test(0));
3273a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(B.test(1));
3283a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(B.test(23));
3293a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(B.test(254));
3303a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( B.test(255));
3313a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3323a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam C;
3333a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  C.resize(3);
3343a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  C.reset();
3353a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  C.set(0, 1);
3363a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3373a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE(C.test(0));
3383a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE( C.test(1));
3393a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE( C.test(2));
3403a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3413a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  TypeParam D;
3423a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  D.resize(3);
3433a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  D.set();
3443a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  D.reset(0, 1);
3453a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson
3463a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_FALSE(D.test(0));
3473a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( D.test(1));
3483a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson  EXPECT_TRUE( D.test(2));
349e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson
350e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  TypeParam E;
351e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  E.resize(128);
352e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  E.reset();
353e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  E.set(1, 33);
354e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson
355e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_FALSE(E.test(0));
356e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_TRUE( E.test(1));
357e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_TRUE( E.test(32));
358e3f7be36c75ddcafb24b52c36c55c3dc17215db3Owen Anderson  EXPECT_FALSE(E.test(33));
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
36036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TypeParam BufferOverrun;
36136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned size = sizeof(unsigned long) * 8;
36236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BufferOverrun.resize(size);
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BufferOverrun.reset(0, size);
36436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BufferOverrun.set(0, size);
3653a1c35afbd02b012690c35ec827424c27792ec3fOwen Anderson}
366459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer
367459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin KramerTYPED_TEST(BitVectorTest, CompoundTestReset) {
368459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  TypeParam A(50, true);
369459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  TypeParam B(50, false);
370459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer
371459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  TypeParam C(100, true);
372459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  TypeParam D(100, false);
373459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer
374459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(A.test(A));
375459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(A.test(B));
376459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(A.test(C));
377459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(A.test(D));
378459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(B.test(A));
379459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(B.test(B));
380459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(B.test(C));
381459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(B.test(D));
382459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(C.test(A));
383459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(C.test(B));
384459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_FALSE(C.test(C));
385459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(C.test(D));
386459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer
387459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  A.reset(B);
388459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  A.reset(D);
389459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(A.all());
390459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  A.reset(A);
391459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(A.none());
392459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  A.set();
393459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  A.reset(C);
394459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(A.none());
395459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  A.set();
396459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer
397459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  C.reset(A);
398459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_EQ(50, C.find_first());
399459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  C.reset(C);
400459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer  EXPECT_TRUE(C.none());
401459d7bf8f6f1577c67d50c060bff7115d30f9fb9Benjamin Kramer}
40203a3811ab48139f45cf47f1168788e630af0d40bJakob Stoklund Olesen}
403ce97b75c1d507808abcb67635cfcdce2f48e53c9Dale Johannesen#endif
404