// Checks whether a filter is empty and checks invariants. static void expect_empty(const filter_t &c) { EXPECT_TRUE(c.empty()); EXPECT_EQ(0, c.size()); EXPECT_EQ(0, distance(c.begin(), c.end())); EXPECT_FLOAT_EQ(0.0f, c.load_factor()); EXPECT_LE(c.load_factor(), c.max_load_factor()); }
TEST(FilterTest, Count) { const filter_t c = {10, 20, 30, 40, 50, 50, 50, 40, 40}; ASSERT_EQ(5, c.size()); EXPECT_EQ(0, c.count(0)); EXPECT_EQ(1, c.count(10)); EXPECT_EQ(1, c.count(20)); EXPECT_EQ(1, c.count(30)); EXPECT_EQ(1, c.count(40)); EXPECT_EQ(1, c.count(50)); EXPECT_EQ(0, c.count(60)); }
static auto make_insertion_decision_generator(const filter_t &filter) { using param_t = std::bernoulli_distribution::param_type; bernoulli_distribution dist; minstd_rand gen(3782348); return [&filter, gen = std::move(gen), dist ]() mutable { if (filter.empty()) return true; if (filter.full()) return false; const double load_factor = double(filter.size()) / filter.capacity(); return dist(gen, param_t(1.0 - load_factor)); }; }
// Checks whether lhs and rhs are clones. static bool totally_equal(const filter_t &lhs, const filter_t &rhs) noexcept { return lhs.size() == rhs.size() && lhs.capacity() == rhs.capacity() && lhs.quotient_bits() == rhs.quotient_bits() && lhs.remainder_bits() == rhs.remainder_bits() && equal(lhs, rhs); }