SmallBitVector: Rework find_first/find_next and tweak test to test them (at least on 64 bit platforms).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102712 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2010-04-30 13:40:27 +00:00
parent b252fbd179
commit 6340722d17
2 changed files with 15 additions and 16 deletions

View File

@ -199,13 +199,12 @@ public:
int find_first() const {
if (isSmall()) {
uintptr_t Bits = getSmallBits();
if (sizeof(uintptr_t) * CHAR_BIT == 32) {
size_t FirstBit = CountTrailingZeros_32(Bits);
return FirstBit == 32 ? -1 : FirstBit;
} else if (sizeof(uintptr_t) * CHAR_BIT == 64) {
size_t FirstBit = CountTrailingZeros_64(Bits);
return FirstBit == 64 ? -1 : FirstBit;
}
if (Bits == 0)
return -1;
if (sizeof(uintptr_t) * CHAR_BIT == 32)
return CountTrailingZeros_32(Bits);
if (sizeof(uintptr_t) * CHAR_BIT == 64)
return CountTrailingZeros_64(Bits);
assert(0 && "Unsupported!");
}
return getPointer()->find_first();
@ -218,13 +217,12 @@ public:
uintptr_t Bits = getSmallBits();
// Mask off previous bits.
Bits &= ~uintptr_t(0) << (Prev + 1);
if (sizeof(uintptr_t) * CHAR_BIT == 32) {
size_t FirstBit = CountTrailingZeros_32(Bits);
return FirstBit == 32 ? -1 : FirstBit;
} else if (sizeof(uintptr_t) * CHAR_BIT == 64) {
size_t FirstBit = CountTrailingZeros_64(Bits);
return FirstBit == 64 ? -1 : FirstBit;
}
if (Bits == 0 || Prev + 1 >= getSmallSize())
return -1;
if (sizeof(uintptr_t) * CHAR_BIT == 32)
return CountTrailingZeros_32(Bits);
if (sizeof(uintptr_t) * CHAR_BIT == 64)
return CountTrailingZeros_64(Bits);
assert(0 && "Unsupported!");
}
return getPointer()->find_next(Prev);

View File

@ -55,7 +55,7 @@ TEST(SmallBitVectorTest, TrivialOperation) {
Vec.resize(26, true);
Vec.resize(29, false);
Vec.resize(33, true);
Vec.resize(61, false);
Vec.resize(57, false);
unsigned Count = 0;
for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
++Count;
@ -66,7 +66,8 @@ TEST(SmallBitVectorTest, TrivialOperation) {
EXPECT_EQ(Count, 23u);
EXPECT_FALSE(Vec[0]);
EXPECT_TRUE(Vec[32]);
EXPECT_FALSE(Vec[60]);
EXPECT_FALSE(Vec[56]);
Vec.resize(61, false);
SmallBitVector Copy = Vec;
SmallBitVector Alt(3, false);