// 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);
}