From b392210894c63e18de5a3ceff020011f381c8143 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Fri, 5 Jan 2024 12:23:24 +0100 Subject: [PATCH] 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) --- src/common/bit_vector.hpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/common/bit_vector.hpp b/src/common/bit_vector.hpp index 09ac98b32c3bb..961d9a0192ee2 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; -- 2.39.5