Removed cds::OS::is_thread_alive() function. This function is based of pthread_kill...
[libcds.git] / cds / container / michael_set_nogc.h
index aaa7ee5b0351d7349bf30f6e9b9268d1ad7888f5..6f1d293d86f8975e205f73ff2a314fe2f0a56f06 100644 (file)
@@ -1,11 +1,11 @@
 /*
     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/
-    
+
     Redistribution and use in source and binary forms, with or without
     modification, are permitted provided that the following conditions are met:
 
@@ -25,7 +25,7 @@
     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.     
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 #ifndef CDSLIB_CONTAINER_MICHAEL_SET_NOGC_H
@@ -64,7 +64,9 @@ namespace cds { namespace container {
 
         typedef typename ordered_list::value_type     value_type;     ///< type of value stored in the list
         typedef typename ordered_list::key_comparator key_comparator; ///< key comparison functor
+#ifdef CDS_DOXYGEN_INVOKED
         typedef typename ordered_list::stat           stat;           ///< Internal statistics
+#endif
 
         /// Hash functor for \ref value_type and all its derivatives that you use
         typedef typename cds::opt::v::hash_selector< typename traits::hash >::type hash;
@@ -92,7 +94,7 @@ namespace cds { namespace container {
             typedef internal_bucket_type_ base_class;
         public:
             using base_class::base_class;
-            using base_class::node_type;
+            using typename base_class::node_type;
             using base_class::alloc_node;
             using base_class::insert_node;
             using base_class::node_to_value;
@@ -105,13 +107,18 @@ namespace cds { namespace container {
         typedef typename internal_bucket_type::const_iterator  bucket_const_iterator;
         //@endcond
 
+    public:
+        //@cond
+        typedef typename bucket_stat::stat stat;
+        //@endcond
+
     protected:
         //@cond
         const size_t    m_nHashBitmask;
         item_counter    m_ItemCounter;      ///< Item counter
         hash            m_HashFunctor;      ///< Hash functor
         internal_bucket_type*   m_Buckets;  ///< bucket table
-        typename bucket_stat::stat  m_Stat; ///< Internal statistics
+        stat            m_Stat; ///< Internal statistics
         //@endcond
 
     public:
@@ -165,7 +172,7 @@ namespace cds { namespace container {
         */
         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
@@ -176,7 +183,7 @@ namespace cds { namespace container {
         */
         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
@@ -218,7 +225,7 @@ namespace cds { namespace container {
             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<bucket_stat>( it );
@@ -230,7 +237,7 @@ namespace cds { namespace container {
             clear();
             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
@@ -246,9 +253,9 @@ namespace cds { namespace container {
             internal_bucket_type& refBucket = bucket( val );
             bucket_iterator it = refBucket.insert( val );
 
-            if ( it != refBucket.end() ) {
+            if ( it != refBucket.end()) {
                 ++m_ItemCounter;
-                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+                return iterator( it, &refBucket, m_Buckets + bucket_count());
             }
 
             return end();
@@ -264,9 +271,9 @@ namespace cds { namespace container {
             typename internal_bucket_type::node_type * pNode = internal_bucket_type::alloc_node( std::forward<Args>( args )... );
             internal_bucket_type& refBucket = bucket( internal_bucket_type::node_to_value( *pNode ));
             bucket_iterator it = refBucket.insert_node( pNode );
-            if ( it != refBucket.end() ) {
+            if ( it != refBucket.end()) {
                 ++m_ItemCounter;
-                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+                return iterator( it, &refBucket, m_Buckets + bucket_count());
             }
 
             return end();
@@ -293,10 +300,10 @@ namespace cds { namespace container {
             internal_bucket_type& refBucket = bucket( val );
             std::pair<bucket_iterator, bool> ret = refBucket.update( val, bAllowInsert );
 
-            if ( ret.first != refBucket.end() ) {
+            if ( ret.first != refBucket.end()) {
                 if ( ret.second )
                     ++m_ItemCounter;
-                return std::make_pair( iterator( ret.first, &refBucket, m_Buckets + bucket_count() ), ret.second );
+                return std::make_pair( iterator( ret.first, &refBucket, m_Buckets + bucket_count()), ret.second );
             }
             return std::make_pair( end(), ret.second );
         }
@@ -323,8 +330,8 @@ namespace cds { namespace container {
         {
             internal_bucket_type& refBucket = bucket( key );
             bucket_iterator it = refBucket.contains( key );
-            if ( it != refBucket.end() )
-                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            if ( it != refBucket.end())
+                return iterator( it, &refBucket, m_Buckets + bucket_count());
 
             return end();
         }
@@ -348,8 +355,8 @@ namespace cds { namespace container {
         {
             internal_bucket_type& refBucket = bucket( key );
             bucket_iterator it = refBucket.contains( key, pred );
-            if ( it != refBucket.end() )
-                return iterator( it, &refBucket, m_Buckets + bucket_count() );
+            if ( it != refBucket.end())
+                return iterator( it, &refBucket, m_Buckets + bucket_count());
 
             return end();
         }
@@ -436,11 +443,11 @@ namespace cds { namespace container {
 
         const_iterator get_const_begin() const
         {
-            return const_iterator( const_cast<internal_bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count() );
+            return const_iterator( const_cast<internal_bucket_type const&>(m_Buckets[0]).begin(), m_Buckets, m_Buckets + bucket_count());
         }
         const_iterator get_const_end() const
         {
-            return const_iterator( const_cast<internal_bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count() );
+            return const_iterator( const_cast<internal_bucket_type const&>(m_Buckets[bucket_count() - 1]).end(), m_Buckets + bucket_count() - 1, m_Buckets + bucket_count());
         }
         //@endcond
     };