From f7e122e4b8f671e0555855c0a53d9f748a35dcfb Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 28 Feb 2022 23:12:22 +0800 Subject: [PATCH] crimson/common: add alternative overload for FixedKVNodeLayout<>::iter_t 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 --- src/crimson/common/fixed_kv_node_layout.h | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/crimson/common/fixed_kv_node_layout.h b/src/crimson/common/fixed_kv_node_layout.h index d2b0f88495ed9..676563594e0ce 100644 --- a/src/crimson/common/fixed_kv_node_layout.h +++ b/src/crimson/common/fixed_kv_node_layout.h @@ -71,14 +71,13 @@ public: iter_t(const iter_t &) noexcept = default; iter_t(iter_t &&) noexcept = default; + template + iter_t(const iter_t& it, std::enable_if_t = 0) + : iter_t{it.node, it.offset} + {} iter_t &operator=(const iter_t &) = default; iter_t &operator=(iter_t &&) = default; - operator iter_t() const { - static_assert(!is_const); - return iter_t(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 &lhs, const iter_t &rhs) { + assert(lhs.node == rhs.node); + return lhs.offset == rhs.offset; + } + friend bool operator!=(const iter_t &lhs, const iter_t &rhs) { + return !(lhs == rhs); + } K get_key() const { return K(node->get_key_ptr()[offset]); } -- 2.39.5