X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fintrusive%2Fmichael_set_nogc.h;h=dfe01d1e052f7776dbb5f5c88269d4f85df67700;hb=6924946ceeaae28bc227fe7c9d8e939963bb9d69;hp=44b946b6983d5e2b173abeca99e36fdf91132230;hpb=305da3404a293d5e5c4e76eb6660eeda5a7d4413;p=libcds.git diff --git a/cds/intrusive/michael_set_nogc.h b/cds/intrusive/michael_set_nogc.h index 44b946b6..dfe01d1e 100644 --- a/cds/intrusive/michael_set_nogc.h +++ b/cds/intrusive/michael_set_nogc.h @@ -1,7 +1,7 @@ /* This file is a part of libcds - Concurrent Data Structures library - (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016 + (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/ @@ -77,10 +77,6 @@ namespace cds { namespace intrusive { // GC and OrderedList::gc must be the same static_assert(std::is_same::value, "GC and OrderedList::gc must be the same"); - // atomicity::empty_item_counter is not allowed as a item counter - static_assert(!std::is_same::value, - "atomicity::empty_item_counter is not allowed as a item counter"); - protected: //@cond typedef typename ordered_list::template select_stat_wrapper< typename ordered_list::stat > bucket_stat; @@ -175,7 +171,7 @@ namespace cds { namespace intrusive { */ iterator begin() { - return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count() ); + return iterator( m_Buckets[0].begin(), m_Buckets, m_Buckets + bucket_count()); } /// Returns an iterator that addresses the location succeeding the last element in a set @@ -186,7 +182,7 @@ namespace cds { namespace intrusive { */ iterator end() { - return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() ); + return iterator( m_Buckets[bucket_count() - 1].end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count()); } /// Returns a forward const iterator addressing the first element in a set @@ -197,7 +193,7 @@ namespace cds { namespace intrusive { /// Returns a forward const iterator addressing the first element in a set const_iterator cbegin() const { - return const_iterator( m_Buckets[0].cbegin(), m_Buckets, m_Buckets + bucket_count() ); + return const_iterator( m_Buckets[0].cbegin(), m_Buckets, m_Buckets + bucket_count()); } /// Returns an const iterator that addresses the location succeeding the last element in a set @@ -208,7 +204,7 @@ namespace cds { namespace intrusive { /// Returns an const iterator that addresses the location succeeding the last element in a set const_iterator cend() const { - return const_iterator( m_Buckets[bucket_count() - 1].cend(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() ); + return const_iterator( m_Buckets[bucket_count() - 1].cend(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count()); } //@} @@ -225,7 +221,7 @@ namespace cds { namespace intrusive { size_t nMaxItemCount, ///< estimation of max item count in the hash set size_t nLoadFactor ///< load factor: estimation of max number of items in the bucket ) : m_nHashBitmask( michael_set::details::init_hash_bitmask( nMaxItemCount, nLoadFactor )) - , m_Buckets( bucket_table_allocator().allocate( bucket_count() ) ) + , m_Buckets( bucket_table_allocator().allocate( bucket_count())) { for ( auto it = m_Buckets, itEnd = m_Buckets + bucket_count(); it != itEnd; ++it ) construct_bucket( it ); @@ -238,7 +234,7 @@ namespace cds { namespace intrusive { for ( auto it = m_Buckets, itEnd = m_Buckets + bucket_count(); it != itEnd; ++it ) it->~internal_bucket_type(); - bucket_table_allocator().deallocate( m_Buckets, bucket_count() ); + bucket_table_allocator().deallocate( m_Buckets, bucket_count()); } /// Inserts new node @@ -421,8 +417,8 @@ namespace cds { namespace intrusive { /// Checks if the set is empty /** - Emptiness is checked by item counting: if item count is zero then the set is empty. - Thus, the correct item counting feature is an important part of Michael's set implementation. + @warning If you use \p atomicity::empty_item_counter in \p traits::item_counter, + the function always returns \p true. */ bool empty() const { @@ -430,6 +426,10 @@ namespace cds { namespace intrusive { } /// Returns item count in the set + /** + If you use \p atomicity::empty_item_counter in \p traits::item_counter, + the function always returns 0. + */ size_t size() const { return m_ItemCounter; @@ -455,15 +455,15 @@ namespace cds { namespace intrusive { private: //@cond template - typename std::enable_if< Stat::empty >::type construct_bucket( internal_bucket_type * bucket ) + typename std::enable_if< Stat::empty >::type construct_bucket( internal_bucket_type * b ) { - new (bucket) internal_bucket_type; + new (b) internal_bucket_type; } template - typename std::enable_if< !Stat::empty >::type construct_bucket( internal_bucket_type * bucket ) + typename std::enable_if< !Stat::empty >::type construct_bucket( internal_bucket_type * b ) { - new (bucket) internal_bucket_type( m_Stat ); + new (b) internal_bucket_type( m_Stat ); } //@endcond };