mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[ADT] Add SparseBitVector::find_last().
Differential Revision: https://reviews.llvm.org/D28817 llvm-svn: 292288
This commit is contained in:
parent
279707ab7f
commit
0a3b8732fd
@ -132,6 +132,17 @@ public:
|
||||
llvm_unreachable("Illegal empty element");
|
||||
}
|
||||
|
||||
/// find_last - Returns the index of the last set bit.
|
||||
int find_last() const {
|
||||
for (unsigned I = 0; I < BITWORDS_PER_ELEMENT; ++I) {
|
||||
unsigned Idx = BITWORDS_PER_ELEMENT - I - 1;
|
||||
if (Bits[Idx] != 0)
|
||||
return Idx * BITWORD_SIZE + BITWORD_SIZE -
|
||||
countLeadingZeros(Bits[Idx]) - 1;
|
||||
}
|
||||
llvm_unreachable("Illegal empty element");
|
||||
}
|
||||
|
||||
/// find_next - Returns the index of the next set bit starting from the
|
||||
/// "Curr" bit. Returns -1 if the next set bit is not found.
|
||||
int find_next(unsigned Curr) const {
|
||||
@ -768,6 +779,14 @@ public:
|
||||
return (First.index() * ElementSize) + First.find_first();
|
||||
}
|
||||
|
||||
// Return the last set bit in the bitmap. Return -1 if no bits are set.
|
||||
int find_last() const {
|
||||
if (Elements.empty())
|
||||
return -1;
|
||||
const SparseBitVectorElement<ElementSize> &Last = *(Elements.rbegin());
|
||||
return (Last.index() * ElementSize) + Last.find_last();
|
||||
}
|
||||
|
||||
// Return true if the SparseBitVector is empty
|
||||
bool empty() const {
|
||||
return Elements.empty();
|
||||
|
@ -127,4 +127,43 @@ TEST(SparseBitVectorTest, SelfAssignment) {
|
||||
EXPECT_TRUE(Vec.empty());
|
||||
}
|
||||
|
||||
TEST(SparseBitVectorTest, Find) {
|
||||
SparseBitVector<> Vec;
|
||||
Vec.set(1);
|
||||
EXPECT_EQ(1, Vec.find_first());
|
||||
EXPECT_EQ(1, Vec.find_last());
|
||||
|
||||
Vec.set(2);
|
||||
EXPECT_EQ(1, Vec.find_first());
|
||||
EXPECT_EQ(2, Vec.find_last());
|
||||
|
||||
Vec.set(0);
|
||||
Vec.set(3);
|
||||
EXPECT_EQ(0, Vec.find_first());
|
||||
EXPECT_EQ(3, Vec.find_last());
|
||||
|
||||
Vec.reset(1);
|
||||
Vec.reset(0);
|
||||
Vec.reset(3);
|
||||
EXPECT_EQ(2, Vec.find_first());
|
||||
EXPECT_EQ(2, Vec.find_last());
|
||||
|
||||
// Set some large bits to ensure we are pulling bits from more than just a
|
||||
// single bitword.
|
||||
Vec.set(500);
|
||||
Vec.set(2000);
|
||||
Vec.set(3000);
|
||||
Vec.set(4000);
|
||||
Vec.reset(2);
|
||||
EXPECT_EQ(500, Vec.find_first());
|
||||
EXPECT_EQ(4000, Vec.find_last());
|
||||
|
||||
Vec.reset(500);
|
||||
Vec.reset(3000);
|
||||
Vec.reset(4000);
|
||||
EXPECT_EQ(2000, Vec.find_first());
|
||||
EXPECT_EQ(2000, Vec.find_last());
|
||||
|
||||
Vec.clear();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user