From: Ilya Dryomov Date: Fri, 5 Jan 2024 11:23:24 +0000 (+0100) Subject: common/bit_vector: fix iterator vs reference constness confusion X-Git-Tag: v17.2.8~538^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b392210894c63e18de5a3ceff020011f381c8143;p=ceph.git common/bit_vector: fix iterator vs reference constness confusion T (ConstIterator or Iterator) is confused with const T here: IteratorImpl dereference operator is wrongly overloaded on const and returns Reference instead of ConstReference for ConstIterator. This then fails inside bufferlist bowels because Reference is incompatible with bufferlist::const_iterator. Signed-off-by: Ilya Dryomov (cherry picked from commit 45d534553abaca81e26574fd5a7b17b9219c0dd0) --- diff --git a/src/common/bit_vector.hpp b/src/common/bit_vector.hpp index 09ac98b32c3b..961d9a0192ee 100644 --- a/src/common/bit_vector.hpp +++ b/src/common/bit_vector.hpp @@ -83,7 +83,7 @@ public: }; public: - template + template class IteratorImpl { private: friend class BitVector; @@ -94,7 +94,7 @@ public: // cached derived values uint64_t m_index = 0; uint64_t m_shift = 0; - DataIterator m_data_iterator; + DataIteratorT m_data_iterator; IteratorImpl(BitVectorT *bit_vector, uint64_t offset) : m_bit_vector(bit_vector), @@ -145,17 +145,15 @@ public: return (m_offset != rhs.m_offset || m_bit_vector != rhs.m_bit_vector); } - inline ConstReference operator*() const { - return ConstReference(m_data_iterator, m_shift); - } - inline Reference operator*() { - return Reference(m_data_iterator, m_shift); + inline ReferenceT operator*() const { + return ReferenceT(m_data_iterator, m_shift); } }; typedef IteratorImpl ConstIterator; - typedef IteratorImpl Iterator; + bufferlist::const_iterator, + ConstReference> ConstIterator; + typedef IteratorImpl Iterator; static const uint32_t BLOCK_SIZE; static const uint8_t BIT_COUNT = _bit_count;