Merged branch 'master' of https://github.com/Nemo1369/libcds
[libcds.git] / cds / intrusive / details / feldman_hashset_base.h
index 9d167a5b0783075e21fd7eb0ded57dabbf020386..00707e068a2d5b7a370b4473aaaa4367d05d4e0f 100644 (file)
@@ -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/
@@ -61,7 +61,7 @@ namespace cds { namespace intrusive {
             //@endcond
         };
 
-        // Hash size option
+        /// Hash size option
         /**
             @copydetails traits::hash_size
         */
@@ -195,9 +195,7 @@ namespace cds { namespace intrusive {
 
                 Value \p 0 means <tt>sizeof( hash_type )</tt>.
             */
-            enum : size_t {
-                hash_size = 0
-            };
+            static CDS_CONSTEXPR size_t const hash_size = 0;
 
             /// Disposer for removing data nodes
             typedef cds::intrusive::opt::v::empty_disposer disposer;
@@ -404,7 +402,7 @@ namespace cds { namespace intrusive {
             >::type hash_comparator;
 
             /// The size of hash_type in bytes, see \p traits::hash_size for explanation
-            static CDS_CONSTEXPR size_t const c_hash_size = traits::hash_size == 0 ? sizeof( hash_type ) : traits::hash_size;
+            static CDS_CONSTEXPR size_t const c_hash_size = traits::hash_size == 0 ? sizeof( hash_type ) : static_cast<size_t>( traits::hash_size );
 
             typedef feldman_hashset::details::hash_splitter< hash_type, c_hash_size > hash_splitter;
 
@@ -470,7 +468,7 @@ namespace cds { namespace intrusive {
             ~multilevel_array()
             {
                 destroy_tree();
-                free_array_node(m_Head);
+                free_array_node( m_Head, head_size());
             }
 
             node_ptr traverse(traverse_data& pos)
@@ -544,8 +542,8 @@ namespace cds { namespace intrusive {
                 for (atomic_node_ptr * p = pArr->nodes, *pLast = p + nSize; p != pLast; ++p) {
                     node_ptr slot = p->load(memory_model::memory_order_relaxed);
                     if (slot.bits() == flag_array_node) {
-                        destroy_array_nodes(to_array(slot.ptr()), array_node_size());
-                        free_array_node(to_array(slot.ptr()));
+                        destroy_array_nodes( to_array(slot.ptr()), array_node_size());
+                        free_array_node( to_array( slot.ptr()), array_node_size());
                         p->store(node_ptr(), memory_model::memory_order_relaxed);
                     }
                 }
@@ -568,9 +566,9 @@ namespace cds { namespace intrusive {
                 return alloc_array_node(array_node_size(), pParent, idxParent);
             }
 
-            static void free_array_node(array_node * parr)
+            static void free_array_node( array_node * parr, size_t nSize )
             {
-                cxx_array_node_allocator().Delete(parr);
+                cxx_array_node_allocator().Delete( parr, nSize );
             }
 
             union converter {
@@ -635,7 +633,7 @@ namespace cds { namespace intrusive {
                 if (!slot.compare_exchange_strong(cur, cur | flag_array_converting, memory_model::memory_order_release, atomics::memory_order_relaxed))
                 {
                     stats().onExpandNodeFailed();
-                    free_array_node(pArr);
+                    free_array_node( pArr, array_node_size());
                     return false;
                 }