X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fintrusive%2Fdetails%2Fmichael_set_base.h;h=8e63cf3849b49d5f38382cb7badd601b047d734c;hb=425ac2caed841d88f086813b63f7bf89a0faca68;hp=b12c813836a49042061635251121c5adc53c0547;hpb=4b5852dc7e861bb26c6af06c2a1e058f87f703ae;p=libcds.git diff --git a/cds/intrusive/details/michael_set_base.h b/cds/intrusive/details/michael_set_base.h index b12c8138..8e63cf38 100644 --- a/cds/intrusive/details/michael_set_base.h +++ b/cds/intrusive/details/michael_set_base.h @@ -1,4 +1,32 @@ -//$$CDS-header$$ +/* + This file is a part of libcds - Concurrent Data Structures library + + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 + + Source code repo: http://github.com/khizmax/libcds/ + Download: http://sourceforge.net/projects/libcds/files/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ #ifndef CDSLIB_INTRUSIVE_DETAILS_MICHAEL_SET_BASE_H #define CDSLIB_INTRUSIVE_DETAILS_MICHAEL_SET_BASE_H @@ -30,9 +58,10 @@ namespace cds { namespace intrusive { /** The item counting is an important part of \p MichaelHashSet algorithm: the \p empty() member function depends on correct item counting. - Therefore, \p atomicity::empty_item_counter is not allowed as a type of the option. + You may use \p atomicity::empty_item_counter if don't need \p empty() and \p size() + member functions. - Default is \p atomicity::item_counter. + Default is \p atomicity::item_counter; to avoid false sharing you may use \p atomicity::cache_friendly_item_counter */ typedef cds::atomicity::item_counter item_counter; @@ -66,10 +95,10 @@ namespace cds { namespace intrusive { nLoadFactor = 1; if ( nMaxItemCount == 0 ) nMaxItemCount = 4; - const size_t nBucketCount = (size_t)( nMaxItemCount / nLoadFactor ); - const size_t nLog2 = cds::bitop::MSB( nBucketCount ); + const size_t nBucketCount = nMaxItemCount / nLoadFactor; + const size_t exp2 = size_t( 1 ) << cds::bitop::MSB( nBucketCount ); - return (( size_t( 1 << nLog2 ) < nBucketCount ? size_t( 1 << (nLog2 + 1) ) : size_t( 1 << nLog2 ))) - 1; + return ( exp2 < nBucketCount ? exp2 * 2 : exp2 ) - 1; } template @@ -92,7 +121,8 @@ namespace cds { namespace intrusive { template class iterator { - friend class iterator < OrderedList, !IsConst >; + friend class iterator< OrderedList, !IsConst >; + protected: typedef OrderedList bucket_type; typedef typename list_iterator_selector< bucket_type, IsConst>::bucket_ptr bucket_ptr; @@ -105,11 +135,11 @@ namespace cds { namespace intrusive { void next() { if ( m_pCurBucket < m_pEndBucket ) { - if ( ++m_itList != m_pCurBucket->end() ) + if ( ++m_itList != m_pCurBucket->end()) return; while ( ++m_pCurBucket < m_pEndBucket ) { m_itList = m_pCurBucket->begin(); - if ( m_itList != m_pCurBucket->end() ) + if ( m_itList != m_pCurBucket->end()) return; } } @@ -133,7 +163,7 @@ namespace cds { namespace intrusive { , m_itList( it ) , m_pEndBucket( pLast ) { - if ( it == pFirst->end() ) + if ( it == pFirst->end()) next(); } @@ -175,6 +205,11 @@ namespace cds { namespace intrusive { return m_pCurBucket != m_pEndBucket ? m_pCurBucket : nullptr; } + list_iterator const& underlying_iterator() const + { + return m_itList; + } + template bool operator ==(iterator const& i) const { @@ -185,7 +220,6 @@ namespace cds { namespace intrusive { { return !( *this == i ); } - }; } //@endcond