From: khizmax Date: Mon, 10 Nov 2014 18:35:18 +0000 (+0300) Subject: fix skip-list iterators X-Git-Tag: v2.0.0~117 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=commitdiff_plain;h=fe7c81546af70c2b5ddabb9cd8503a8d1d4f4ded fix skip-list iterators --- diff --git a/cds/container/details/skip_list_base.h b/cds/container/details/skip_list_base.h index e7fd7099..a5258968 100644 --- a/cds/container/details/skip_list_base.h +++ b/cds/container/details/skip_list_base.h @@ -219,7 +219,8 @@ namespace cds { namespace container { typedef typename node_type::stored_value_type value_type; static bool const c_isConst = intrusive_iterator::c_isConst; - typedef typename std::conditional< c_isConst, value_type const &, value_type &>::type value_ref; + typedef typename std::conditional< c_isConst, value_type const&, value_type&>::type value_ref; + template friend class iterator; intrusive_iterator m_It; @@ -228,11 +229,6 @@ namespace cds { namespace container { : m_It( it ) {} - intrusive_iterator const& underlying_iterator() const - { - return m_It; - } - public: iterator() : m_It() @@ -268,7 +264,7 @@ namespace cds { namespace container { template bool operator ==(iterator const& i ) const { - return m_It == i.underlying_iterator(); + return m_It == i.m_It; } template bool operator !=(iterator const& i ) const diff --git a/cds/intrusive/skip_list_nogc.h b/cds/intrusive/skip_list_nogc.h index 43e7cee8..db592592 100644 --- a/cds/intrusive/skip_list_nogc.h +++ b/cds/intrusive/skip_list_nogc.h @@ -126,13 +126,14 @@ namespace cds { namespace intrusive { typedef BackOff back_off; typedef typename node_traits::node_type node_type; typedef typename node_traits::value_type value_type; - static bool const c_isConst = IsConst; + static CDS_CONSTEXPR bool const c_isConst = IsConst; typedef typename std::conditional< c_isConst, value_type const &, value_type &>::type value_ref; + friend class iterator< gc, node_traits, back_off, !c_isConst >; protected: - typedef typename node_type::atomic_ptr atomic_ptr; - node_type * m_pNode; + typedef typename node_type::atomic_ptr atomic_ptr; + node_type * m_pNode; public: // for internal use only!!! iterator( node_type& refHead ) @@ -146,11 +147,6 @@ namespace cds { namespace intrusive { return it; } - node_type * node() const - { - return m_pNode; - } - public: iterator() : m_pNode( nullptr ) @@ -193,7 +189,7 @@ namespace cds { namespace intrusive { template bool operator ==(iterator const& i ) const { - return m_pNode == i.node(); + return m_pNode == i.m_pNode; } template bool operator !=(iterator const& i ) const