mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Simplify the implementation of ClusteredBitVector by using an APInt to represent the raw bits. This simplification will make it easier to incrementally move to a representation of bit vectors that works on both big- and little-endian machines. This commit also removes reserve and reserveExtra from the API since they were only used in one place and no longer have any effect because memory allocation is now handled by the APInt class.
173 lines
3.7 KiB
C++
173 lines
3.7 KiB
C++
#include "swift/Basic/ClusteredBitVector.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace swift;
|
|
|
|
TEST(ClusteredBitVector, Add) {
|
|
ClusteredBitVector vec;
|
|
vec.add(31, 2133572605);
|
|
|
|
EXPECT_EQ(31u, vec.size());
|
|
EXPECT_EQ(true, vec[0]);
|
|
EXPECT_EQ(false, vec[1]);
|
|
EXPECT_EQ(true, vec[30]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, AppendEmptyAfterAdd) {
|
|
ClusteredBitVector vec;
|
|
vec.add(31, 2133572605);
|
|
|
|
ClusteredBitVector emptyVec;
|
|
vec.append(emptyVec);
|
|
|
|
EXPECT_EQ(31u, vec.size());
|
|
EXPECT_EQ(true, vec[0]);
|
|
EXPECT_EQ(false, vec[1]);
|
|
EXPECT_EQ(true, vec[30]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, AppendSetBits) {
|
|
ClusteredBitVector vec;
|
|
vec.add(23, 7988315);
|
|
vec.appendSetBits(77);
|
|
EXPECT_EQ(100u, vec.size());
|
|
EXPECT_EQ(true, vec[0]);
|
|
EXPECT_EQ(true, vec[30]);
|
|
EXPECT_EQ(true, vec[70]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, AddAdd) {
|
|
ClusteredBitVector vec;
|
|
vec.add(8, 206);
|
|
vec.add(17, 56854);
|
|
EXPECT_EQ(25u, vec.size());
|
|
EXPECT_EQ(true, vec[9]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, Copies) {
|
|
ClusteredBitVector orig;
|
|
orig.appendClearBits(71);
|
|
|
|
ClusteredBitVector copy = orig;
|
|
ClusteredBitVector vec;
|
|
vec = copy;
|
|
|
|
EXPECT_EQ(71u, vec.size());
|
|
EXPECT_EQ(71u, copy.size());
|
|
EXPECT_EQ(71u, orig.size());
|
|
EXPECT_EQ(false, vec[64]);
|
|
EXPECT_EQ(false, copy[64]);
|
|
EXPECT_EQ(false, orig[64]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, CopyClearIntoAllocated) {
|
|
ClusteredBitVector temp;
|
|
temp.appendSetBits(94);
|
|
|
|
ClusteredBitVector orig;
|
|
orig.appendClearBits(71);
|
|
|
|
ClusteredBitVector copy = orig;
|
|
ClusteredBitVector vec;
|
|
vec = temp;
|
|
vec = copy;
|
|
|
|
EXPECT_EQ(71u, vec.size());
|
|
EXPECT_EQ(71u, copy.size());
|
|
EXPECT_EQ(71u, orig.size());
|
|
EXPECT_EQ(false, vec[64]);
|
|
EXPECT_EQ(false, copy[64]);
|
|
EXPECT_EQ(false, orig[64]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, AddMoveAdd) {
|
|
ClusteredBitVector orig;
|
|
orig.add(16, 41010);
|
|
|
|
ClusteredBitVector vec;
|
|
ClusteredBitVector temp = std::move(orig);
|
|
vec = std::move(temp);
|
|
EXPECT_EQ(0u, temp.size());
|
|
|
|
vec.add(28, 146898948);
|
|
EXPECT_EQ(true, vec[32]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, MultiChunkAppend) {
|
|
ClusteredBitVector temp;
|
|
temp.appendSetBits(72);
|
|
temp.appendClearBits(22);
|
|
temp.appendSetBits(83);
|
|
|
|
ClusteredBitVector vec;
|
|
vec.add(16, 0x000000000000967b);
|
|
vec.append(temp);
|
|
EXPECT_EQ(true, vec[64]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, AssignAfterGrowth) {
|
|
ClusteredBitVector temp;
|
|
temp.appendClearBits(118);
|
|
|
|
ClusteredBitVector vec;
|
|
vec.appendSetBits(65);
|
|
vec = std::move(temp);
|
|
EXPECT_EQ(false, vec[64]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, SetClearBit) {
|
|
ClusteredBitVector vec;
|
|
vec.appendClearBits(64);
|
|
vec.setBit(3);
|
|
vec.setBit(7);
|
|
vec.setBit(7);
|
|
vec.setBit(63);
|
|
EXPECT_EQ(3u, vec.count());
|
|
EXPECT_EQ(true, vec[3]);
|
|
EXPECT_EQ(true, vec[7]);
|
|
EXPECT_EQ(true, vec[63]);
|
|
EXPECT_EQ(false, vec[0]);
|
|
EXPECT_EQ(false, vec[14]);
|
|
EXPECT_EQ(false, vec[62]);
|
|
|
|
vec.clearBit(63);
|
|
EXPECT_EQ(2u, vec.count());
|
|
EXPECT_EQ(false, vec[63]);
|
|
}
|
|
|
|
TEST(ClusteredBitVector, FlipAllSmall) {
|
|
ClusteredBitVector vec;
|
|
vec.appendClearBits(48);
|
|
EXPECT_EQ(false, vec[12]);
|
|
EXPECT_EQ(0u, vec.count());
|
|
vec.flipAll();
|
|
EXPECT_EQ(true, vec[12]);
|
|
EXPECT_EQ(48u, vec.count());
|
|
vec.clearBit(7);
|
|
EXPECT_EQ(true, vec[12]);
|
|
EXPECT_EQ(false, vec[7]);
|
|
EXPECT_EQ(47u, vec.count());
|
|
vec.flipAll();
|
|
EXPECT_EQ(false, vec[12]);
|
|
EXPECT_EQ(true, vec[7]);
|
|
EXPECT_EQ(1u, vec.count());
|
|
}
|
|
|
|
TEST(ClusteredBitVector, FlipAllBig) {
|
|
ClusteredBitVector vec;
|
|
vec.appendClearBits(163);
|
|
EXPECT_EQ(false, vec[12]);
|
|
EXPECT_EQ(0u, vec.count());
|
|
vec.flipAll();
|
|
EXPECT_EQ(true, vec[12]);
|
|
EXPECT_EQ(163u, vec.count());
|
|
vec.clearBit(7);
|
|
EXPECT_EQ(true, vec[12]);
|
|
EXPECT_EQ(false, vec[7]);
|
|
EXPECT_EQ(162u, vec.count());
|
|
vec.flipAll();
|
|
EXPECT_EQ(false, vec[12]);
|
|
EXPECT_EQ(true, vec[7]);
|
|
EXPECT_EQ(1u, vec.count());
|
|
}
|