]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: avoid overhead of std::function in blob_t. 20294/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Sun, 4 Feb 2018 04:45:43 +0000 (05:45 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 8 Feb 2018 01:46:46 +0000 (02:46 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/os/bluestore/bluestore_types.h

index 604360c03c4ab665acaf212e9c6b2f67509a1881..ece69413b1955781d4c74054ebd3e819410ebd97 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <ostream>
 #include <bitset>
+#include <type_traits>
 #include "include/types.h"
 #include "include/interval_set.h"
 #include "include/utime.h"
@@ -730,8 +731,10 @@ public:
     }
   }
 
-  int map(uint64_t x_off, uint64_t x_len,
-          std::function<int(uint64_t,uint64_t)> f) const {
+  template<class F>
+  int map(uint64_t x_off, uint64_t x_len, F&& f) const {
+    static_assert(std::is_invocable_r_v<int, F, uint64_t, uint64_t>);
+
     auto p = extents.begin();
     assert(p != extents.end());
     while (x_off >= p->length) {
@@ -751,9 +754,12 @@ public:
     }
     return 0;
   }
+  template<class F>
   void map_bl(uint64_t x_off,
              bufferlist& bl,
-             std::function<void(uint64_t,bufferlist&)> f) const {
+             F&& f) const {
+    static_assert(std::is_invocable_v<F, uint64_t, bufferlist&>);
+
     auto p = extents.begin();
     assert(p != extents.end());
     while (x_off >= p->length) {