]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/common: add alternative overload for FixedKVNodeLayout<>::iter_t
authorKefu Chai <tchaikov@gmail.com>
Mon, 28 Feb 2022 15:12:22 +0000 (23:12 +0800)
committerKefu Chai <tchaikov@gmail.com>
Sat, 30 Jul 2022 05:02:15 +0000 (13:02 +0800)
otherwise we'd have following FTBFS with C++20 and clang13:

In file included from /var/ssd/ceph/src/crimson/os/seastore/lba_manager.cc:7:
In file included from /var/ssd/ceph/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h:24:
/var/ssd/ceph/src/crimson/os/seastore/lba_manager/btree/lba_btree.h:474:26: error: use of overloaded operator '==' is ambiguous (with operand types 'crimson::common::FixedKVNodeLayout<254, crimson::os::seastore::l$
    auto end = next_iter == parent->end()
               ~~~~~~~~~ ^  ~~~~~~~~~~~~~
/var/ssd/ceph/src/crimson/common/fixed_kv_node_layout.h:127:10: note: candidate function
    bool operator==(const iter_t &rhs) const {
         ^
/var/ssd/ceph/src/crimson/common/fixed_kv_node_layout.h:127:10: note: candidate function (with reversed parameter order)

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
src/crimson/common/fixed_kv_node_layout.h

index d2b0f88495ed9a475823e4e98cf717030fadfa36..676563594e0cebc08315b201adb5beb0a3fe9db8 100644 (file)
@@ -71,14 +71,13 @@ public:
 
     iter_t(const iter_t &) noexcept = default;
     iter_t(iter_t &&) noexcept = default;
+    template<bool is_const_ = is_const>
+    iter_t(const iter_t<false>& it, std::enable_if_t<is_const_, int> = 0)
+      : iter_t{it.node, it.offset}
+    {}
     iter_t &operator=(const iter_t &) = default;
     iter_t &operator=(iter_t &&) = default;
 
-    operator iter_t<!is_const>() const {
-      static_assert(!is_const);
-      return iter_t<!is_const>(node, offset);
-    }
-
     // Work nicely with for loops without requiring a nested type.
     using reference = iter_t&;
     iter_t &operator*() { return *this; }
@@ -124,15 +123,22 @@ public:
        offset - off);
     }
 
-    bool operator==(const iter_t &rhs) const {
-      assert(node == rhs.node);
-      return rhs.offset == offset;
+    friend bool operator==(const iter_t &lhs, const iter_t &rhs) {
+      assert(lhs.node == rhs.node);
+      return lhs.offset == rhs.offset;
     }
 
-    bool operator!=(const iter_t &rhs) const {
-      return !(*this == rhs);
+    friend bool operator!=(const iter_t &lhs, const iter_t &rhs) {
+      return !(lhs == rhs);
     }
 
+    friend bool operator==(const iter_t<is_const> &lhs, const iter_t<!is_const> &rhs) {
+      assert(lhs.node == rhs.node);
+      return lhs.offset == rhs.offset;
+    }
+    friend bool operator!=(const iter_t<is_const> &lhs, const iter_t<!is_const> &rhs) {
+      return !(lhs == rhs);
+    }
     K get_key() const {
       return K(node->get_key_ptr()[offset]);
     }