mirror of https://github.com/mongodb/mongo
SERVER-115243 Make allInPrefix test exhaustive (#45288)
GitOrigin-RevId: 69f5f7bbe4841057028f97dc56e01a692c0012b9
This commit is contained in:
parent
63469c57b6
commit
4fb7e9a71c
|
|
@ -35,6 +35,8 @@
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <boost/dynamic_bitset.hpp>
|
||||||
|
|
||||||
namespace mongo {
|
namespace mongo {
|
||||||
namespace {
|
namespace {
|
||||||
using Bitset = DynamicBitset<uint8_t, 1>;
|
using Bitset = DynamicBitset<uint8_t, 1>;
|
||||||
|
|
@ -330,39 +332,30 @@ TEST(DynamicBitsetTests, All) {
|
||||||
ASSERT_TRUE(Bitset("1111111111111111").all());
|
ASSERT_TRUE(Bitset("1111111111111111").all());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename BlockType, size_t nBlocks>
|
||||||
|
DynamicBitset<BlockType, nBlocks> makeBitset(size_t n) {
|
||||||
|
DynamicBitset<BlockType, nBlocks> bitset(sizeof(size_t) * CHAR_BIT);
|
||||||
|
// Iterates through each set bit in the number 'n': gets the index of the next set bit and
|
||||||
|
// clears the bit until 'n' becomes 0.
|
||||||
|
for (; n != 0; n &= n - 1)
|
||||||
|
bitset.set(std::countr_zero(n));
|
||||||
|
return bitset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void testAllInPrefix(size_t n, size_t maxBits) {
|
||||||
|
auto mongoBitset = makeBitset<uint8_t, 8>(n);
|
||||||
|
boost::dynamic_bitset<size_t> boostBitset(maxBits, n);
|
||||||
|
for (; !boostBitset.empty(); boostBitset.pop_back())
|
||||||
|
ASSERT_EQ(mongoBitset.allInPrefix(boostBitset.size()), boostBitset.all());
|
||||||
|
ASSERT_TRUE(mongoBitset.allInPrefix(0));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(DynamicBitsetTests, allInPrefix) {
|
TEST(DynamicBitsetTests, allInPrefix) {
|
||||||
ASSERT_TRUE(Bitset("1").allInPrefix(1));
|
static constexpr size_t maxBits = 20;
|
||||||
{
|
static constexpr size_t maxValue = 1ull << maxBits;
|
||||||
// 0 blocks case.
|
|
||||||
Bitset bitset;
|
for (size_t n = 0; n != maxValue; ++n)
|
||||||
ASSERT_TRUE(bitset.allInPrefix(0));
|
testAllInPrefix(n, maxBits);
|
||||||
ASSERT_FALSE(bitset.allInPrefix(1));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
// 1 Block case
|
|
||||||
Bitset bitset("11111111");
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(0));
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(1));
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(4));
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(8));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
// 2 blocks case
|
|
||||||
Bitset bitset("1111111111111111");
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(8));
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(9));
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(12));
|
|
||||||
ASSERT_TRUE(bitset.allInPrefix(16));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
// 2+ blocks case
|
|
||||||
Bitset bitset(
|
|
||||||
"11101111"
|
|
||||||
"11111111"
|
|
||||||
"11111111");
|
|
||||||
for (size_t i = 0; i <= 40; ++i)
|
|
||||||
ASSERT_EQ(bitset.allInPrefix(i), i <= 20) << i;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(DynamicBitsetTests, Less) {
|
TEST(DynamicBitsetTests, Less) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue