]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/common/bloom_filter.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / common / bloom_filter.cc
index 9033f04544464b00720506b4f331ab5da51fc663..9fb28efed68e5d321bf74da695594f781a37a530 100644 (file)
@@ -3,12 +3,25 @@
 
 #include "common/bloom_filter.hpp"
 
-MEMPOOL_DEFINE_FACTORY(unsigned char, byte, bloom_filter);
+#include <numeric>
+#include "include/intarith.h"
 
 using ceph::bufferlist;
 using ceph::bufferptr;
 using ceph::Formatter;
 
+double bloom_filter::density() const
+{
+  // TODO: use transform_reduce() in GCC-9 and up
+  unsigned set = std::accumulate(
+    bit_table_.begin(),
+    bit_table_.begin() + table_size_,
+    0u, [](unsigned set, cell_type cell) {
+      return set + popcount(cell);
+    });
+  return (double)set / (table_size_ * sizeof(cell_type) * CHAR_BIT);
+}
+
 void bloom_filter::encode(bufferlist& bl) const
 {
   ENCODE_START(2, 2, bl);
@@ -16,8 +29,7 @@ void bloom_filter::encode(bufferlist& bl) const
   encode((uint64_t)insert_count_, bl);
   encode((uint64_t)target_element_count_, bl);
   encode((uint64_t)random_seed_, bl);
-  bufferptr bp((const char*)bit_table_, table_size_);
-  encode(bp, bl);
+  encode(bit_table_, bl);
   ENCODE_FINISH(bl);
 }
 
@@ -33,20 +45,10 @@ void bloom_filter::decode(bufferlist::const_iterator& p)
   target_element_count_ = v;
   decode(v, p);
   random_seed_ = v;
-  bufferlist t;
-  decode(t, p);
-
   salt_.clear();
   generate_unique_salt();
-  table_size_ = t.length();
-  delete[] bit_table_;
-  if (table_size_) {
-    bit_table_ = new cell_type[table_size_];
-    t.begin().copy(table_size_, (char *)bit_table_);
-  } else {
-    bit_table_ = NULL;
-  }
-
+  decode(bit_table_, p);
+  table_size_ = bit_table_.size();
   DECODE_FINISH(p);
 }
 
@@ -64,8 +66,9 @@ void bloom_filter::dump(Formatter *f) const
   f->close_section();
 
   f->open_array_section("bit_table");
-  for (unsigned i = 0; i < table_size_; ++i)
-    f->dump_unsigned("byte", (unsigned)bit_table_[i]);
+  for (auto byte : bit_table_) {
+    f->dump_unsigned("byte", (unsigned)byte);
+  }
   f->close_section();
 }