//===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // Some of these tests fail on PowerPC for unknown reasons. #ifndef __ppc__ #include "llvm/ADT/BitVector.h" #include "gtest/gtest.h" using namespace llvm; namespace { TEST(BitVectorTest, TrivialOperation) { BitVector Vec; EXPECT_EQ(0U, Vec.count()); EXPECT_EQ(0U, Vec.size()); EXPECT_FALSE(Vec.any()); EXPECT_TRUE(Vec.all()); EXPECT_TRUE(Vec.none()); EXPECT_TRUE(Vec.empty()); Vec.resize(5, true); EXPECT_EQ(5U, Vec.count()); EXPECT_EQ(5U, Vec.size()); EXPECT_TRUE(Vec.any()); EXPECT_TRUE(Vec.all()); EXPECT_FALSE(Vec.none()); EXPECT_FALSE(Vec.empty()); Vec.resize(11); EXPECT_EQ(5U, Vec.count()); EXPECT_EQ(11U, Vec.size()); EXPECT_TRUE(Vec.any()); EXPECT_FALSE(Vec.all()); EXPECT_FALSE(Vec.none()); EXPECT_FALSE(Vec.empty()); BitVector Inv = ~Vec; EXPECT_EQ(6U, Inv.count()); EXPECT_EQ(11U, Inv.size()); EXPECT_TRUE(Inv.any()); EXPECT_FALSE(Inv.all()); EXPECT_FALSE(Inv.none()); EXPECT_FALSE(Inv.empty()); EXPECT_FALSE(Inv == Vec); EXPECT_TRUE(Inv != Vec); Vec = ~Vec; EXPECT_TRUE(Inv == Vec); EXPECT_FALSE(Inv != Vec); // Add some "interesting" data to Vec. Vec.resize(23, true); Vec.resize(25, false); Vec.resize(26, true); Vec.resize(29, false); Vec.resize(33, true); Vec.resize(57, false); unsigned Count = 0; for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) { ++Count; EXPECT_TRUE(Vec[i]); EXPECT_TRUE(Vec.test(i)); } EXPECT_EQ(Count, Vec.count()); EXPECT_EQ(Count, 23u); EXPECT_FALSE(Vec[0]); EXPECT_TRUE(Vec[32]); EXPECT_FALSE(Vec[56]); Vec.resize(61, false); BitVector Copy = Vec; BitVector Alt(3, false); Alt.resize(6, true); std::swap(Alt, Vec); EXPECT_TRUE(Copy == Alt); EXPECT_TRUE(Vec.size() == 6); EXPECT_TRUE(Vec.count() == 3); EXPECT_TRUE(Vec.find_first() == 3); std::swap(Copy, Vec); // Add some more "interesting" data. Vec.resize(68, true); Vec.resize(78, false); Vec.resize(89, true); Vec.resize(90, false); Vec.resize(91, true); Vec.resize(130, false); Count = 0; for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) { ++Count; EXPECT_TRUE(Vec[i]); EXPECT_TRUE(Vec.test(i)); } EXPECT_EQ(Count, Vec.count()); EXPECT_EQ(Count, 42u); EXPECT_FALSE(Vec[0]); EXPECT_TRUE(Vec[32]); EXPECT_FALSE(Vec[60]); EXPECT_FALSE(Vec[129]); Vec.flip(60); EXPECT_TRUE(Vec[60]); EXPECT_EQ(Count + 1, Vec.count()); Vec.flip(60); EXPECT_FALSE(Vec[60]); EXPECT_EQ(Count, Vec.count()); Vec.reset(32); EXPECT_FALSE(Vec[32]); EXPECT_EQ(Count - 1, Vec.count()); Vec.set(32); EXPECT_TRUE(Vec[32]); EXPECT_EQ(Count, Vec.count()); Vec.flip(); EXPECT_EQ(Vec.size() - Count, Vec.count()); Vec.reset(); EXPECT_EQ(0U, Vec.count()); EXPECT_EQ(130U, Vec.size()); EXPECT_FALSE(Vec.any()); EXPECT_FALSE(Vec.all()); EXPECT_TRUE(Vec.none()); EXPECT_FALSE(Vec.empty()); Inv = ~BitVector(); EXPECT_EQ(0U, Inv.count()); EXPECT_EQ(0U, Inv.size()); EXPECT_FALSE(Inv.any()); EXPECT_TRUE(Inv.all()); EXPECT_TRUE(Inv.none()); EXPECT_TRUE(Inv.empty()); Vec.clear(); EXPECT_EQ(0U, Vec.count()); EXPECT_EQ(0U, Vec.size()); EXPECT_FALSE(Vec.any()); EXPECT_TRUE(Vec.all()); EXPECT_TRUE(Vec.none()); EXPECT_TRUE(Vec.empty()); } TEST(BitVectorTest, CompoundAssignment) { BitVector A; A.resize(10); A.set(4); A.set(7); BitVector B; B.resize(50); B.set(5); B.set(18); A |= B; EXPECT_TRUE(A.test(4)); EXPECT_TRUE(A.test(5)); EXPECT_TRUE(A.test(7)); EXPECT_TRUE(A.test(18)); EXPECT_EQ(4U, A.count()); EXPECT_EQ(50U, A.size()); B.resize(10); B.set(); B.reset(2); B.reset(7); A &= B; EXPECT_FALSE(A.test(2)); EXPECT_FALSE(A.test(7)); EXPECT_EQ(2U, A.count()); EXPECT_EQ(50U, A.size()); B.resize(100); B.set(); A ^= B; EXPECT_TRUE(A.test(2)); EXPECT_TRUE(A.test(7)); EXPECT_EQ(98U, A.count()); EXPECT_EQ(100U, A.size()); } TEST(BitVectorTest, ProxyIndex) { BitVector Vec(3); EXPECT_TRUE(Vec.none()); Vec[0] = Vec[1] = Vec[2] = true; EXPECT_EQ(Vec.size(), Vec.count()); Vec[2] = Vec[1] = Vec[0] = false; EXPECT_TRUE(Vec.none()); } } #endif