Add nbdkit bmaplogger plugin.
[virt-bmap.git] / ranges.cpp
index f8f173c..46b48ae 100644 (file)
@@ -25,6 +25,7 @@
 #include <assert.h>
 
 #include <boost/icl/interval.hpp>
+#include <boost/icl/interval_set.hpp>
 #include <boost/icl/interval_map.hpp>
 
 using namespace std;
@@ -77,3 +78,29 @@ iter_range (void *mapv, void (*f) (uint64_t start, uint64_t end, const char *obj
     iter++;
   }
 }
+
+extern "C" void
+find_range (void *mapv, uint64_t start, uint64_t end, void (*f) (uint64_t start, uint64_t end, const char *object, void *opaque), void *opaque)
+{
+  ranges *map = (ranges *) mapv;
+
+  boost::icl::interval<uint64_t>::type window;
+  window = boost::icl::interval<uint64_t>::right_open (start, end);
+
+  ranges r = *map & window;
+
+  ranges::iterator iter = r.begin ();
+  while (iter != r.end ()) {
+    boost::icl::interval<uint64_t>::type range = iter->first;
+    uint64_t start = range.lower ();
+    uint64_t end = range.upper ();
+
+    objects obj_set = iter->second;
+    objects::iterator iter2 = obj_set.begin ();
+    while (iter2 != obj_set.end ()) {
+      f (start, end, iter2->c_str (), opaque);
+      iter2++;
+    }
+    iter++;
+  }
+}