15976e7d5SDan Gohman //===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
25976e7d5SDan Gohman //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65976e7d5SDan Gohman //
75976e7d5SDan Gohman //===----------------------------------------------------------------------===//
85976e7d5SDan Gohman
95976e7d5SDan Gohman #include "llvm/ADT/BitVector.h"
10d110c3a9SAlexandre Ganea #include "llvm/ADT/DenseSet.h"
1134d6a9e5SBenjamin Kramer #include "llvm/ADT/SmallBitVector.h"
125976e7d5SDan Gohman #include "gtest/gtest.h"
135976e7d5SDan Gohman
145976e7d5SDan Gohman using namespace llvm;
155976e7d5SDan Gohman
165976e7d5SDan Gohman namespace {
175976e7d5SDan Gohman
1834d6a9e5SBenjamin Kramer // Test fixture
1934d6a9e5SBenjamin Kramer template <typename T>
2034d6a9e5SBenjamin Kramer class BitVectorTest : public ::testing::Test { };
2134d6a9e5SBenjamin Kramer
2234d6a9e5SBenjamin Kramer // Test both BitVector and SmallBitVector with the same suite of tests.
2334d6a9e5SBenjamin Kramer typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;
2405de4b41SBenjamin Kramer TYPED_TEST_SUITE(BitVectorTest, BitVectorTestTypes, );
2534d6a9e5SBenjamin Kramer
TYPED_TEST(BitVectorTest,TrivialOperation)2634d6a9e5SBenjamin Kramer TYPED_TEST(BitVectorTest, TrivialOperation) {
2734d6a9e5SBenjamin Kramer TypeParam Vec;
285976e7d5SDan Gohman EXPECT_EQ(0U, Vec.count());
295976e7d5SDan Gohman EXPECT_EQ(0U, Vec.size());
305976e7d5SDan Gohman EXPECT_FALSE(Vec.any());
31b179cb2cSDan Gohman EXPECT_TRUE(Vec.all());
325976e7d5SDan Gohman EXPECT_TRUE(Vec.none());
335976e7d5SDan Gohman EXPECT_TRUE(Vec.empty());
345976e7d5SDan Gohman
355976e7d5SDan Gohman Vec.resize(5, true);
365976e7d5SDan Gohman EXPECT_EQ(5U, Vec.count());
375976e7d5SDan Gohman EXPECT_EQ(5U, Vec.size());
385976e7d5SDan Gohman EXPECT_TRUE(Vec.any());
39b179cb2cSDan Gohman EXPECT_TRUE(Vec.all());
405976e7d5SDan Gohman EXPECT_FALSE(Vec.none());
415976e7d5SDan Gohman EXPECT_FALSE(Vec.empty());
425976e7d5SDan Gohman
435976e7d5SDan Gohman Vec.resize(11);
445976e7d5SDan Gohman EXPECT_EQ(5U, Vec.count());
455976e7d5SDan Gohman EXPECT_EQ(11U, Vec.size());
465976e7d5SDan Gohman EXPECT_TRUE(Vec.any());
47b179cb2cSDan Gohman EXPECT_FALSE(Vec.all());
485976e7d5SDan Gohman EXPECT_FALSE(Vec.none());
495976e7d5SDan Gohman EXPECT_FALSE(Vec.empty());
505976e7d5SDan Gohman
5134d6a9e5SBenjamin Kramer TypeParam Inv = Vec;
5277e7b8edSJakob Stoklund Olesen Inv.flip();
535976e7d5SDan Gohman EXPECT_EQ(6U, Inv.count());
545976e7d5SDan Gohman EXPECT_EQ(11U, Inv.size());
555976e7d5SDan Gohman EXPECT_TRUE(Inv.any());
56b179cb2cSDan Gohman EXPECT_FALSE(Inv.all());
575976e7d5SDan Gohman EXPECT_FALSE(Inv.none());
585976e7d5SDan Gohman EXPECT_FALSE(Inv.empty());
595976e7d5SDan Gohman
605976e7d5SDan Gohman EXPECT_FALSE(Inv == Vec);
615976e7d5SDan Gohman EXPECT_TRUE(Inv != Vec);
6277e7b8edSJakob Stoklund Olesen Vec.flip();
635976e7d5SDan Gohman EXPECT_TRUE(Inv == Vec);
645976e7d5SDan Gohman EXPECT_FALSE(Inv != Vec);
655976e7d5SDan Gohman
665976e7d5SDan Gohman // Add some "interesting" data to Vec.
675976e7d5SDan Gohman Vec.resize(23, true);
685976e7d5SDan Gohman Vec.resize(25, false);
695976e7d5SDan Gohman Vec.resize(26, true);
705976e7d5SDan Gohman Vec.resize(29, false);
715976e7d5SDan Gohman Vec.resize(33, true);
72b74155dbSDan Gohman Vec.resize(57, false);
735976e7d5SDan Gohman unsigned Count = 0;
745976e7d5SDan Gohman for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
755976e7d5SDan Gohman ++Count;
765976e7d5SDan Gohman EXPECT_TRUE(Vec[i]);
775976e7d5SDan Gohman EXPECT_TRUE(Vec.test(i));
785976e7d5SDan Gohman }
795976e7d5SDan Gohman EXPECT_EQ(Count, Vec.count());
805976e7d5SDan Gohman EXPECT_EQ(Count, 23u);
815976e7d5SDan Gohman EXPECT_FALSE(Vec[0]);
825976e7d5SDan Gohman EXPECT_TRUE(Vec[32]);
83b74155dbSDan Gohman EXPECT_FALSE(Vec[56]);
84b74155dbSDan Gohman Vec.resize(61, false);
855976e7d5SDan Gohman
8634d6a9e5SBenjamin Kramer TypeParam Copy = Vec;
8734d6a9e5SBenjamin Kramer TypeParam Alt(3, false);
885976e7d5SDan Gohman Alt.resize(6, true);
895976e7d5SDan Gohman std::swap(Alt, Vec);
905976e7d5SDan Gohman EXPECT_TRUE(Copy == Alt);
915976e7d5SDan Gohman EXPECT_TRUE(Vec.size() == 6);
925976e7d5SDan Gohman EXPECT_TRUE(Vec.count() == 3);
935976e7d5SDan Gohman EXPECT_TRUE(Vec.find_first() == 3);
945976e7d5SDan Gohman std::swap(Copy, Vec);
955976e7d5SDan Gohman
965976e7d5SDan Gohman // Add some more "interesting" data.
975976e7d5SDan Gohman Vec.resize(68, true);
985976e7d5SDan Gohman Vec.resize(78, false);
995976e7d5SDan Gohman Vec.resize(89, true);
1005976e7d5SDan Gohman Vec.resize(90, false);
1015976e7d5SDan Gohman Vec.resize(91, true);
1025976e7d5SDan Gohman Vec.resize(130, false);
1035976e7d5SDan Gohman Count = 0;
1045976e7d5SDan Gohman for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
1055976e7d5SDan Gohman ++Count;
1065976e7d5SDan Gohman EXPECT_TRUE(Vec[i]);
1075976e7d5SDan Gohman EXPECT_TRUE(Vec.test(i));
1085976e7d5SDan Gohman }
1095976e7d5SDan Gohman EXPECT_EQ(Count, Vec.count());
1105976e7d5SDan Gohman EXPECT_EQ(Count, 42u);
1115976e7d5SDan Gohman EXPECT_FALSE(Vec[0]);
1125976e7d5SDan Gohman EXPECT_TRUE(Vec[32]);
1135976e7d5SDan Gohman EXPECT_FALSE(Vec[60]);
1145976e7d5SDan Gohman EXPECT_FALSE(Vec[129]);
1155976e7d5SDan Gohman
1165976e7d5SDan Gohman Vec.flip(60);
1175976e7d5SDan Gohman EXPECT_TRUE(Vec[60]);
1185976e7d5SDan Gohman EXPECT_EQ(Count + 1, Vec.count());
1195976e7d5SDan Gohman Vec.flip(60);
1205976e7d5SDan Gohman EXPECT_FALSE(Vec[60]);
1215976e7d5SDan Gohman EXPECT_EQ(Count, Vec.count());
1225976e7d5SDan Gohman
1235976e7d5SDan Gohman Vec.reset(32);
1245976e7d5SDan Gohman EXPECT_FALSE(Vec[32]);
1255976e7d5SDan Gohman EXPECT_EQ(Count - 1, Vec.count());
1265976e7d5SDan Gohman Vec.set(32);
1275976e7d5SDan Gohman EXPECT_TRUE(Vec[32]);
1285976e7d5SDan Gohman EXPECT_EQ(Count, Vec.count());
1295976e7d5SDan Gohman
1305976e7d5SDan Gohman Vec.flip();
1315976e7d5SDan Gohman EXPECT_EQ(Vec.size() - Count, Vec.count());
1325976e7d5SDan Gohman
1335976e7d5SDan Gohman Vec.reset();
1345976e7d5SDan Gohman EXPECT_EQ(0U, Vec.count());
1355976e7d5SDan Gohman EXPECT_EQ(130U, Vec.size());
1365976e7d5SDan Gohman EXPECT_FALSE(Vec.any());
137b179cb2cSDan Gohman EXPECT_FALSE(Vec.all());
1385976e7d5SDan Gohman EXPECT_TRUE(Vec.none());
1395976e7d5SDan Gohman EXPECT_FALSE(Vec.empty());
1405976e7d5SDan Gohman
1412566e049SBenjamin Kramer Vec.flip();
1422566e049SBenjamin Kramer EXPECT_EQ(130U, Vec.count());
1432566e049SBenjamin Kramer EXPECT_EQ(130U, Vec.size());
1442566e049SBenjamin Kramer EXPECT_TRUE(Vec.any());
1452566e049SBenjamin Kramer EXPECT_TRUE(Vec.all());
1462566e049SBenjamin Kramer EXPECT_FALSE(Vec.none());
1472566e049SBenjamin Kramer EXPECT_FALSE(Vec.empty());
1482566e049SBenjamin Kramer
1499675a0dbSBenjamin Kramer Vec.resize(64);
1509675a0dbSBenjamin Kramer EXPECT_EQ(64U, Vec.count());
1519675a0dbSBenjamin Kramer EXPECT_EQ(64U, Vec.size());
1529675a0dbSBenjamin Kramer EXPECT_TRUE(Vec.any());
1539675a0dbSBenjamin Kramer EXPECT_TRUE(Vec.all());
1549675a0dbSBenjamin Kramer EXPECT_FALSE(Vec.none());
1559675a0dbSBenjamin Kramer EXPECT_FALSE(Vec.empty());
1569675a0dbSBenjamin Kramer
1579675a0dbSBenjamin Kramer Vec.flip();
1589675a0dbSBenjamin Kramer EXPECT_EQ(0U, Vec.count());
1599675a0dbSBenjamin Kramer EXPECT_EQ(64U, Vec.size());
1609675a0dbSBenjamin Kramer EXPECT_FALSE(Vec.any());
1619675a0dbSBenjamin Kramer EXPECT_FALSE(Vec.all());
1629675a0dbSBenjamin Kramer EXPECT_TRUE(Vec.none());
1639675a0dbSBenjamin Kramer EXPECT_FALSE(Vec.empty());
1649675a0dbSBenjamin Kramer
16534d6a9e5SBenjamin Kramer Inv = TypeParam().flip();
1665976e7d5SDan Gohman EXPECT_EQ(0U, Inv.count());
1675976e7d5SDan Gohman EXPECT_EQ(0U, Inv.size());
1685976e7d5SDan Gohman EXPECT_FALSE(Inv.any());
169b179cb2cSDan Gohman EXPECT_TRUE(Inv.all());
1705976e7d5SDan Gohman EXPECT_TRUE(Inv.none());
1715976e7d5SDan Gohman EXPECT_TRUE(Inv.empty());
1725976e7d5SDan Gohman
1735976e7d5SDan Gohman Vec.clear();
1745976e7d5SDan Gohman EXPECT_EQ(0U, Vec.count());
1755976e7d5SDan Gohman EXPECT_EQ(0U, Vec.size());
1765976e7d5SDan Gohman EXPECT_FALSE(Vec.any());
177b179cb2cSDan Gohman EXPECT_TRUE(Vec.all());
1785976e7d5SDan Gohman EXPECT_TRUE(Vec.none());
1795976e7d5SDan Gohman EXPECT_TRUE(Vec.empty());
1805976e7d5SDan Gohman }
1815976e7d5SDan Gohman
TYPED_TEST(BitVectorTest,Equality)18227f1895fSBrad Moody TYPED_TEST(BitVectorTest, Equality) {
18327f1895fSBrad Moody TypeParam A;
18427f1895fSBrad Moody TypeParam B;
18527f1895fSBrad Moody EXPECT_TRUE(A == B);
18627f1895fSBrad Moody A.resize(10);
18727f1895fSBrad Moody EXPECT_FALSE(A == B);
18827f1895fSBrad Moody B.resize(10);
18927f1895fSBrad Moody EXPECT_TRUE(A == B);
19027f1895fSBrad Moody A.set(5);
19127f1895fSBrad Moody EXPECT_FALSE(A == B);
19227f1895fSBrad Moody B.set(5);
19327f1895fSBrad Moody EXPECT_TRUE(A == B);
19427f1895fSBrad Moody A.resize(20);
19527f1895fSBrad Moody EXPECT_FALSE(A == B);
19627f1895fSBrad Moody B.resize(20);
19727f1895fSBrad Moody EXPECT_TRUE(A == B);
19827f1895fSBrad Moody }
19927f1895fSBrad Moody
TYPED_TEST(BitVectorTest,SimpleFindOpsMultiWord)2001eb3aae2SZachary Turner TYPED_TEST(BitVectorTest, SimpleFindOpsMultiWord) {
201843171f3SZachary Turner TypeParam A;
202843171f3SZachary Turner
203843171f3SZachary Turner // Test finding next set and unset bits in a BitVector with multiple words
204843171f3SZachary Turner A.resize(100);
205843171f3SZachary Turner A.set(12);
206843171f3SZachary Turner A.set(13);
207843171f3SZachary Turner A.set(75);
208843171f3SZachary Turner
209492674ecSZachary Turner EXPECT_EQ(75, A.find_last());
210843171f3SZachary Turner EXPECT_EQ(12, A.find_first());
211843171f3SZachary Turner EXPECT_EQ(13, A.find_next(12));
212843171f3SZachary Turner EXPECT_EQ(75, A.find_next(13));
213843171f3SZachary Turner EXPECT_EQ(-1, A.find_next(75));
214843171f3SZachary Turner
21525597b2cSZachary Turner EXPECT_EQ(-1, A.find_prev(12));
21625597b2cSZachary Turner EXPECT_EQ(12, A.find_prev(13));
21725597b2cSZachary Turner EXPECT_EQ(13, A.find_prev(75));
21825597b2cSZachary Turner EXPECT_EQ(75, A.find_prev(90));
21925597b2cSZachary Turner
220843171f3SZachary Turner EXPECT_EQ(0, A.find_first_unset());
221492674ecSZachary Turner EXPECT_EQ(99, A.find_last_unset());
222843171f3SZachary Turner EXPECT_EQ(14, A.find_next_unset(11));
223843171f3SZachary Turner EXPECT_EQ(14, A.find_next_unset(12));
224843171f3SZachary Turner EXPECT_EQ(14, A.find_next_unset(13));
225843171f3SZachary Turner EXPECT_EQ(16, A.find_next_unset(15));
226843171f3SZachary Turner EXPECT_EQ(76, A.find_next_unset(74));
227843171f3SZachary Turner EXPECT_EQ(76, A.find_next_unset(75));
228843171f3SZachary Turner EXPECT_EQ(-1, A.find_next_unset(99));
229843171f3SZachary Turner
230843171f3SZachary Turner A.set(0, 100);
231c7da1ce3SZachary Turner EXPECT_EQ(100U, A.count());
232843171f3SZachary Turner EXPECT_EQ(0, A.find_first());
233843171f3SZachary Turner EXPECT_EQ(-1, A.find_first_unset());
234492674ecSZachary Turner EXPECT_EQ(-1, A.find_last_unset());
235ba60e3ddSZachary Turner EXPECT_EQ(99, A.find_last());
236ba60e3ddSZachary Turner EXPECT_EQ(99, A.find_next(98));
237843171f3SZachary Turner
238843171f3SZachary Turner A.reset(0, 100);
239c7da1ce3SZachary Turner EXPECT_EQ(0U, A.count());
240843171f3SZachary Turner EXPECT_EQ(-1, A.find_first());
241492674ecSZachary Turner EXPECT_EQ(-1, A.find_last());
242843171f3SZachary Turner EXPECT_EQ(0, A.find_first_unset());
243492674ecSZachary Turner EXPECT_EQ(99, A.find_last_unset());
244ba60e3ddSZachary Turner EXPECT_EQ(99, A.find_next_unset(98));
2451eb3aae2SZachary Turner }
2463b91b8a1SZachary Turner
247630be14aSSimon Pilgrim // Test finding next set and unset bits in a BitVector/SmallBitVector within a
248630be14aSSimon Pilgrim // uintptr_t - check both 32-bit (Multi) and 64-bit (Small) targets.
TYPED_TEST(BitVectorTest,SimpleFindOps64Bit)249630be14aSSimon Pilgrim TYPED_TEST(BitVectorTest, SimpleFindOps64Bit) {
250630be14aSSimon Pilgrim TypeParam A;
251630be14aSSimon Pilgrim
252630be14aSSimon Pilgrim A.resize(57);
253630be14aSSimon Pilgrim A.set(12);
254630be14aSSimon Pilgrim A.set(13);
255630be14aSSimon Pilgrim A.set(47);
256630be14aSSimon Pilgrim
257630be14aSSimon Pilgrim EXPECT_EQ(47, A.find_last());
258630be14aSSimon Pilgrim EXPECT_EQ(12, A.find_first());
259630be14aSSimon Pilgrim EXPECT_EQ(13, A.find_next(12));
260630be14aSSimon Pilgrim EXPECT_EQ(47, A.find_next(13));
261630be14aSSimon Pilgrim EXPECT_EQ(-1, A.find_next(47));
262630be14aSSimon Pilgrim
263630be14aSSimon Pilgrim EXPECT_EQ(-1, A.find_prev(12));
264630be14aSSimon Pilgrim EXPECT_EQ(12, A.find_prev(13));
265630be14aSSimon Pilgrim EXPECT_EQ(13, A.find_prev(47));
266630be14aSSimon Pilgrim EXPECT_EQ(47, A.find_prev(56));
267630be14aSSimon Pilgrim
268630be14aSSimon Pilgrim EXPECT_EQ(0, A.find_first_unset());
269630be14aSSimon Pilgrim EXPECT_EQ(56, A.find_last_unset());
270630be14aSSimon Pilgrim EXPECT_EQ(14, A.find_next_unset(11));
271630be14aSSimon Pilgrim EXPECT_EQ(14, A.find_next_unset(12));
272630be14aSSimon Pilgrim EXPECT_EQ(14, A.find_next_unset(13));
273630be14aSSimon Pilgrim EXPECT_EQ(16, A.find_next_unset(15));
274630be14aSSimon Pilgrim EXPECT_EQ(48, A.find_next_unset(46));
275630be14aSSimon Pilgrim EXPECT_EQ(48, A.find_next_unset(47));
276630be14aSSimon Pilgrim EXPECT_EQ(-1, A.find_next_unset(56));
277630be14aSSimon Pilgrim }
278630be14aSSimon Pilgrim
2791eb3aae2SZachary Turner // Check if a SmallBitVector is in small mode. This check is used in tests
2801eb3aae2SZachary Turner // that run for both SmallBitVector and BitVector. This check doesn't apply
2811eb3aae2SZachary Turner // to BitVector so we provide an overload that returns true to get the tests
2821eb3aae2SZachary Turner // to compile.
SmallBitVectorIsSmallMode(const SmallBitVector & bv)2831eb3aae2SZachary Turner static bool SmallBitVectorIsSmallMode(const SmallBitVector &bv) {
2841eb3aae2SZachary Turner return bv.isSmall();
2851eb3aae2SZachary Turner }
SmallBitVectorIsSmallMode(const BitVector &)2861eb3aae2SZachary Turner static bool SmallBitVectorIsSmallMode(const BitVector &) { return true; }
2871eb3aae2SZachary Turner
2881eb3aae2SZachary Turner // These tests are intended to exercise the single-word case of BitVector
2891eb3aae2SZachary Turner // and the small-mode case of SmallBitVector.
TYPED_TEST(BitVectorTest,SimpleFindOpsSingleWord)2901eb3aae2SZachary Turner TYPED_TEST(BitVectorTest, SimpleFindOpsSingleWord) {
2911eb3aae2SZachary Turner // Test finding in an empty BitVector.
2921eb3aae2SZachary Turner TypeParam A;
2931eb3aae2SZachary Turner ASSERT_TRUE(SmallBitVectorIsSmallMode(A));
2941eb3aae2SZachary Turner EXPECT_EQ(-1, A.find_first());
2951eb3aae2SZachary Turner EXPECT_EQ(-1, A.find_last());
2961eb3aae2SZachary Turner EXPECT_EQ(-1, A.find_first_unset());
2971eb3aae2SZachary Turner EXPECT_EQ(-1, A.find_last_unset());
2981eb3aae2SZachary Turner
2993b91b8a1SZachary Turner A.resize(20);
300a8e5dcb0SDavid Blaikie ASSERT_TRUE(SmallBitVectorIsSmallMode(A));
301a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_first());
302a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_last());
303a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_next(5));
304a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_next(19));
305a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_prev(5));
306a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_prev(20));
307a8e5dcb0SDavid Blaikie EXPECT_EQ(0, A.find_first_unset());
308a8e5dcb0SDavid Blaikie EXPECT_EQ(19, A.find_last_unset());
309a8e5dcb0SDavid Blaikie EXPECT_EQ(6, A.find_next_unset(5));
310a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_next_unset(19));
311a8e5dcb0SDavid Blaikie
3123b91b8a1SZachary Turner A.set(3);
3133b91b8a1SZachary Turner A.set(4);
3143b91b8a1SZachary Turner A.set(16);
3151eb3aae2SZachary Turner ASSERT_TRUE(SmallBitVectorIsSmallMode(A));
3163b91b8a1SZachary Turner EXPECT_EQ(16, A.find_last());
3173b91b8a1SZachary Turner EXPECT_EQ(3, A.find_first());
3183b91b8a1SZachary Turner EXPECT_EQ(3, A.find_next(1));
3193b91b8a1SZachary Turner EXPECT_EQ(4, A.find_next(3));
3203b91b8a1SZachary Turner EXPECT_EQ(16, A.find_next(4));
3213b91b8a1SZachary Turner EXPECT_EQ(-1, A.find_next(16));
3223b91b8a1SZachary Turner
32325597b2cSZachary Turner EXPECT_EQ(-1, A.find_prev(3));
32425597b2cSZachary Turner EXPECT_EQ(3, A.find_prev(4));
32525597b2cSZachary Turner EXPECT_EQ(4, A.find_prev(16));
32625597b2cSZachary Turner EXPECT_EQ(16, A.find_prev(18));
32725597b2cSZachary Turner
3283b91b8a1SZachary Turner EXPECT_EQ(0, A.find_first_unset());
3293b91b8a1SZachary Turner EXPECT_EQ(19, A.find_last_unset());
3303b91b8a1SZachary Turner EXPECT_EQ(5, A.find_next_unset(3));
3313b91b8a1SZachary Turner EXPECT_EQ(5, A.find_next_unset(4));
3323b91b8a1SZachary Turner EXPECT_EQ(13, A.find_next_unset(12));
3333b91b8a1SZachary Turner EXPECT_EQ(17, A.find_next_unset(15));
334a8e5dcb0SDavid Blaikie
335a8e5dcb0SDavid Blaikie A.set();
336a8e5dcb0SDavid Blaikie ASSERT_TRUE(SmallBitVectorIsSmallMode(A));
337a8e5dcb0SDavid Blaikie EXPECT_EQ(0, A.find_first());
338a8e5dcb0SDavid Blaikie EXPECT_EQ(19, A.find_last());
339a8e5dcb0SDavid Blaikie EXPECT_EQ(6, A.find_next(5));
340a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_next(19));
341a8e5dcb0SDavid Blaikie EXPECT_EQ(4, A.find_prev(5));
342a8e5dcb0SDavid Blaikie EXPECT_EQ(19, A.find_prev(20));
343a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_first_unset());
344a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_last_unset());
345a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_next_unset(5));
346a8e5dcb0SDavid Blaikie EXPECT_EQ(-1, A.find_next_unset(19));
347843171f3SZachary Turner }
348843171f3SZachary Turner
TEST(BitVectorTest,FindInRangeMultiWord)349ba60e3ddSZachary Turner TEST(BitVectorTest, FindInRangeMultiWord) {
350ba60e3ddSZachary Turner BitVector Vec;
351ba60e3ddSZachary Turner
352ba60e3ddSZachary Turner Vec.resize(200);
353ba60e3ddSZachary Turner Vec.set(3, 7);
354ba60e3ddSZachary Turner Vec.set(24, 35);
355ba60e3ddSZachary Turner Vec.set(50, 70);
356ba60e3ddSZachary Turner Vec.set(150);
357ba60e3ddSZachary Turner Vec.set(152);
358ba60e3ddSZachary Turner Vec.set(154);
359ba60e3ddSZachary Turner
360ba60e3ddSZachary Turner // find first
361ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(0, 0));
362ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(24, 24));
363ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(7, 24));
364ba60e3ddSZachary Turner
365ba60e3ddSZachary Turner EXPECT_EQ(3, Vec.find_first_in(0, 10));
366ba60e3ddSZachary Turner EXPECT_EQ(4, Vec.find_first_in(4, 10));
367ba60e3ddSZachary Turner EXPECT_EQ(150, Vec.find_first_in(100, 200));
368ba60e3ddSZachary Turner EXPECT_EQ(152, Vec.find_first_in(151, 200));
369ba60e3ddSZachary Turner EXPECT_EQ(154, Vec.find_first_in(153, 200));
370ba60e3ddSZachary Turner
371ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(155, 200));
372ba60e3ddSZachary Turner Vec.set(199);
373ba60e3ddSZachary Turner EXPECT_EQ(199, Vec.find_first_in(199, 200));
374ba60e3ddSZachary Turner Vec.reset(199);
375ba60e3ddSZachary Turner
376ba60e3ddSZachary Turner // find last
377ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(0, 0));
378ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(24, 24));
379ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(7, 24));
380ba60e3ddSZachary Turner
381ba60e3ddSZachary Turner EXPECT_EQ(6, Vec.find_last_in(0, 10));
382ba60e3ddSZachary Turner EXPECT_EQ(5, Vec.find_last_in(0, 6));
383ba60e3ddSZachary Turner EXPECT_EQ(154, Vec.find_last_in(100, 155));
384ba60e3ddSZachary Turner EXPECT_EQ(152, Vec.find_last_in(100, 154));
385ba60e3ddSZachary Turner EXPECT_EQ(150, Vec.find_last_in(100, 152));
386ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(100, 150));
387ba60e3ddSZachary Turner Vec.set(199);
388ba60e3ddSZachary Turner EXPECT_EQ(199, Vec.find_last_in(199, 200));
389ba60e3ddSZachary Turner Vec.reset(199);
390ba60e3ddSZachary Turner
391ba60e3ddSZachary Turner // find first unset
392ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_unset_in(0, 0));
393ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_unset_in(23, 23));
394ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_unset_in(24, 35));
395ba60e3ddSZachary Turner
396ba60e3ddSZachary Turner EXPECT_EQ(0, Vec.find_first_unset_in(0, 10));
397ba60e3ddSZachary Turner EXPECT_EQ(1, Vec.find_first_unset_in(1, 10));
398ba60e3ddSZachary Turner EXPECT_EQ(7, Vec.find_first_unset_in(5, 25));
399ba60e3ddSZachary Turner EXPECT_EQ(151, Vec.find_first_unset_in(150, 200));
400ba60e3ddSZachary Turner EXPECT_EQ(151, Vec.find_first_unset_in(151, 200));
401ba60e3ddSZachary Turner EXPECT_EQ(153, Vec.find_first_unset_in(152, 200));
402ba60e3ddSZachary Turner EXPECT_EQ(153, Vec.find_first_unset_in(153, 200));
403ba60e3ddSZachary Turner EXPECT_EQ(155, Vec.find_first_unset_in(154, 200));
404ba60e3ddSZachary Turner EXPECT_EQ(155, Vec.find_first_unset_in(155, 200));
405ba60e3ddSZachary Turner EXPECT_EQ(199, Vec.find_first_unset_in(199, 200));
406ba60e3ddSZachary Turner
407ba60e3ddSZachary Turner // find last unset
408ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_unset_in(0, 0));
409ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_unset_in(23, 23));
410ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_unset_in(24, 35));
411ba60e3ddSZachary Turner
412ba60e3ddSZachary Turner EXPECT_EQ(9, Vec.find_last_unset_in(0, 10));
413ba60e3ddSZachary Turner EXPECT_EQ(8, Vec.find_last_unset_in(0, 9));
414ba60e3ddSZachary Turner EXPECT_EQ(2, Vec.find_last_unset_in(0, 7));
415ba60e3ddSZachary Turner EXPECT_EQ(149, Vec.find_last_unset_in(100, 151));
416ba60e3ddSZachary Turner EXPECT_EQ(151, Vec.find_last_unset_in(100, 152));
417ba60e3ddSZachary Turner EXPECT_EQ(151, Vec.find_last_unset_in(100, 153));
418ba60e3ddSZachary Turner EXPECT_EQ(153, Vec.find_last_unset_in(100, 154));
419ba60e3ddSZachary Turner EXPECT_EQ(153, Vec.find_last_unset_in(100, 155));
420ba60e3ddSZachary Turner EXPECT_EQ(155, Vec.find_last_unset_in(100, 156));
421ba60e3ddSZachary Turner EXPECT_EQ(199, Vec.find_last_unset_in(199, 200));
422ba60e3ddSZachary Turner }
423ba60e3ddSZachary Turner
TEST(BitVectorTest,FindInRangeSingleWord)424ba60e3ddSZachary Turner TEST(BitVectorTest, FindInRangeSingleWord) {
425ba60e3ddSZachary Turner // When the bit vector contains only a single word, this is slightly different
426ba60e3ddSZachary Turner // than when the bit vector contains multiple words, because masks are applied
427ba60e3ddSZachary Turner // to the front and back of the same word. So make sure this works.
428ba60e3ddSZachary Turner BitVector Vec;
429ba60e3ddSZachary Turner
430ba60e3ddSZachary Turner Vec.resize(25);
431ba60e3ddSZachary Turner Vec.set(2, 4);
432ba60e3ddSZachary Turner Vec.set(6, 9);
433ba60e3ddSZachary Turner Vec.set(12, 15);
434ba60e3ddSZachary Turner Vec.set(19);
435ba60e3ddSZachary Turner Vec.set(21);
436ba60e3ddSZachary Turner Vec.set(23);
437ba60e3ddSZachary Turner
438ba60e3ddSZachary Turner // find first
439ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(0, 0));
440ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(24, 24));
441ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(9, 12));
442ba60e3ddSZachary Turner
443ba60e3ddSZachary Turner EXPECT_EQ(2, Vec.find_first_in(0, 10));
444ba60e3ddSZachary Turner EXPECT_EQ(6, Vec.find_first_in(4, 10));
445ba60e3ddSZachary Turner EXPECT_EQ(19, Vec.find_first_in(18, 25));
446ba60e3ddSZachary Turner EXPECT_EQ(21, Vec.find_first_in(20, 25));
447ba60e3ddSZachary Turner EXPECT_EQ(23, Vec.find_first_in(22, 25));
448ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_in(24, 25));
449ba60e3ddSZachary Turner
450ba60e3ddSZachary Turner // find last
451ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(0, 0));
452ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(24, 24));
453ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(9, 12));
454ba60e3ddSZachary Turner
455ba60e3ddSZachary Turner EXPECT_EQ(8, Vec.find_last_in(0, 10));
456ba60e3ddSZachary Turner EXPECT_EQ(3, Vec.find_last_in(0, 6));
457ba60e3ddSZachary Turner EXPECT_EQ(23, Vec.find_last_in(18, 25));
458ba60e3ddSZachary Turner EXPECT_EQ(21, Vec.find_last_in(18, 23));
459ba60e3ddSZachary Turner EXPECT_EQ(19, Vec.find_last_in(18, 21));
460ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_in(18, 19));
461ba60e3ddSZachary Turner
462ba60e3ddSZachary Turner // find first unset
463ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_unset_in(0, 0));
464ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_unset_in(23, 23));
465ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_first_unset_in(6, 9));
466ba60e3ddSZachary Turner
467ba60e3ddSZachary Turner EXPECT_EQ(0, Vec.find_first_unset_in(0, 6));
468ba60e3ddSZachary Turner EXPECT_EQ(1, Vec.find_first_unset_in(1, 6));
469ba60e3ddSZachary Turner EXPECT_EQ(9, Vec.find_first_unset_in(7, 13));
470ba60e3ddSZachary Turner EXPECT_EQ(18, Vec.find_first_unset_in(18, 25));
471ba60e3ddSZachary Turner EXPECT_EQ(20, Vec.find_first_unset_in(19, 25));
472ba60e3ddSZachary Turner EXPECT_EQ(20, Vec.find_first_unset_in(20, 25));
473ba60e3ddSZachary Turner EXPECT_EQ(22, Vec.find_first_unset_in(21, 25));
474ba60e3ddSZachary Turner EXPECT_EQ(22, Vec.find_first_unset_in(22, 25));
475ba60e3ddSZachary Turner EXPECT_EQ(24, Vec.find_first_unset_in(23, 25));
476ba60e3ddSZachary Turner EXPECT_EQ(24, Vec.find_first_unset_in(24, 25));
477ba60e3ddSZachary Turner
478ba60e3ddSZachary Turner // find last unset
479ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_unset_in(0, 0));
480ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_unset_in(23, 23));
481ba60e3ddSZachary Turner EXPECT_EQ(-1, Vec.find_last_unset_in(6, 9));
482ba60e3ddSZachary Turner
483ba60e3ddSZachary Turner EXPECT_EQ(5, Vec.find_last_unset_in(0, 6));
484ba60e3ddSZachary Turner EXPECT_EQ(4, Vec.find_last_unset_in(0, 5));
485ba60e3ddSZachary Turner EXPECT_EQ(1, Vec.find_last_unset_in(0, 4));
486ba60e3ddSZachary Turner EXPECT_EQ(11, Vec.find_last_unset_in(7, 13));
487ba60e3ddSZachary Turner EXPECT_EQ(24, Vec.find_last_unset_in(18, 25));
488ba60e3ddSZachary Turner EXPECT_EQ(22, Vec.find_last_unset_in(18, 24));
489ba60e3ddSZachary Turner EXPECT_EQ(22, Vec.find_last_unset_in(18, 23));
490ba60e3ddSZachary Turner EXPECT_EQ(20, Vec.find_last_unset_in(18, 22));
491ba60e3ddSZachary Turner EXPECT_EQ(20, Vec.find_last_unset_in(18, 21));
492ba60e3ddSZachary Turner EXPECT_EQ(18, Vec.find_last_unset_in(18, 20));
493ba60e3ddSZachary Turner EXPECT_EQ(18, Vec.find_last_unset_in(18, 19));
494ba60e3ddSZachary Turner }
495ba60e3ddSZachary Turner
TYPED_TEST(BitVectorTest,CompoundAssignment)49634d6a9e5SBenjamin Kramer TYPED_TEST(BitVectorTest, CompoundAssignment) {
49734d6a9e5SBenjamin Kramer TypeParam A;
498e69b99baSDan Gohman A.resize(10);
499e69b99baSDan Gohman A.set(4);
500e69b99baSDan Gohman A.set(7);
501e69b99baSDan Gohman
50234d6a9e5SBenjamin Kramer TypeParam B;
503e69b99baSDan Gohman B.resize(50);
504e69b99baSDan Gohman B.set(5);
505e69b99baSDan Gohman B.set(18);
506e69b99baSDan Gohman
507e69b99baSDan Gohman A |= B;
508e69b99baSDan Gohman EXPECT_TRUE(A.test(4));
509e69b99baSDan Gohman EXPECT_TRUE(A.test(5));
510e69b99baSDan Gohman EXPECT_TRUE(A.test(7));
511e69b99baSDan Gohman EXPECT_TRUE(A.test(18));
5124b86e9b7SBenjamin Kramer EXPECT_EQ(4U, A.count());
5134b86e9b7SBenjamin Kramer EXPECT_EQ(50U, A.size());
514e69b99baSDan Gohman
515e69b99baSDan Gohman B.resize(10);
516e69b99baSDan Gohman B.set();
517e69b99baSDan Gohman B.reset(2);
518e69b99baSDan Gohman B.reset(7);
519e69b99baSDan Gohman A &= B;
520e69b99baSDan Gohman EXPECT_FALSE(A.test(2));
521e69b99baSDan Gohman EXPECT_FALSE(A.test(7));
5221eb3aae2SZachary Turner EXPECT_TRUE(A.test(4));
5231eb3aae2SZachary Turner EXPECT_TRUE(A.test(5));
5244b86e9b7SBenjamin Kramer EXPECT_EQ(2U, A.count());
5254b86e9b7SBenjamin Kramer EXPECT_EQ(50U, A.size());
526e69b99baSDan Gohman
527e69b99baSDan Gohman B.resize(100);
528e69b99baSDan Gohman B.set();
529e69b99baSDan Gohman
530e69b99baSDan Gohman A ^= B;
531e69b99baSDan Gohman EXPECT_TRUE(A.test(2));
532e69b99baSDan Gohman EXPECT_TRUE(A.test(7));
5334b86e9b7SBenjamin Kramer EXPECT_EQ(98U, A.count());
5344b86e9b7SBenjamin Kramer EXPECT_EQ(100U, A.size());
5355976e7d5SDan Gohman }
536e69b99baSDan Gohman
5371eb3aae2SZachary Turner // Test SmallBitVector operations with mixed big/small representations
TYPED_TEST(BitVectorTest,MixedBigSmall)5381eb3aae2SZachary Turner TYPED_TEST(BitVectorTest, MixedBigSmall) {
5391eb3aae2SZachary Turner {
5401eb3aae2SZachary Turner TypeParam Big;
5411eb3aae2SZachary Turner TypeParam Small;
5421eb3aae2SZachary Turner
5431eb3aae2SZachary Turner Big.reserve(100);
5441eb3aae2SZachary Turner Big.resize(20);
5451eb3aae2SZachary Turner Small.resize(10);
5461eb3aae2SZachary Turner
5471eb3aae2SZachary Turner Small.set(0);
5481eb3aae2SZachary Turner Small.set(1);
5491eb3aae2SZachary Turner Big.set(0);
5501eb3aae2SZachary Turner Big.set(2);
5511eb3aae2SZachary Turner Big.set(16);
5521eb3aae2SZachary Turner
5531eb3aae2SZachary Turner Small &= Big;
5541eb3aae2SZachary Turner EXPECT_TRUE(Small.test(0));
5551eb3aae2SZachary Turner EXPECT_EQ(1u, Small.count());
5561eb3aae2SZachary Turner // FIXME BitVector and SmallBitVector behave differently here.
5571eb3aae2SZachary Turner // SmallBitVector resizes the LHS to max(LHS.size(), RHS.size())
5581eb3aae2SZachary Turner // but BitVector does not.
5591eb3aae2SZachary Turner // EXPECT_EQ(20u, Small.size());
5601eb3aae2SZachary Turner }
5611eb3aae2SZachary Turner
5621eb3aae2SZachary Turner {
5631eb3aae2SZachary Turner TypeParam Big;
5641eb3aae2SZachary Turner TypeParam Small;
5651eb3aae2SZachary Turner
5661eb3aae2SZachary Turner Big.reserve(100);
5671eb3aae2SZachary Turner Big.resize(20);
5681eb3aae2SZachary Turner Small.resize(10);
5691eb3aae2SZachary Turner
5701eb3aae2SZachary Turner Small.set(0);
5711eb3aae2SZachary Turner Small.set(1);
5721eb3aae2SZachary Turner Big.set(0);
5731eb3aae2SZachary Turner Big.set(2);
5741eb3aae2SZachary Turner Big.set(16);
5751eb3aae2SZachary Turner
5761eb3aae2SZachary Turner Big &= Small;
5771eb3aae2SZachary Turner EXPECT_TRUE(Big.test(0));
5781eb3aae2SZachary Turner EXPECT_EQ(1u, Big.count());
5791eb3aae2SZachary Turner // FIXME BitVector and SmallBitVector behave differently here.
5801eb3aae2SZachary Turner // SmallBitVector resizes the LHS to max(LHS.size(), RHS.size())
5811eb3aae2SZachary Turner // but BitVector does not.
5821eb3aae2SZachary Turner // EXPECT_EQ(20u, Big.size());
5831eb3aae2SZachary Turner }
5841eb3aae2SZachary Turner
5851eb3aae2SZachary Turner {
5861eb3aae2SZachary Turner TypeParam Big;
5871eb3aae2SZachary Turner TypeParam Small;
5881eb3aae2SZachary Turner
5891eb3aae2SZachary Turner Big.reserve(100);
5901eb3aae2SZachary Turner Big.resize(20);
5911eb3aae2SZachary Turner Small.resize(10);
5921eb3aae2SZachary Turner
5931eb3aae2SZachary Turner Small.set(0);
5941eb3aae2SZachary Turner Small.set(1);
5951eb3aae2SZachary Turner Big.set(0);
5961eb3aae2SZachary Turner Big.set(2);
5971eb3aae2SZachary Turner Big.set(16);
5981eb3aae2SZachary Turner
5991eb3aae2SZachary Turner Small |= Big;
6001eb3aae2SZachary Turner EXPECT_TRUE(Small.test(0));
6011eb3aae2SZachary Turner EXPECT_TRUE(Small.test(1));
6021eb3aae2SZachary Turner EXPECT_TRUE(Small.test(2));
6031eb3aae2SZachary Turner EXPECT_TRUE(Small.test(16));
6041eb3aae2SZachary Turner EXPECT_EQ(4u, Small.count());
6051eb3aae2SZachary Turner EXPECT_EQ(20u, Small.size());
6061eb3aae2SZachary Turner }
6071eb3aae2SZachary Turner
6081eb3aae2SZachary Turner {
6091eb3aae2SZachary Turner TypeParam Big;
6101eb3aae2SZachary Turner TypeParam Small;
6111eb3aae2SZachary Turner
6121eb3aae2SZachary Turner Big.reserve(100);
6131eb3aae2SZachary Turner Big.resize(20);
6141eb3aae2SZachary Turner Small.resize(10);
6151eb3aae2SZachary Turner
6161eb3aae2SZachary Turner Small.set(0);
6171eb3aae2SZachary Turner Small.set(1);
6181eb3aae2SZachary Turner Big.set(0);
6191eb3aae2SZachary Turner Big.set(2);
6201eb3aae2SZachary Turner Big.set(16);
6211eb3aae2SZachary Turner
6221eb3aae2SZachary Turner Big |= Small;
6231eb3aae2SZachary Turner EXPECT_TRUE(Big.test(0));
6241eb3aae2SZachary Turner EXPECT_TRUE(Big.test(1));
6251eb3aae2SZachary Turner EXPECT_TRUE(Big.test(2));
6261eb3aae2SZachary Turner EXPECT_TRUE(Big.test(16));
6271eb3aae2SZachary Turner EXPECT_EQ(4u, Big.count());
6281eb3aae2SZachary Turner EXPECT_EQ(20u, Big.size());
6291eb3aae2SZachary Turner }
6301eb3aae2SZachary Turner
6311eb3aae2SZachary Turner {
6321eb3aae2SZachary Turner TypeParam Big;
6331eb3aae2SZachary Turner TypeParam Small;
6341eb3aae2SZachary Turner
6351eb3aae2SZachary Turner Big.reserve(100);
6361eb3aae2SZachary Turner Big.resize(20);
6371eb3aae2SZachary Turner Small.resize(10);
6381eb3aae2SZachary Turner
6391eb3aae2SZachary Turner Small.set(0);
6401eb3aae2SZachary Turner Small.set(1);
6411eb3aae2SZachary Turner Big.set(0);
6421eb3aae2SZachary Turner Big.set(2);
6431eb3aae2SZachary Turner Big.set(16);
6441eb3aae2SZachary Turner
6451eb3aae2SZachary Turner Small ^= Big;
6461eb3aae2SZachary Turner EXPECT_TRUE(Small.test(1));
6471eb3aae2SZachary Turner EXPECT_TRUE(Small.test(2));
6481eb3aae2SZachary Turner EXPECT_TRUE(Small.test(16));
6491eb3aae2SZachary Turner EXPECT_EQ(3u, Small.count());
6501eb3aae2SZachary Turner EXPECT_EQ(20u, Small.size());
6511eb3aae2SZachary Turner }
6521eb3aae2SZachary Turner
6531eb3aae2SZachary Turner {
6541eb3aae2SZachary Turner TypeParam Big;
6551eb3aae2SZachary Turner TypeParam Small;
6561eb3aae2SZachary Turner
6571eb3aae2SZachary Turner Big.reserve(100);
6581eb3aae2SZachary Turner Big.resize(20);
6591eb3aae2SZachary Turner Small.resize(10);
6601eb3aae2SZachary Turner
6611eb3aae2SZachary Turner Small.set(0);
6621eb3aae2SZachary Turner Small.set(1);
6631eb3aae2SZachary Turner Big.set(0);
6641eb3aae2SZachary Turner Big.set(2);
6651eb3aae2SZachary Turner Big.set(16);
6661eb3aae2SZachary Turner
6671eb3aae2SZachary Turner Big ^= Small;
6681eb3aae2SZachary Turner EXPECT_TRUE(Big.test(1));
6691eb3aae2SZachary Turner EXPECT_TRUE(Big.test(2));
6701eb3aae2SZachary Turner EXPECT_TRUE(Big.test(16));
6711eb3aae2SZachary Turner EXPECT_EQ(3u, Big.count());
6721eb3aae2SZachary Turner EXPECT_EQ(20u, Big.size());
6731eb3aae2SZachary Turner }
6741eb3aae2SZachary Turner
6751eb3aae2SZachary Turner {
6761eb3aae2SZachary Turner TypeParam Big;
6771eb3aae2SZachary Turner TypeParam Small;
6781eb3aae2SZachary Turner
6791eb3aae2SZachary Turner Big.reserve(100);
6801eb3aae2SZachary Turner Big.resize(20);
6811eb3aae2SZachary Turner Small.resize(10);
6821eb3aae2SZachary Turner
6831eb3aae2SZachary Turner Small.set(0);
6841eb3aae2SZachary Turner Small.set(1);
6851eb3aae2SZachary Turner Big.set(0);
6861eb3aae2SZachary Turner Big.set(2);
6871eb3aae2SZachary Turner Big.set(16);
6881eb3aae2SZachary Turner
6891eb3aae2SZachary Turner Small.reset(Big);
6901eb3aae2SZachary Turner EXPECT_TRUE(Small.test(1));
6911eb3aae2SZachary Turner EXPECT_EQ(1u, Small.count());
6921eb3aae2SZachary Turner EXPECT_EQ(10u, Small.size());
6931eb3aae2SZachary Turner }
6941eb3aae2SZachary Turner
6951eb3aae2SZachary Turner {
6961eb3aae2SZachary Turner TypeParam Big;
6971eb3aae2SZachary Turner TypeParam Small;
6981eb3aae2SZachary Turner
6991eb3aae2SZachary Turner Big.reserve(100);
7001eb3aae2SZachary Turner Big.resize(20);
7011eb3aae2SZachary Turner Small.resize(10);
7021eb3aae2SZachary Turner
7031eb3aae2SZachary Turner Small.set(0);
7041eb3aae2SZachary Turner Small.set(1);
7051eb3aae2SZachary Turner Big.set(0);
7061eb3aae2SZachary Turner Big.set(2);
7071eb3aae2SZachary Turner Big.set(16);
7081eb3aae2SZachary Turner
7091eb3aae2SZachary Turner Big.reset(Small);
7101eb3aae2SZachary Turner EXPECT_TRUE(Big.test(2));
7111eb3aae2SZachary Turner EXPECT_TRUE(Big.test(16));
7121eb3aae2SZachary Turner EXPECT_EQ(2u, Big.count());
7131eb3aae2SZachary Turner EXPECT_EQ(20u, Big.size());
7141eb3aae2SZachary Turner }
7151eb3aae2SZachary Turner
7161eb3aae2SZachary Turner {
7171eb3aae2SZachary Turner TypeParam Big;
7181eb3aae2SZachary Turner TypeParam Small;
7191eb3aae2SZachary Turner
7201eb3aae2SZachary Turner Big.reserve(100);
7211eb3aae2SZachary Turner Big.resize(10);
7221eb3aae2SZachary Turner Small.resize(10);
7231eb3aae2SZachary Turner
7241eb3aae2SZachary Turner Small.set(0);
7251eb3aae2SZachary Turner Small.set(1);
7261eb3aae2SZachary Turner Big.set(0);
7271eb3aae2SZachary Turner
7281eb3aae2SZachary Turner EXPECT_FALSE(Big == Small);
7291eb3aae2SZachary Turner EXPECT_FALSE(Small == Big);
7301eb3aae2SZachary Turner Big.set(1);
7311eb3aae2SZachary Turner EXPECT_TRUE(Big == Small);
7321eb3aae2SZachary Turner EXPECT_TRUE(Small == Big);
7331eb3aae2SZachary Turner }
7341eb3aae2SZachary Turner
7351eb3aae2SZachary Turner {
7361eb3aae2SZachary Turner TypeParam Big;
7371eb3aae2SZachary Turner TypeParam Small;
7381eb3aae2SZachary Turner
7391eb3aae2SZachary Turner Big.reserve(100);
7401eb3aae2SZachary Turner Big.resize(20);
7411eb3aae2SZachary Turner Small.resize(10);
7421eb3aae2SZachary Turner
7431eb3aae2SZachary Turner Small.set(0);
7441eb3aae2SZachary Turner Big.set(1);
7451eb3aae2SZachary Turner
7461eb3aae2SZachary Turner EXPECT_FALSE(Small.anyCommon(Big));
7471eb3aae2SZachary Turner EXPECT_FALSE(Big.anyCommon(Small));
7481eb3aae2SZachary Turner Big.set(0);
7491eb3aae2SZachary Turner EXPECT_TRUE(Small.anyCommon(Big));
7501eb3aae2SZachary Turner EXPECT_TRUE(Big.anyCommon(Small));
7511eb3aae2SZachary Turner }
7521eb3aae2SZachary Turner
7531eb3aae2SZachary Turner {
7541eb3aae2SZachary Turner TypeParam Big;
7551eb3aae2SZachary Turner TypeParam Small;
7561eb3aae2SZachary Turner
7571eb3aae2SZachary Turner Big.reserve(100);
7581eb3aae2SZachary Turner Big.resize(10);
7591eb3aae2SZachary Turner Small.resize(10);
7601eb3aae2SZachary Turner
7611eb3aae2SZachary Turner Small.set(0);
7621eb3aae2SZachary Turner Small.set(1);
7631eb3aae2SZachary Turner Big.set(0);
7641eb3aae2SZachary Turner
7651eb3aae2SZachary Turner EXPECT_TRUE(Small.test(Big));
7661eb3aae2SZachary Turner EXPECT_FALSE(Big.test(Small));
7671eb3aae2SZachary Turner Big.set(1);
7681eb3aae2SZachary Turner EXPECT_FALSE(Small.test(Big));
7691eb3aae2SZachary Turner EXPECT_FALSE(Big.test(Small));
7701eb3aae2SZachary Turner }
7711eb3aae2SZachary Turner }
7721eb3aae2SZachary Turner
TYPED_TEST(BitVectorTest,ProxyIndex)77334d6a9e5SBenjamin Kramer TYPED_TEST(BitVectorTest, ProxyIndex) {
77434d6a9e5SBenjamin Kramer TypeParam Vec(3);
775b74155dbSDan Gohman EXPECT_TRUE(Vec.none());
776b74155dbSDan Gohman Vec[0] = Vec[1] = Vec[2] = true;
777b74155dbSDan Gohman EXPECT_EQ(Vec.size(), Vec.count());
778b74155dbSDan Gohman Vec[2] = Vec[1] = Vec[0] = false;
779b74155dbSDan Gohman EXPECT_TRUE(Vec.none());
780b74155dbSDan Gohman }
781b74155dbSDan Gohman
782e19884cdSserge-sans-paille
TYPED_TEST(BitVectorTest,PortableBitMask)78334d6a9e5SBenjamin Kramer TYPED_TEST(BitVectorTest, PortableBitMask) {
78434d6a9e5SBenjamin Kramer TypeParam A;
7856ccbdcdaSJakob Stoklund Olesen const uint32_t Mask1[] = { 0x80000000, 6, 5 };
7866ccbdcdaSJakob Stoklund Olesen
7876ccbdcdaSJakob Stoklund Olesen A.resize(10);
788a89b833cSYaron Keren A.setBitsInMask(Mask1, 1);
7896ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(10u, A.size());
7906ccbdcdaSJakob Stoklund Olesen EXPECT_FALSE(A.test(0));
7916ccbdcdaSJakob Stoklund Olesen
7926ccbdcdaSJakob Stoklund Olesen A.resize(32);
793a89b833cSYaron Keren A.setBitsInMask(Mask1, 1);
7946ccbdcdaSJakob Stoklund Olesen EXPECT_FALSE(A.test(0));
7956ccbdcdaSJakob Stoklund Olesen EXPECT_TRUE(A.test(31));
7966ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(1u, A.count());
7976ccbdcdaSJakob Stoklund Olesen
7986ccbdcdaSJakob Stoklund Olesen A.resize(33);
7996ccbdcdaSJakob Stoklund Olesen A.setBitsInMask(Mask1, 1);
8006ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(1u, A.count());
8016ccbdcdaSJakob Stoklund Olesen A.setBitsInMask(Mask1, 2);
8026ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(1u, A.count());
8036ccbdcdaSJakob Stoklund Olesen
8046ccbdcdaSJakob Stoklund Olesen A.resize(34);
8056ccbdcdaSJakob Stoklund Olesen A.setBitsInMask(Mask1, 2);
8066ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(2u, A.count());
8076ccbdcdaSJakob Stoklund Olesen
8086ccbdcdaSJakob Stoklund Olesen A.resize(65);
8096ccbdcdaSJakob Stoklund Olesen A.setBitsInMask(Mask1, 3);
8106ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(4u, A.count());
8116ccbdcdaSJakob Stoklund Olesen
8126ccbdcdaSJakob Stoklund Olesen A.setBitsNotInMask(Mask1, 1);
8136ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(32u+3u, A.count());
8146ccbdcdaSJakob Stoklund Olesen
8156ccbdcdaSJakob Stoklund Olesen A.setBitsNotInMask(Mask1, 3);
8166ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(65u, A.count());
8176ccbdcdaSJakob Stoklund Olesen
8186ccbdcdaSJakob Stoklund Olesen A.resize(96);
8196ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(65u, A.count());
8206ccbdcdaSJakob Stoklund Olesen
8216ccbdcdaSJakob Stoklund Olesen A.clear();
8226ccbdcdaSJakob Stoklund Olesen A.resize(128);
8236ccbdcdaSJakob Stoklund Olesen A.setBitsNotInMask(Mask1, 3);
8246ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(96u-5u, A.count());
8256ccbdcdaSJakob Stoklund Olesen
8266ccbdcdaSJakob Stoklund Olesen A.clearBitsNotInMask(Mask1, 1);
8276ccbdcdaSJakob Stoklund Olesen EXPECT_EQ(64-4u, A.count());
8286ccbdcdaSJakob Stoklund Olesen }
829e69b99baSDan Gohman
TYPED_TEST(BitVectorTest,BinOps)83034d6a9e5SBenjamin Kramer TYPED_TEST(BitVectorTest, BinOps) {
83134d6a9e5SBenjamin Kramer TypeParam A;
83234d6a9e5SBenjamin Kramer TypeParam B;
8332fad493fSJakob Stoklund Olesen
8342fad493fSJakob Stoklund Olesen A.resize(65);
8352fad493fSJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B));
8362fad493fSJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(B));
8372fad493fSJakob Stoklund Olesen
8382fad493fSJakob Stoklund Olesen B.resize(64);
8392fad493fSJakob Stoklund Olesen A.set(64);
8402fad493fSJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B));
8412fad493fSJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(A));
8422fad493fSJakob Stoklund Olesen
8432fad493fSJakob Stoklund Olesen B.set(63);
8442fad493fSJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B));
8452fad493fSJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(A));
8462fad493fSJakob Stoklund Olesen
8472fad493fSJakob Stoklund Olesen A.set(63);
8482fad493fSJakob Stoklund Olesen EXPECT_TRUE(A.anyCommon(B));
8492fad493fSJakob Stoklund Olesen EXPECT_TRUE(B.anyCommon(A));
8502fad493fSJakob Stoklund Olesen
8512fad493fSJakob Stoklund Olesen B.resize(70);
8522fad493fSJakob Stoklund Olesen B.set(64);
8532fad493fSJakob Stoklund Olesen B.reset(63);
8542fad493fSJakob Stoklund Olesen A.resize(64);
8552fad493fSJakob Stoklund Olesen EXPECT_FALSE(A.anyCommon(B));
8562fad493fSJakob Stoklund Olesen EXPECT_FALSE(B.anyCommon(A));
8572fad493fSJakob Stoklund Olesen }
8586b7bdf88SOwen Anderson
8592a593bc5SZachary Turner typedef std::vector<std::pair<int, int>> RangeList;
8602a593bc5SZachary Turner
8612a593bc5SZachary Turner template <typename VecType>
createBitVector(uint32_t Size,const RangeList & setRanges)8622a593bc5SZachary Turner static inline VecType createBitVector(uint32_t Size,
8632a593bc5SZachary Turner const RangeList &setRanges) {
8642a593bc5SZachary Turner VecType V;
8652a593bc5SZachary Turner V.resize(Size);
8662a593bc5SZachary Turner for (auto &R : setRanges)
8672a593bc5SZachary Turner V.set(R.first, R.second);
8682a593bc5SZachary Turner return V;
8692a593bc5SZachary Turner }
8702a593bc5SZachary Turner
TYPED_TEST(BitVectorTest,ShiftOpsSingleWord)8712a593bc5SZachary Turner TYPED_TEST(BitVectorTest, ShiftOpsSingleWord) {
8722a593bc5SZachary Turner // Test that shift ops work when the desired shift amount is less
8732a593bc5SZachary Turner // than one word.
8742a593bc5SZachary Turner
8752a593bc5SZachary Turner // 1. Case where the number of bits in the BitVector also fit into a single
8762a593bc5SZachary Turner // word.
8772a593bc5SZachary Turner TypeParam A = createBitVector<TypeParam>(12, {{2, 4}, {8, 10}});
8782a593bc5SZachary Turner TypeParam B = A;
8792a593bc5SZachary Turner
8802a593bc5SZachary Turner EXPECT_EQ(4U, A.count());
8812a593bc5SZachary Turner EXPECT_TRUE(A.test(2));
8822a593bc5SZachary Turner EXPECT_TRUE(A.test(3));
8832a593bc5SZachary Turner EXPECT_TRUE(A.test(8));
8842a593bc5SZachary Turner EXPECT_TRUE(A.test(9));
8852a593bc5SZachary Turner
8862a593bc5SZachary Turner A >>= 1;
8872a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(12, {{1, 3}, {7, 9}}), A);
8882a593bc5SZachary Turner
8892a593bc5SZachary Turner A <<= 1;
8902a593bc5SZachary Turner EXPECT_EQ(B, A);
8912a593bc5SZachary Turner
8922a593bc5SZachary Turner A >>= 10;
8932a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(12, {}), A);
8942a593bc5SZachary Turner
8952a593bc5SZachary Turner A = B;
8962a593bc5SZachary Turner A <<= 10;
8972a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(12, {}), A);
8982a593bc5SZachary Turner
8992a593bc5SZachary Turner // 2. Case where the number of bits in the BitVector do not fit into a single
9002a593bc5SZachary Turner // word.
9012a593bc5SZachary Turner
9022a593bc5SZachary Turner // 31----------------------------------------------------------------------0
9032a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 00000111 | 11111110 00000000 00001111 11111111
9042a593bc5SZachary Turner A = createBitVector<TypeParam>(40, {{0, 12}, {25, 35}});
9052a593bc5SZachary Turner EXPECT_EQ(40U, A.size());
9062a593bc5SZachary Turner EXPECT_EQ(22U, A.count());
9072a593bc5SZachary Turner
9082a593bc5SZachary Turner // 2a. Make sure that left shifting some 1 bits out of the vector works.
9092a593bc5SZachary Turner // 31----------------------------------------------------------------------0
9102a593bc5SZachary Turner // Before:
9112a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 00000111 | 11111110 00000000 00001111 11111111
9122a593bc5SZachary Turner // After:
9132a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 11111100 | 00000000 00011111 11111110 00000000
9142a593bc5SZachary Turner A <<= 9;
9152a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(40, {{9, 21}, {34, 40}}), A);
9162a593bc5SZachary Turner
9172a593bc5SZachary Turner // 2b. Make sure that keeping the number of one bits unchanged works.
9182a593bc5SZachary Turner // 31----------------------------------------------------------------------0
9192a593bc5SZachary Turner // Before:
9202a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 11111100 | 00000000 00011111 11111110 00000000
9212a593bc5SZachary Turner // After:
9222a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 00000011 | 11110000 00000000 01111111 11111000
9232a593bc5SZachary Turner A >>= 6;
9242a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(40, {{3, 15}, {28, 34}}), A);
9252a593bc5SZachary Turner
9262a593bc5SZachary Turner // 2c. Make sure that right shifting some 1 bits out of the vector works.
9272a593bc5SZachary Turner // 31----------------------------------------------------------------------0
9282a593bc5SZachary Turner // Before:
9292a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 00000011 | 11110000 00000000 01111111 11111000
9302a593bc5SZachary Turner // After:
9312a593bc5SZachary Turner // XXXXXXXX XXXXXXXX XXXXXXXX 00000000 | 00000000 11111100 00000000 00011111
9322a593bc5SZachary Turner A >>= 10;
9332a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(40, {{0, 5}, {18, 24}}), A);
9342a593bc5SZachary Turner
9352a593bc5SZachary Turner // 3. Big test.
9362a593bc5SZachary Turner A = createBitVector<TypeParam>(300, {{1, 30}, {60, 95}, {200, 275}});
9372a593bc5SZachary Turner A <<= 29;
9382a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(
9392a593bc5SZachary Turner 300, {{1 + 29, 30 + 29}, {60 + 29, 95 + 29}, {200 + 29, 300}}),
9402a593bc5SZachary Turner A);
9412a593bc5SZachary Turner }
9422a593bc5SZachary Turner
TYPED_TEST(BitVectorTest,ShiftOpsMultiWord)9432a593bc5SZachary Turner TYPED_TEST(BitVectorTest, ShiftOpsMultiWord) {
9442a593bc5SZachary Turner // Test that shift ops work when the desired shift amount is greater than or
9452a593bc5SZachary Turner // equal to the size of a single word.
9462a593bc5SZachary Turner auto A = createBitVector<TypeParam>(300, {{1, 30}, {60, 95}, {200, 275}});
9472a593bc5SZachary Turner
9482a593bc5SZachary Turner // Make a copy so we can re-use it later.
9492a593bc5SZachary Turner auto B = A;
9502a593bc5SZachary Turner
9512a593bc5SZachary Turner // 1. Shift left by an exact multiple of the word size. This should invoke
9522a593bc5SZachary Turner // only a memmove and no per-word bit operations.
9532a593bc5SZachary Turner A <<= 64;
9542a593bc5SZachary Turner auto Expected = createBitVector<TypeParam>(
9552a593bc5SZachary Turner 300, {{1 + 64, 30 + 64}, {60 + 64, 95 + 64}, {200 + 64, 300}});
9562a593bc5SZachary Turner EXPECT_EQ(Expected, A);
9572a593bc5SZachary Turner
9582a593bc5SZachary Turner // 2. Shift left by a non multiple of the word size. This should invoke both
9592a593bc5SZachary Turner // a memmove and per-word bit operations.
9602a593bc5SZachary Turner A = B;
9612a593bc5SZachary Turner A <<= 93;
9622a593bc5SZachary Turner EXPECT_EQ(createBitVector<TypeParam>(
9632a593bc5SZachary Turner 300, {{1 + 93, 30 + 93}, {60 + 93, 95 + 93}, {200 + 93, 300}}),
9642a593bc5SZachary Turner A);
9652a593bc5SZachary Turner
9662a593bc5SZachary Turner // 1. Shift right by an exact multiple of the word size. This should invoke
9672a593bc5SZachary Turner // only a memmove and no per-word bit operations.
9682a593bc5SZachary Turner A = B;
9692a593bc5SZachary Turner A >>= 64;
9702a593bc5SZachary Turner EXPECT_EQ(
9712a593bc5SZachary Turner createBitVector<TypeParam>(300, {{0, 95 - 64}, {200 - 64, 275 - 64}}), A);
9722a593bc5SZachary Turner
9732a593bc5SZachary Turner // 2. Shift left by a non multiple of the word size. This should invoke both
9742a593bc5SZachary Turner // a memmove and per-word bit operations.
9752a593bc5SZachary Turner A = B;
9762a593bc5SZachary Turner A >>= 93;
9772a593bc5SZachary Turner EXPECT_EQ(
9782a593bc5SZachary Turner createBitVector<TypeParam>(300, {{0, 95 - 93}, {200 - 93, 275 - 93}}), A);
9792a593bc5SZachary Turner }
9802a593bc5SZachary Turner
TYPED_TEST(BitVectorTest,RangeOps)9816b7bdf88SOwen Anderson TYPED_TEST(BitVectorTest, RangeOps) {
9826b7bdf88SOwen Anderson TypeParam A;
9836b7bdf88SOwen Anderson A.resize(256);
9846b7bdf88SOwen Anderson A.reset();
9856b7bdf88SOwen Anderson A.set(1, 255);
9866b7bdf88SOwen Anderson
9876b7bdf88SOwen Anderson EXPECT_FALSE(A.test(0));
9886b7bdf88SOwen Anderson EXPECT_TRUE( A.test(1));
9896b7bdf88SOwen Anderson EXPECT_TRUE( A.test(23));
9906b7bdf88SOwen Anderson EXPECT_TRUE( A.test(254));
9916b7bdf88SOwen Anderson EXPECT_FALSE(A.test(255));
9926b7bdf88SOwen Anderson
9936b7bdf88SOwen Anderson TypeParam B;
9946b7bdf88SOwen Anderson B.resize(256);
9956b7bdf88SOwen Anderson B.set();
9966b7bdf88SOwen Anderson B.reset(1, 255);
9976b7bdf88SOwen Anderson
9986b7bdf88SOwen Anderson EXPECT_TRUE( B.test(0));
9996b7bdf88SOwen Anderson EXPECT_FALSE(B.test(1));
10006b7bdf88SOwen Anderson EXPECT_FALSE(B.test(23));
10016b7bdf88SOwen Anderson EXPECT_FALSE(B.test(254));
10026b7bdf88SOwen Anderson EXPECT_TRUE( B.test(255));
10036b7bdf88SOwen Anderson
10046b7bdf88SOwen Anderson TypeParam C;
10056b7bdf88SOwen Anderson C.resize(3);
10066b7bdf88SOwen Anderson C.reset();
10076b7bdf88SOwen Anderson C.set(0, 1);
10086b7bdf88SOwen Anderson
10096b7bdf88SOwen Anderson EXPECT_TRUE(C.test(0));
10106b7bdf88SOwen Anderson EXPECT_FALSE( C.test(1));
10116b7bdf88SOwen Anderson EXPECT_FALSE( C.test(2));
10126b7bdf88SOwen Anderson
10136b7bdf88SOwen Anderson TypeParam D;
10146b7bdf88SOwen Anderson D.resize(3);
10156b7bdf88SOwen Anderson D.set();
10166b7bdf88SOwen Anderson D.reset(0, 1);
10176b7bdf88SOwen Anderson
10186b7bdf88SOwen Anderson EXPECT_FALSE(D.test(0));
10196b7bdf88SOwen Anderson EXPECT_TRUE( D.test(1));
10206b7bdf88SOwen Anderson EXPECT_TRUE( D.test(2));
102104b8daa9SOwen Anderson
102204b8daa9SOwen Anderson TypeParam E;
102304b8daa9SOwen Anderson E.resize(128);
102404b8daa9SOwen Anderson E.reset();
102504b8daa9SOwen Anderson E.set(1, 33);
102604b8daa9SOwen Anderson
102704b8daa9SOwen Anderson EXPECT_FALSE(E.test(0));
102804b8daa9SOwen Anderson EXPECT_TRUE( E.test(1));
102904b8daa9SOwen Anderson EXPECT_TRUE( E.test(32));
103004b8daa9SOwen Anderson EXPECT_FALSE(E.test(33));
1031386328f9SAnna Zaks
1032386328f9SAnna Zaks TypeParam BufferOverrun;
1033386328f9SAnna Zaks unsigned size = sizeof(unsigned long) * 8;
1034386328f9SAnna Zaks BufferOverrun.resize(size);
1035386328f9SAnna Zaks BufferOverrun.reset(0, size);
1036386328f9SAnna Zaks BufferOverrun.set(0, size);
10376b7bdf88SOwen Anderson }
10381c7fcccbSBenjamin Kramer
TYPED_TEST(BitVectorTest,CompoundTestReset)10391c7fcccbSBenjamin Kramer TYPED_TEST(BitVectorTest, CompoundTestReset) {
10401c7fcccbSBenjamin Kramer TypeParam A(50, true);
10411c7fcccbSBenjamin Kramer TypeParam B(50, false);
10421c7fcccbSBenjamin Kramer
10431c7fcccbSBenjamin Kramer TypeParam C(100, true);
10441c7fcccbSBenjamin Kramer TypeParam D(100, false);
10451c7fcccbSBenjamin Kramer
10461c7fcccbSBenjamin Kramer EXPECT_FALSE(A.test(A));
10471c7fcccbSBenjamin Kramer EXPECT_TRUE(A.test(B));
10481c7fcccbSBenjamin Kramer EXPECT_FALSE(A.test(C));
10491c7fcccbSBenjamin Kramer EXPECT_TRUE(A.test(D));
10501c7fcccbSBenjamin Kramer EXPECT_FALSE(B.test(A));
10511c7fcccbSBenjamin Kramer EXPECT_FALSE(B.test(B));
10521c7fcccbSBenjamin Kramer EXPECT_FALSE(B.test(C));
10531c7fcccbSBenjamin Kramer EXPECT_FALSE(B.test(D));
10541c7fcccbSBenjamin Kramer EXPECT_TRUE(C.test(A));
10551c7fcccbSBenjamin Kramer EXPECT_TRUE(C.test(B));
10561c7fcccbSBenjamin Kramer EXPECT_FALSE(C.test(C));
10571c7fcccbSBenjamin Kramer EXPECT_TRUE(C.test(D));
10581c7fcccbSBenjamin Kramer
10591c7fcccbSBenjamin Kramer A.reset(B);
10601c7fcccbSBenjamin Kramer A.reset(D);
10611c7fcccbSBenjamin Kramer EXPECT_TRUE(A.all());
10621c7fcccbSBenjamin Kramer A.reset(A);
10631c7fcccbSBenjamin Kramer EXPECT_TRUE(A.none());
10641c7fcccbSBenjamin Kramer A.set();
10651c7fcccbSBenjamin Kramer A.reset(C);
10661c7fcccbSBenjamin Kramer EXPECT_TRUE(A.none());
10671c7fcccbSBenjamin Kramer A.set();
10681c7fcccbSBenjamin Kramer
10691c7fcccbSBenjamin Kramer C.reset(A);
10701c7fcccbSBenjamin Kramer EXPECT_EQ(50, C.find_first());
10711c7fcccbSBenjamin Kramer C.reset(C);
10721c7fcccbSBenjamin Kramer EXPECT_TRUE(C.none());
10731c7fcccbSBenjamin Kramer }
1074660b1a49SEvgeniy Stepanov
TYPED_TEST(BitVectorTest,MoveConstructor)1075660b1a49SEvgeniy Stepanov TYPED_TEST(BitVectorTest, MoveConstructor) {
1076660b1a49SEvgeniy Stepanov TypeParam A(10, true);
1077660b1a49SEvgeniy Stepanov TypeParam B(std::move(A));
1078660b1a49SEvgeniy Stepanov // Check that the move ctor leaves the moved-from object in a valid state.
1079660b1a49SEvgeniy Stepanov // The following line used to crash.
1080660b1a49SEvgeniy Stepanov A = B;
1081660b1a49SEvgeniy Stepanov
1082660b1a49SEvgeniy Stepanov TypeParam C(10, true);
1083660b1a49SEvgeniy Stepanov EXPECT_EQ(C, A);
1084660b1a49SEvgeniy Stepanov EXPECT_EQ(C, B);
1085660b1a49SEvgeniy Stepanov }
1086660b1a49SEvgeniy Stepanov
TYPED_TEST(BitVectorTest,MoveAssignment)1087660b1a49SEvgeniy Stepanov TYPED_TEST(BitVectorTest, MoveAssignment) {
1088660b1a49SEvgeniy Stepanov TypeParam A(10, true);
1089660b1a49SEvgeniy Stepanov TypeParam B;
1090660b1a49SEvgeniy Stepanov B = std::move(A);
1091660b1a49SEvgeniy Stepanov // Check that move assignment leaves the moved-from object in a valid state.
1092660b1a49SEvgeniy Stepanov // The following line used to crash.
1093660b1a49SEvgeniy Stepanov A = B;
1094660b1a49SEvgeniy Stepanov
1095660b1a49SEvgeniy Stepanov TypeParam C(10, true);
1096660b1a49SEvgeniy Stepanov EXPECT_EQ(C, A);
1097660b1a49SEvgeniy Stepanov EXPECT_EQ(C, B);
1098660b1a49SEvgeniy Stepanov }
1099660b1a49SEvgeniy Stepanov
1100617a1994SMatthias Braun template<class TypeParam>
testEmpty(const TypeParam & A)1101617a1994SMatthias Braun static void testEmpty(const TypeParam &A) {
1102617a1994SMatthias Braun EXPECT_TRUE(A.empty());
1103617a1994SMatthias Braun EXPECT_EQ((size_t)0, A.size());
1104617a1994SMatthias Braun EXPECT_EQ((size_t)0, A.count());
1105617a1994SMatthias Braun EXPECT_FALSE(A.any());
1106617a1994SMatthias Braun EXPECT_TRUE(A.all());
1107617a1994SMatthias Braun EXPECT_TRUE(A.none());
1108617a1994SMatthias Braun EXPECT_EQ(-1, A.find_first());
1109617a1994SMatthias Braun EXPECT_EQ(A, TypeParam());
1110617a1994SMatthias Braun }
1111617a1994SMatthias Braun
1112617a1994SMatthias Braun /// Tests whether BitVector behaves well with Bits==nullptr, Capacity==0
TYPED_TEST(BitVectorTest,EmptyVector)1113617a1994SMatthias Braun TYPED_TEST(BitVectorTest, EmptyVector) {
1114617a1994SMatthias Braun TypeParam A;
1115617a1994SMatthias Braun testEmpty(A);
1116617a1994SMatthias Braun
1117617a1994SMatthias Braun TypeParam B;
1118617a1994SMatthias Braun B.reset();
1119617a1994SMatthias Braun testEmpty(B);
1120617a1994SMatthias Braun
1121617a1994SMatthias Braun TypeParam C;
1122617a1994SMatthias Braun C.clear();
1123617a1994SMatthias Braun testEmpty(C);
1124617a1994SMatthias Braun
1125617a1994SMatthias Braun TypeParam D(A);
1126617a1994SMatthias Braun testEmpty(D);
1127617a1994SMatthias Braun
1128617a1994SMatthias Braun TypeParam E;
1129617a1994SMatthias Braun E = A;
1130617a1994SMatthias Braun testEmpty(E);
1131617a1994SMatthias Braun
1132617a1994SMatthias Braun TypeParam F;
1133617a1994SMatthias Braun E.reset(A);
1134617a1994SMatthias Braun testEmpty(E);
1135617a1994SMatthias Braun }
1136617a1994SMatthias Braun
TYPED_TEST(BitVectorTest,Iterators)1137b52e0366SFrancis Visoiu Mistrih TYPED_TEST(BitVectorTest, Iterators) {
1138b52e0366SFrancis Visoiu Mistrih TypeParam Filled(10, true);
1139b52e0366SFrancis Visoiu Mistrih EXPECT_NE(Filled.set_bits_begin(), Filled.set_bits_end());
1140b52e0366SFrancis Visoiu Mistrih unsigned Counter = 0;
1141b52e0366SFrancis Visoiu Mistrih for (unsigned Bit : Filled.set_bits())
1142b52e0366SFrancis Visoiu Mistrih EXPECT_EQ(Bit, Counter++);
1143b52e0366SFrancis Visoiu Mistrih
1144b52e0366SFrancis Visoiu Mistrih TypeParam Empty;
1145b52e0366SFrancis Visoiu Mistrih EXPECT_EQ(Empty.set_bits_begin(), Empty.set_bits_end());
1146fb4f6057SPaul Robinson int BitCount = 0;
1147b52e0366SFrancis Visoiu Mistrih for (unsigned Bit : Empty.set_bits()) {
1148b52e0366SFrancis Visoiu Mistrih (void)Bit;
1149fb4f6057SPaul Robinson BitCount++;
1150b52e0366SFrancis Visoiu Mistrih }
1151fb4f6057SPaul Robinson ASSERT_EQ(BitCount, 0);
1152b52e0366SFrancis Visoiu Mistrih
1153b52e0366SFrancis Visoiu Mistrih TypeParam ToFill(100, false);
1154b52e0366SFrancis Visoiu Mistrih ToFill.set(0);
1155b52e0366SFrancis Visoiu Mistrih EXPECT_NE(ToFill.set_bits_begin(), ToFill.set_bits_end());
1156b52e0366SFrancis Visoiu Mistrih EXPECT_EQ(++ToFill.set_bits_begin(), ToFill.set_bits_end());
1157b52e0366SFrancis Visoiu Mistrih EXPECT_EQ(*ToFill.set_bits_begin(), 0U);
1158b52e0366SFrancis Visoiu Mistrih ToFill.reset(0);
1159b52e0366SFrancis Visoiu Mistrih EXPECT_EQ(ToFill.set_bits_begin(), ToFill.set_bits_end());
1160b52e0366SFrancis Visoiu Mistrih
1161b52e0366SFrancis Visoiu Mistrih const unsigned List[] = {1, 10, 25, 99};
1162b52e0366SFrancis Visoiu Mistrih for (unsigned Num : List)
1163b52e0366SFrancis Visoiu Mistrih ToFill.set(Num);
1164b52e0366SFrancis Visoiu Mistrih unsigned i = 0;
1165b52e0366SFrancis Visoiu Mistrih for (unsigned Bit : ToFill.set_bits())
1166b52e0366SFrancis Visoiu Mistrih EXPECT_EQ(List[i++], Bit);
1167b52e0366SFrancis Visoiu Mistrih }
116807a5fcd8SSimon Pilgrim
TYPED_TEST(BitVectorTest,PushBack)116907a5fcd8SSimon Pilgrim TYPED_TEST(BitVectorTest, PushBack) {
117007a5fcd8SSimon Pilgrim TypeParam Vec(10, false);
117107a5fcd8SSimon Pilgrim EXPECT_EQ(-1, Vec.find_first());
1172896c03d0SSimon Pilgrim EXPECT_EQ(10U, Vec.size());
1173896c03d0SSimon Pilgrim EXPECT_EQ(0U, Vec.count());
1174*622354a5SJan Svoboda EXPECT_EQ(false, Vec.back());
117507a5fcd8SSimon Pilgrim
117607a5fcd8SSimon Pilgrim Vec.push_back(true);
117707a5fcd8SSimon Pilgrim EXPECT_EQ(10, Vec.find_first());
1178896c03d0SSimon Pilgrim EXPECT_EQ(11U, Vec.size());
1179896c03d0SSimon Pilgrim EXPECT_EQ(1U, Vec.count());
1180*622354a5SJan Svoboda EXPECT_EQ(true, Vec.back());
118107a5fcd8SSimon Pilgrim
118207a5fcd8SSimon Pilgrim Vec.push_back(false);
118307a5fcd8SSimon Pilgrim EXPECT_EQ(10, Vec.find_first());
1184896c03d0SSimon Pilgrim EXPECT_EQ(12U, Vec.size());
1185896c03d0SSimon Pilgrim EXPECT_EQ(1U, Vec.count());
1186*622354a5SJan Svoboda EXPECT_EQ(false, Vec.back());
118707a5fcd8SSimon Pilgrim
118807a5fcd8SSimon Pilgrim Vec.push_back(true);
118907a5fcd8SSimon Pilgrim EXPECT_EQ(10, Vec.find_first());
1190896c03d0SSimon Pilgrim EXPECT_EQ(13U, Vec.size());
1191896c03d0SSimon Pilgrim EXPECT_EQ(2U, Vec.count());
1192*622354a5SJan Svoboda EXPECT_EQ(true, Vec.back());
119307a5fcd8SSimon Pilgrim
119407a5fcd8SSimon Pilgrim // Add a lot of values to cause reallocation.
119507a5fcd8SSimon Pilgrim for (int i = 0; i != 100; ++i) {
119607a5fcd8SSimon Pilgrim Vec.push_back(true);
119707a5fcd8SSimon Pilgrim Vec.push_back(false);
119807a5fcd8SSimon Pilgrim }
119907a5fcd8SSimon Pilgrim EXPECT_EQ(10, Vec.find_first());
1200896c03d0SSimon Pilgrim EXPECT_EQ(213U, Vec.size());
1201896c03d0SSimon Pilgrim EXPECT_EQ(102U, Vec.count());
120207a5fcd8SSimon Pilgrim }
1203d110c3a9SAlexandre Ganea
TYPED_TEST(BitVectorTest,PopBack)1204*622354a5SJan Svoboda TYPED_TEST(BitVectorTest, PopBack) {
1205*622354a5SJan Svoboda TypeParam Vec(10, true);
1206*622354a5SJan Svoboda EXPECT_EQ(10U, Vec.size());
1207*622354a5SJan Svoboda EXPECT_EQ(10U, Vec.count());
1208*622354a5SJan Svoboda EXPECT_EQ(true, Vec.back());
1209*622354a5SJan Svoboda
1210*622354a5SJan Svoboda Vec.pop_back();
1211*622354a5SJan Svoboda EXPECT_EQ(9U, Vec.size());
1212*622354a5SJan Svoboda EXPECT_EQ(9U, Vec.count());
1213*622354a5SJan Svoboda EXPECT_EQ(true, Vec.back());
1214*622354a5SJan Svoboda
1215*622354a5SJan Svoboda Vec.push_back(false);
1216*622354a5SJan Svoboda EXPECT_EQ(10U, Vec.size());
1217*622354a5SJan Svoboda EXPECT_EQ(9U, Vec.count());
1218*622354a5SJan Svoboda EXPECT_EQ(false, Vec.back());
1219*622354a5SJan Svoboda
1220*622354a5SJan Svoboda Vec.pop_back();
1221*622354a5SJan Svoboda EXPECT_EQ(9U, Vec.size());
1222*622354a5SJan Svoboda EXPECT_EQ(9U, Vec.count());
1223*622354a5SJan Svoboda EXPECT_EQ(true, Vec.back());
1224*622354a5SJan Svoboda }
1225*622354a5SJan Svoboda
TYPED_TEST(BitVectorTest,DenseSet)1226d110c3a9SAlexandre Ganea TYPED_TEST(BitVectorTest, DenseSet) {
1227d110c3a9SAlexandre Ganea DenseSet<TypeParam> Set;
1228d110c3a9SAlexandre Ganea TypeParam A(10, true);
1229d110c3a9SAlexandre Ganea auto I = Set.insert(A);
1230d110c3a9SAlexandre Ganea EXPECT_EQ(true, I.second);
1231d110c3a9SAlexandre Ganea
1232d110c3a9SAlexandre Ganea TypeParam B(5, true);
1233d110c3a9SAlexandre Ganea I = Set.insert(B);
1234d110c3a9SAlexandre Ganea EXPECT_EQ(true, I.second);
1235d110c3a9SAlexandre Ganea
1236d110c3a9SAlexandre Ganea TypeParam C(20, false);
1237d110c3a9SAlexandre Ganea C.set(19);
1238d110c3a9SAlexandre Ganea I = Set.insert(C);
1239d110c3a9SAlexandre Ganea EXPECT_EQ(true, I.second);
1240d110c3a9SAlexandre Ganea
12410d2ba657SAlexandre Ganea #if LLVM_ENABLE_ABI_BREAKING_CHECKS
1242d110c3a9SAlexandre Ganea TypeParam D;
1243d110c3a9SAlexandre Ganea EXPECT_DEATH(Set.insert(D),
1244d110c3a9SAlexandre Ganea "Empty/Tombstone value shouldn't be inserted into map!");
12450d2ba657SAlexandre Ganea #endif
1246d110c3a9SAlexandre Ganea
1247d110c3a9SAlexandre Ganea EXPECT_EQ(3U, Set.size());
1248d110c3a9SAlexandre Ganea EXPECT_EQ(1U, Set.count(A));
1249d110c3a9SAlexandre Ganea EXPECT_EQ(1U, Set.count(B));
1250d110c3a9SAlexandre Ganea EXPECT_EQ(1U, Set.count(C));
1251d110c3a9SAlexandre Ganea
1252d110c3a9SAlexandre Ganea EXPECT_EQ(true, Set.erase(B));
1253d110c3a9SAlexandre Ganea EXPECT_EQ(2U, Set.size());
1254d110c3a9SAlexandre Ganea
1255d110c3a9SAlexandre Ganea EXPECT_EQ(true, Set.erase(C));
1256d110c3a9SAlexandre Ganea EXPECT_EQ(1U, Set.size());
1257d110c3a9SAlexandre Ganea
1258d110c3a9SAlexandre Ganea EXPECT_EQ(true, Set.erase(A));
1259d110c3a9SAlexandre Ganea EXPECT_EQ(0U, Set.size());
12602fad493fSJakob Stoklund Olesen }
1261fb42d3afSBrad Moody
1262fb42d3afSBrad Moody /// Test that capacity doesn't affect hashing.
TYPED_TEST(BitVectorTest,DenseMapHashing)1263fb42d3afSBrad Moody TYPED_TEST(BitVectorTest, DenseMapHashing) {
1264fb42d3afSBrad Moody using DMI = DenseMapInfo<TypeParam>;
1265fb42d3afSBrad Moody {
1266fb42d3afSBrad Moody TypeParam A;
1267fb42d3afSBrad Moody A.resize(200);
1268fb42d3afSBrad Moody A.set(100);
1269fb42d3afSBrad Moody
1270fb42d3afSBrad Moody TypeParam B;
1271fb42d3afSBrad Moody B.resize(200);
1272fb42d3afSBrad Moody B.set(100);
1273fb42d3afSBrad Moody B.reserve(1000);
1274fb42d3afSBrad Moody
1275fb42d3afSBrad Moody EXPECT_EQ(DMI::getHashValue(A), DMI::getHashValue(B));
1276fb42d3afSBrad Moody }
1277fb42d3afSBrad Moody {
1278fb42d3afSBrad Moody TypeParam A;
1279fb42d3afSBrad Moody A.resize(20);
1280fb42d3afSBrad Moody A.set(10);
1281fb42d3afSBrad Moody
1282fb42d3afSBrad Moody TypeParam B;
1283fb42d3afSBrad Moody B.resize(20);
1284fb42d3afSBrad Moody B.set(10);
1285fb42d3afSBrad Moody B.reserve(1000);
1286fb42d3afSBrad Moody
1287fb42d3afSBrad Moody EXPECT_EQ(DMI::getHashValue(A), DMI::getHashValue(B));
1288fb42d3afSBrad Moody }
1289fb42d3afSBrad Moody }
1290fb42d3afSBrad Moody
TEST(BitVectoryTest,Apply)1291e19884cdSserge-sans-paille TEST(BitVectoryTest, Apply) {
1292e19884cdSserge-sans-paille for (int i = 0; i < 2; ++i) {
1293e19884cdSserge-sans-paille int j = i * 100 + 3;
1294e19884cdSserge-sans-paille
1295e19884cdSserge-sans-paille const BitVector x =
1296e19884cdSserge-sans-paille createBitVector<BitVector>(j + 5, {{i, i + 1}, {j - 1, j}});
1297e19884cdSserge-sans-paille const BitVector y = createBitVector<BitVector>(j + 5, {{i, j}});
1298e19884cdSserge-sans-paille const BitVector z =
1299e19884cdSserge-sans-paille createBitVector<BitVector>(j + 5, {{i + 1, i + 2}, {j, j + 1}});
1300e19884cdSserge-sans-paille
1301e19884cdSserge-sans-paille auto op0 = [](auto x) { return ~x; };
1302e19884cdSserge-sans-paille BitVector expected0 = x;
1303e19884cdSserge-sans-paille expected0.flip();
1304e19884cdSserge-sans-paille BitVector out0(j - 2);
1305e19884cdSserge-sans-paille BitVector::apply(op0, out0, x);
1306e19884cdSserge-sans-paille EXPECT_EQ(out0, expected0);
1307e19884cdSserge-sans-paille
1308e19884cdSserge-sans-paille auto op1 = [](auto x, auto y) { return x & ~y; };
1309e19884cdSserge-sans-paille BitVector expected1 = x;
1310e19884cdSserge-sans-paille expected1.reset(y);
1311e19884cdSserge-sans-paille BitVector out1;
1312e19884cdSserge-sans-paille BitVector::apply(op1, out1, x, y);
1313e19884cdSserge-sans-paille EXPECT_EQ(out1, expected1);
1314e19884cdSserge-sans-paille
1315e19884cdSserge-sans-paille auto op2 = [](auto x, auto y, auto z) { return (x ^ ~y) | z; };
1316e19884cdSserge-sans-paille BitVector expected2 = y;
1317e19884cdSserge-sans-paille expected2.flip();
1318e19884cdSserge-sans-paille expected2 ^= x;
1319e19884cdSserge-sans-paille expected2 |= z;
1320e19884cdSserge-sans-paille BitVector out2(j + 5);
1321e19884cdSserge-sans-paille BitVector::apply(op2, out2, x, y, z);
1322e19884cdSserge-sans-paille EXPECT_EQ(out2, expected2);
1323e19884cdSserge-sans-paille }
1324e19884cdSserge-sans-paille }
1325e19884cdSserge-sans-paille
1326e19884cdSserge-sans-paille
1327d110c3a9SAlexandre Ganea } // namespace
1328