|  | //===- 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 |