Docfix, formatting, minor bugs
[libcds.git] / cds / container / michael_set_nogc.h
index c4ae09b84f5011eeab5b4b161607dd22657d4518..b3e7db4be2203531c6ce1da68e597f187ec5f5ca 100644 (file)
@@ -70,19 +70,31 @@ namespace cds { namespace container {
         typedef typename cds::opt::v::hash_selector< typename traits::hash >::type hash;
         typedef typename traits::item_counter  item_counter; ///< Item counter type
 
-        /// Bucket table allocator
-        typedef cds::details::Allocator< bucket_type, typename traits::allocator >  bucket_table_allocator;
-
     protected:
         //@cond
+        class internal_bucket_type: public bucket_type
+        {
+            typedef bucket_type base_class;
+        public:
+            using base_class::node_type;
+            using base_class::alloc_node;
+            using base_class::insert_node;
+            using base_class::node_to_value;
+        };
+
+        /// Bucket table allocator
+        typedef cds::details::Allocator< internal_bucket_type, typename traits::allocator >  bucket_table_allocator;
+
         typedef typename bucket_type::iterator        bucket_iterator;
         typedef typename bucket_type::const_iterator  bucket_const_iterator;
         //@endcond
 
     protected:
+        //@cond
         item_counter    m_ItemCounter;   ///< Item counter
         hash            m_HashFunctor;   ///< Hash functor
-        bucket_type *   m_Buckets;       ///< bucket table
+        internal_bucket_type *   m_Buckets;       ///< bucket table
+        //@endcond
 
     private:
         //@cond
@@ -100,7 +112,7 @@ namespace cds { namespace container {
 
         /// Returns the bucket (ordered list) for \p key
         template <typename Q>
-        bucket_type&    bucket( const Q& key )
+        internal_bucket_type& bucket( const Q& key )
         {
             return m_Buckets[ hash_value( key ) ];
         }
@@ -200,11 +212,11 @@ namespace cds { namespace container {
         //@cond
         const_iterator get_const_begin() const
         {
-            return const_iterator( const_cast<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<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
 
@@ -250,7 +262,7 @@ namespace cds { namespace container {
         template <typename Q>
         iterator insert( const Q& val )
         {
-            bucket_type& refBucket = bucket( val );
+            internal_bucket_type& refBucket = bucket( val );
             bucket_iterator it = refBucket.insert( val );
 
             if ( it != refBucket.end() ) {
@@ -268,9 +280,9 @@ namespace cds { namespace container {
         template <typename... Args>
         iterator emplace( Args&&... args )
         {
-            bucket_type& refBucket = bucket( value_type(std::forward<Args>(args)...));
-            bucket_iterator it = refBucket.emplace( std::forward<Args>(args)... );
-
+            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() ) {
                 ++m_ItemCounter;
                 return iterator( it, &refBucket, m_Buckets + bucket_count() );
@@ -297,7 +309,7 @@ namespace cds { namespace container {
         template <typename Q>
         std::pair<iterator, bool> update( Q const& val, bool bAllowInsert = true )
         {
-            bucket_type& refBucket = bucket( val );
+            internal_bucket_type& refBucket = bucket( val );
             std::pair<bucket_iterator, bool> ret = refBucket.update( val, bAllowInsert );
 
             if ( ret.first != refBucket.end() ) {
@@ -328,7 +340,7 @@ namespace cds { namespace container {
         template <typename Q>
         iterator contains( Q const& key )
         {
-            bucket_type& refBucket = bucket( key );
+            internal_bucket_type& refBucket = bucket( key );
             bucket_iterator it = refBucket.contains( key );
             if ( it != refBucket.end() )
                 return iterator( it, &refBucket, m_Buckets + bucket_count() );
@@ -353,7 +365,7 @@ namespace cds { namespace container {
         template <typename Q, typename Less>
         iterator contains( Q const& key, Less pred )
         {
-            bucket_type& refBucket = bucket( key );
+            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() );