movable exempt_ptr: MichaelSet/Map
authorkhizmax <libcds.dev@gmail.com>
Wed, 12 Nov 2014 19:49:51 +0000 (22:49 +0300)
committerkhizmax <libcds.dev@gmail.com>
Wed, 12 Nov 2014 19:49:51 +0000 (22:49 +0300)
cds/container/michael_map_rcu.h
cds/container/michael_set_rcu.h
tests/test-hdr/map/hdr_map.h
tests/test-hdr/set/hdr_intrusive_set.h
tests/test-hdr/set/hdr_set.h

index 54cd1b5710e9cd82e978c92a82e4fbd36c0f3ab1..8888759a8980aeae18bb92519ebb02b91ef29e79 100644 (file)
@@ -527,8 +527,8 @@ namespace cds { namespace container {
         /// Extracts an item from the map
         /** \anchor cds_nonintrusive_MichaelHashMap_rcu_extract
             The function searches an item with key equal to \p key,
         /// Extracts an item from the map
         /** \anchor cds_nonintrusive_MichaelHashMap_rcu_extract
             The function searches an item with key equal to \p key,
-            unlinks it from the map, places item pointer into \p dest argument, and returns \p true.
-            If the item is not found the function return \p false.
+            unlinks it from the map, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found.
+            If the item is not found the function return an empty \p exempt_ptr.
 
             @note The function does NOT call RCU read-side lock or synchronization,
             and does NOT dispose the item found. It just excludes the item from the map
 
             @note The function does NOT call RCU read-side lock or synchronization,
             and does NOT dispose the item found. It just excludes the item from the map
@@ -555,7 +555,8 @@ namespace cds { namespace container {
 
                 // Now, you can apply extract function
                 // Note that you must not delete the item found inside the RCU lock
 
                 // Now, you can apply extract function
                 // Note that you must not delete the item found inside the RCU lock
-                if ( theMap.extract( p, 10 )) {
+                p = theMap.extract( 10 );
+                if ( p ) {
                     // do something with p
                     ...
                 }
                     // do something with p
                     ...
                 }
@@ -567,13 +568,12 @@ namespace cds { namespace container {
             \endcode
         */
         template <typename K>
             \endcode
         */
         template <typename K>
-        bool extract( exempt_ptr& dest, K const& key )
+        exempt_ptr extract( K const& key )
         {
         {
-            if ( bucket( key ).extract( dest, key )) {
+            exempt_ptr p = bucket( key ).extract( key );
+            if ( p )
                 --m_ItemCounter;
                 --m_ItemCounter;
-                return true;
-            }
-            return false;
+            return p;
         }
 
         /// Extracts an item from the map using \p pred predicate for searching
         }
 
         /// Extracts an item from the map using \p pred predicate for searching
@@ -584,13 +584,12 @@ namespace cds { namespace container {
             \p pred must imply the same element order as the comparator used for building the map.
         */
         template <typename K, typename Less>
             \p pred must imply the same element order as the comparator used for building the map.
         */
         template <typename K, typename Less>
-        bool extract_with( exempt_ptr& dest, K const& key, Less pred )
+        exempt_ptr extract_with( K const& key, Less pred )
         {
         {
-            if ( bucket( key ).extract_with( dest, key, pred )) {
+            exempt_ptr p = bucket( key ).extract_with( key, pred );
+            if ( p )
                 --m_ItemCounter;
                 --m_ItemCounter;
-                return true;
-            }
-            return false;
+            return p;
         }
 
         /// Finds the key \p key
         }
 
         /// Finds the key \p key
index e1e617c1342d9e3a373db7084136f2077f58b3a5..27cec415e486eefc94455ab6e8beb5710acaf533 100644 (file)
@@ -449,8 +449,8 @@ namespace cds { namespace container {
         /// Extracts an item from the set
         /** \anchor cds_nonintrusive_MichaelHashSet_rcu_extract
             The function searches an item with key equal to \p key in the set,
         /// Extracts an item from the set
         /** \anchor cds_nonintrusive_MichaelHashSet_rcu_extract
             The function searches an item with key equal to \p key in the set,
-            unlinks it from the set, places item pointer into \p dest argument, and returns \p true.
-            If the item with the key equal to \p key is not found the function return \p false.
+            unlinks it from the set, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found.
+            If the item with the key equal to \p key is not found the function return an empty \p exempt_ptr.
 
             @note The function does NOT call RCU read-side lock or synchronization,
             and does NOT dispose the item found. It just excludes the item from the set
 
             @note The function does NOT call RCU read-side lock or synchronization,
             and does NOT dispose the item found. It just excludes the item from the set
@@ -477,7 +477,8 @@ namespace cds { namespace container {
 
                 // Now, you can apply extract function
                 // Note that you must not delete the item found inside the RCU lock
 
                 // Now, you can apply extract function
                 // Note that you must not delete the item found inside the RCU lock
-                if ( theSet.extract( p, 10 )) {
+                p = theSet.extract( 10 );
+                if ( p ) {
                     // do something with p
                     ...
                 }
                     // do something with p
                     ...
                 }
@@ -489,13 +490,12 @@ namespace cds { namespace container {
             \endcode
         */
         template <typename Q>
             \endcode
         */
         template <typename Q>
-        bool extract( exempt_ptr& dest, Q const& key )
+        exempt_ptr extract( Q const& key )
         {
         {
-            if ( bucket( key ).extract( dest, key )) {
+            exempt_ptr p = bucket( key ).extract( key );
+            if ( p )
                 --m_ItemCounter;
                 --m_ItemCounter;
-                return true;
-            }
-            return false;
+            return p;
         }
 
         /// Extracts an item from the set using \p pred predicate for searching
         }
 
         /// Extracts an item from the set using \p pred predicate for searching
@@ -506,13 +506,12 @@ namespace cds { namespace container {
             \p pred must imply the same element order as the comparator used for building the set.
         */
         template <typename Q, typename Less>
             \p pred must imply the same element order as the comparator used for building the set.
         */
         template <typename Q, typename Less>
-        bool extract_with( exempt_ptr& dest, Q const& key, Less pred )
+        exempt_ptr extract_with( Q const& key, Less pred )
         {
         {
-            if ( bucket( key ).extract_with( dest, key, pred )) {
+            exempt_ptr p = bucket( key ).extract_with( key, pred );
+            if ( p )
                 --m_ItemCounter;
                 --m_ItemCounter;
-                return true;
-            }
-            return false;
+            return p;
         }
 
         /// Finds the key \p key
         }
 
         /// Finds the key \p key
index d27b3551c96d7f23ae604d4276207a698ce99102..7cdfb1a407d22cc3e7672a03f33a217f86b6d691 100644 (file)
@@ -286,7 +286,8 @@ namespace map {
                         CPPUNIT_CHECK( pVal->first == nKey );
                         CPPUNIT_CHECK( pVal->second.m_val == nKey );
 
                         CPPUNIT_CHECK( pVal->first == nKey );
                         CPPUNIT_CHECK( pVal->second.m_val == nKey );
 
-                        CPPUNIT_ASSERT( m.extract( ep, nKey ));
+                        ep = m.extract( nKey );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->first == ep->first );
                         CPPUNIT_CHECK( pVal->second.m_val == ep->second.m_val );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->first == ep->first );
                         CPPUNIT_CHECK( pVal->second.m_val == ep->second.m_val );
@@ -295,7 +296,8 @@ namespace map {
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( m.get( nKey ) == nullptr );
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( m.get( nKey ) == nullptr );
-                        CPPUNIT_CHECK( !m.extract( ep, nKey ));
+                        ep = m.extract( nKey );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
 
                         nKey = arr[i+1];
                         CPPUNIT_CHECK( ep.empty() );
 
                         nKey = arr[i+1];
@@ -304,7 +306,8 @@ namespace map {
                         CPPUNIT_CHECK( pVal->first == nKey );
                         CPPUNIT_CHECK( pVal->second.m_val == nKey );
 
                         CPPUNIT_CHECK( pVal->first == nKey );
                         CPPUNIT_CHECK( pVal->second.m_val == nKey );
 
-                        CPPUNIT_ASSERT( m.extract_with( ep, other_item(nKey), other_less() ));
+                        ep = m.extract_with( other_item( nKey ), other_less() );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->first == ep->first );
                         CPPUNIT_CHECK( pVal->second.m_val == (*ep).second.m_val );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->first == ep->first );
                         CPPUNIT_CHECK( pVal->second.m_val == (*ep).second.m_val );
@@ -313,7 +316,7 @@ namespace map {
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( m.get_with( other_item(nKey), other_less() ) == nullptr );
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( m.get_with( other_item(nKey), other_less() ) == nullptr );
-                        CPPUNIT_CHECK( !m.extract_with( ep, other_item(nKey), other_less() ));
+                        CPPUNIT_CHECK( !m.extract_with( other_item(nKey), other_less() ));
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -322,7 +325,8 @@ namespace map {
                 {
                     rcu_lock l;
                     CPPUNIT_CHECK( m.get( int(nLimit / 2) ) == nullptr );
                 {
                     rcu_lock l;
                     CPPUNIT_CHECK( m.get( int(nLimit / 2) ) == nullptr );
-                    CPPUNIT_CHECK( !m.extract( ep, int(nLimit / 2) ));
+                    ep = m.extract( int( nLimit / 2 ) );
+                    CPPUNIT_CHECK( !ep );
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }
index e58bbd61764133254b16fc7682c228a9b9b0cf28..aae9cbe36eec26445c946fa8737ece3f782c72ff 100644 (file)
@@ -1031,7 +1031,8 @@ namespace set {
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
 
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
 
-                        CPPUNIT_ASSERT( s.extract( ep, nKey ));
+                        ep = s.extract( nKey );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
@@ -1040,7 +1041,7 @@ namespace set {
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get( nKey ) == nullptr );
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get( nKey ) == nullptr );
-                        CPPUNIT_CHECK( !s.extract( ep, nKey ));
+                        CPPUNIT_CHECK( !s.extract( nKey ));
                         CPPUNIT_CHECK( ep.empty() );
 
                         nKey = arr[i+1];
                         CPPUNIT_CHECK( ep.empty() );
 
                         nKey = arr[i+1];
@@ -1049,7 +1050,8 @@ namespace set {
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
 
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
 
-                        CPPUNIT_ASSERT( s.extract_with( ep, nKey, less<value_type>() ));
+                        ep = s.extract_with( nKey, less<value_type>() );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
@@ -1058,7 +1060,8 @@ namespace set {
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get_with( nKey, less<value_type>() ) == nullptr );
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get_with( nKey, less<value_type>() ) == nullptr );
-                        CPPUNIT_CHECK( !s.extract_with( ep, nKey, less<value_type>() ));
+                        ep = s.extract_with( nKey, less<value_type>() );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -1067,7 +1070,8 @@ namespace set {
                 {
                     rcu_lock l;
                     CPPUNIT_CHECK( s.get( 100 ) == nullptr );
                 {
                     rcu_lock l;
                     CPPUNIT_CHECK( s.get( 100 ) == nullptr );
-                    CPPUNIT_CHECK( !s.extract( ep, 100 ));
+                    ep = s.extract( 100 );
+                    CPPUNIT_CHECK( !ep );
                     CPPUNIT_CHECK( ep.empty() );
                 }
 
                     CPPUNIT_CHECK( ep.empty() );
                 }
 
index f7ac01dc8dda1ae043eded04daadaa341795575d..a546eb47b798709a2960940533396ff366406826 100644 (file)
@@ -437,7 +437,8 @@ namespace set {
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey );
 
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey );
 
-                        CPPUNIT_ASSERT( s.extract( ep, nKey ));
+                        ep = s.extract( nKey );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
@@ -446,7 +447,8 @@ namespace set {
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get( nKey ) == nullptr );
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get( nKey ) == nullptr );
-                        CPPUNIT_CHECK( !s.extract( ep, nKey ));
+                        ep = s.extract( nKey );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
 
                         nKey = arr[i+1];
                         CPPUNIT_CHECK( ep.empty() );
 
                         nKey = arr[i+1];
@@ -455,7 +457,8 @@ namespace set {
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey );
 
                         CPPUNIT_CHECK( pVal->nKey == nKey );
                         CPPUNIT_CHECK( pVal->nVal == nKey );
 
-                        CPPUNIT_ASSERT( s.extract_with( ep, other_item(nKey), other_less() ));
+                        ep = s.extract_with( other_item( nKey ), other_less() );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( pVal->nKey == ep->nKey );
                         CPPUNIT_CHECK( pVal->nVal == (*ep).nVal );
@@ -464,7 +467,7 @@ namespace set {
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get_with( other_item( nKey ), other_less() ) == nullptr );
                     {
                         rcu_lock l;
                         CPPUNIT_CHECK( s.get_with( other_item( nKey ), other_less() ) == nullptr );
-                        CPPUNIT_CHECK( !s.extract_with( ep, other_item(nKey), other_less() ));
+                        CPPUNIT_CHECK( !s.extract_with( other_item(nKey), other_less() ));
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -473,7 +476,8 @@ namespace set {
                 {
                     rcu_lock l;
                     CPPUNIT_CHECK( s.get( int( nLimit / 2 ) ) == nullptr );
                 {
                     rcu_lock l;
                     CPPUNIT_CHECK( s.get( int( nLimit / 2 ) ) == nullptr );
-                    CPPUNIT_CHECK( !s.extract( ep, int(nLimit / 2) ));
+                    ep = s.extract( int( nLimit / 2 ) );
+                    CPPUNIT_CHECK( !ep );
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }