movable exempt_ptr: MichaelList
authorkhizmax <khizmax@gmail.com>
Wed, 12 Nov 2014 13:19:31 +0000 (16:19 +0300)
committerkhizmax <khizmax@gmail.com>
Wed, 12 Nov 2014 13:19:31 +0000 (16:19 +0300)
cds/container/michael_kvlist_rcu.h
cds/container/michael_list_rcu.h
cds/intrusive/michael_list_rcu.h
tests/test-hdr/ordered_list/hdr_intrusive_michael.h
tests/test-hdr/ordered_list/hdr_michael.h
tests/test-hdr/ordered_list/hdr_michael_kv.h

index 0b0e495807345f0973a7a67c47fa1efc0e7de539..5be3c92c605aee6ea7fcf4a43980cd347779d14f 100644 (file)
@@ -127,9 +127,9 @@ namespace cds { namespace container {
 
     public:
         /// pointer to extracted node
 
     public:
         /// pointer to extracted node
-        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer,
+        using exempt_ptr = cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer,
             cds::urcu::details::conventional_exempt_pair_cast<node_type, value_type>
             cds::urcu::details::conventional_exempt_pair_cast<node_type, value_type>
-        > exempt_ptr;
+        >;
 
     protected:
         //@cond
 
     protected:
         //@cond
@@ -510,8 +510,8 @@ namespace cds { namespace container {
         /**
         @anchor cds_nonintrusive_MichaelKVList_rcu_extract
             The function searches an item with key equal to \p key in the list,
         /**
         @anchor cds_nonintrusive_MichaelKVList_rcu_extract
             The function searches an item with key equal to \p key in the list,
-            unlinks it from the list, and returns pointer to an item found in \p dest argument.
-            If \p key is not found the function returns \p false.
+            unlinks it from the list, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found.
+            If \p key is not found the function returns 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 list
 
             @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 list
@@ -535,7 +535,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 ( theList.extract( p, 10 )) {
+                p = theList.extract( 10 );
+                if ( p ) {
                     // do something with p
                     ...
                 }
                     // do something with p
                     ...
                 }
@@ -546,10 +547,9 @@ 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 )
         {
         {
-            dest = extract_at( head(), key, intrusive_key_comparator() );
-            return !dest.empty();
+            return exempt_ptr( extract_at( head(), key, intrusive_key_comparator() ));
         }
 
         /// Extracts an item from the list using \p pred predicate for searching
         }
 
         /// Extracts an item from the list using \p pred predicate for searching
@@ -560,10 +560,9 @@ namespace cds { namespace container {
             \p pred must imply the same element order as \ref key_comparator.
         */
         template <typename K, typename Less>
             \p pred must imply the same element order as \ref key_comparator.
         */
         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 )
         {
         {
-            dest = extract_at( head(), key, typename maker::template less_wrapper<Less>::type() );
-            return !dest.empty();
+            return exempt_ptr( extract_at( head(), key, typename maker::template less_wrapper<Less>::type() ));
         }
 
         /// Finds the key \p key
         }
 
         /// Finds the key \p key
index 4c3d502e7650b015edc154cd00f0fd92c3cd7b4f..f28ffbe718cc6a5ba93325cc040667131c6254a8 100644 (file)
@@ -136,7 +136,7 @@ namespace cds { namespace container {
         //@endcond
 
     public:
         //@endcond
 
     public:
-        typedef cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer > exempt_ptr; ///< pointer to extracted node
+        using exempt_ptr = cds::urcu::exempt_ptr< gc, node_type, value_type, typename maker::intrusive_traits::disposer >; ///< pointer to extracted node
 
     private:
         //@cond
 
     private:
         //@cond
@@ -488,8 +488,8 @@ namespace cds { namespace container {
         /**
         @anchor cds_nonintrusive_MichaelList_rcu_extract
             The function searches an item with key equal to \p key in the list,
         /**
         @anchor cds_nonintrusive_MichaelList_rcu_extract
             The function searches an item with key equal to \p key in the list,
-            unlinks it from the list, and returns pointer to an item found in \p dest argument.
-            If the item with the key equal to \p key is not found the function returns \p false.
+            unlinks it from the list, 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 returns 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 list
 
             @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 list
@@ -513,7 +513,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 ( theList.extract( p, 10 )) {
+                p = theList.extract( 10 )
+                if ( p ) {
                     // do something with p
                     ...
                 }
                     // do something with p
                     ...
                 }
@@ -524,10 +525,9 @@ 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 )
         {
         {
-            dest = extract_at( head(), key, intrusive_key_comparator() );
-            return !dest.empty();
+            return exempt_ptr( extract_at( head(), key, intrusive_key_comparator() ));
         }
 
         /// Extracts an item from the list using \p pred predicate for searching
         }
 
         /// Extracts an item from the list using \p pred predicate for searching
@@ -539,10 +539,9 @@ namespace cds { namespace container {
             \p pred must imply the same element order as \ref key_comparator.
         */
         template <typename Q, typename Less>
             \p pred must imply the same element order as \ref key_comparator.
         */
         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 )
         {
         {
-            dest = extract_at( head(), key, typename maker::template less_wrapper<Less>::type() );
-            return !dest.empty();
+            return exempt_ptr( extract_at( head(), key, typename maker::template less_wrapper<Less>::type() ));
         }
 
         /// Finds the key \p key
         }
 
         /// Finds the key \p key
index 0f29034ad7f49502187697ed99007650c81294c2..5e19b02f13cd0726d340c1bc588763249105c601 100644 (file)
@@ -119,7 +119,7 @@ namespace cds { namespace intrusive {
         //@endcond
 
     public:
         //@endcond
 
     public:
-        typedef cds::urcu::exempt_ptr< gc, value_type, value_type, clear_and_dispose, void > exempt_ptr ; ///< pointer to extracted node
+        using exempt_ptr = cds::urcu::exempt_ptr< gc, value_type, value_type, clear_and_dispose, void >; ///< pointer to extracted node
 
     protected:
         //@cond
 
     protected:
         //@cond
@@ -481,8 +481,8 @@ namespace cds { namespace intrusive {
         /**
         @anchor cds_intrusive_MichaelList_rcu_extract
             The function searches an item with key equal to \p key in the list,
         /**
         @anchor cds_intrusive_MichaelList_rcu_extract
             The function searches an item with key equal to \p key in the list,
-            unlinks it from the list, and returns pointer to an item found in \p dest parameter.
-            If \p key is not found the function returns \p false, \p dest is empty.
+            unlinks it from the list, and returns \ref cds::urcu::exempt_ptr "exempt_ptr" pointer to the item found.
+            If \p key is not found the function returns 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 unlinks the item from the list
 
             @note The function does NOT call RCU read-side lock or synchronization,
             and does NOT dispose the item found. It just unlinks the item from the list
@@ -507,7 +507,8 @@ namespace cds { namespace intrusive {
 
                 // 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 ( theList.extract( p1, 10 )) {
+                p1 = theList.extract( 10 )
+                if ( p1 ) {
                     // do something with p1
                     ...
                 }
                     // do something with p1
                     ...
                 }
@@ -520,10 +521,9 @@ namespace cds { namespace intrusive {
             \endcode
         */
         template <typename Q>
             \endcode
         */
         template <typename Q>
-        bool extract( exempt_ptr& dest, Q const& key )
+        exempt_ptr extract( Q const& key )
         {
         {
-            dest = extract_at( m_pHead, key, key_comparator() );
-            return !dest.empty();
+            return exempt_ptr( extract_at( m_pHead, key, key_comparator() ));
         }
 
         /// Extracts an item from the list using \p pred predicate for searching
         }
 
         /// Extracts an item from the list using \p pred predicate for searching
@@ -535,10 +535,9 @@ namespace cds { namespace intrusive {
             \p pred must imply the same element order as \ref key_comparator.
         */
         template <typename Q, typename Less>
             \p pred must imply the same element order as \ref key_comparator.
         */
         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 )
         {
         {
-            dest = extract_at( m_pHead, key, cds::opt::details::make_comparator_from_less<Less>() );
-            return !dest.empty();
+            return exempt_ptr( extract_at( m_pHead, key, cds::opt::details::make_comparator_from_less<Less>() ));
         }
 
         /// Find the key \p val
         }
 
         /// Find the key \p val
index c1d3049c8258833fe3f711acba1316e1b14982c1..bbf238566be66f0175e74d5f25fee703a13bcc4e 100644 (file)
@@ -576,7 +576,8 @@ namespace ordlist {
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
-                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        ep = l.extract( a[i] );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
@@ -585,7 +586,7 @@ namespace ordlist {
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get( a[i] ) == nullptr );
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get( a[i] ) == nullptr );
-                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        CPPUNIT_CHECK( !l.extract( a[i] ));
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -594,7 +595,8 @@ namespace ordlist {
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get( a[0] ) == nullptr );
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get( a[0] ) == nullptr );
-                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    ep = l.extract( a[0] );
+                    CPPUNIT_CHECK( !ep );
                     CPPUNIT_CHECK( ep.empty() );
                 }
                 // Apply retired pointer
                     CPPUNIT_CHECK( ep.empty() );
                 }
                 // Apply retired pointer
@@ -614,7 +616,8 @@ namespace ordlist {
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
-                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        ep = l.extract_with( itm, other_less() );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
@@ -623,7 +626,8 @@ namespace ordlist {
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr );
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr );
-                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        ep = l.extract_with( itm, other_less() );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -632,7 +636,7 @@ namespace ordlist {
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get_with( other_item( 0 ), other_less() ) == nullptr );
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get_with( other_item( 0 ), other_less() ) == nullptr );
-                    CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
+                    CPPUNIT_CHECK( !l.extract_with( other_item(0), other_less() ));
                     CPPUNIT_CHECK( ep.empty() );
                 }
                 // Apply retired pointer
                     CPPUNIT_CHECK( ep.empty() );
                 }
                 // Apply retired pointer
index b612cbbdbce84d1c513d2bf2e2ec16eb3be16d8e..314df8ccfc0feba9480ea913823f7f6330b2771d 100644 (file)
@@ -560,7 +560,8 @@ namespace ordlist {
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
-                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        ep = l.extract( a[i] );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( (*ep).nVal == a[i] * 2 );
@@ -569,7 +570,8 @@ namespace ordlist {
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get( a[i] ) == nullptr );
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get( a[i] ) == nullptr );
-                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        ep = l.extract( a[i] );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -578,7 +580,7 @@ namespace ordlist {
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get( a[0] ) == nullptr );
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get( a[0] ) == nullptr );
-                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( !l.extract( a[0] ) );
                     CPPUNIT_CHECK( ep.empty() );
                 }
 
                     CPPUNIT_CHECK( ep.empty() );
                 }
 
@@ -596,7 +598,8 @@ namespace ordlist {
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
                         CPPUNIT_CHECK( pGet->nKey == a[i] );
                         CPPUNIT_CHECK( pGet->nVal == a[i] * 2 );
 
-                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        ep = l.extract_with( itm, other_less() );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->nKey == a[i] );
                         CPPUNIT_CHECK( ep->nVal == a[i] * 2 );
@@ -605,7 +608,8 @@ namespace ordlist {
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr );
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr );
-                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        ep = l.extract_with( itm, other_less() );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -614,7 +618,7 @@ namespace ordlist {
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get_with( other_item( 0 ), other_less() ) == nullptr );
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get_with( other_item( 0 ), other_less() ) == nullptr );
-                    CPPUNIT_CHECK( !l.extract_with( ep, other_item(0), other_less() ));
+                    CPPUNIT_CHECK( !l.extract_with( other_item(0), other_less() ));
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }
index 24f77f4f2b7b782c93489f1b52ebd9b79757d231..49ff561a9fe9cd654fb06f01cd3c835db231b17b 100644 (file)
@@ -397,7 +397,8 @@ namespace ordlist {
                         CPPUNIT_CHECK( pGet->first == a[i] );
                         CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
 
                         CPPUNIT_CHECK( pGet->first == a[i] );
                         CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
 
-                        CPPUNIT_ASSERT( l.extract( ep, a[i] ));
+                        ep = l.extract( a[i] );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->first == a[i] );
                         CPPUNIT_CHECK( (*ep).second.m_val == a[i] * 2 );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->first == a[i] );
                         CPPUNIT_CHECK( (*ep).second.m_val == a[i] * 2 );
@@ -406,7 +407,8 @@ namespace ordlist {
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get( a[i] ) == nullptr );
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get( a[i] ) == nullptr );
-                        CPPUNIT_CHECK( !l.extract( ep, a[i] ));
+                        ep = l.extract( a[i] );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -415,7 +417,7 @@ namespace ordlist {
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get( a[0] ) == nullptr );
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get( a[0] ) == nullptr );
-                    CPPUNIT_CHECK( !l.extract( ep, a[0] ) );
+                    CPPUNIT_CHECK( !l.extract( a[0] ) );
                     CPPUNIT_CHECK( ep.empty() );
                 }
 
                     CPPUNIT_CHECK( ep.empty() );
                 }
 
@@ -433,7 +435,8 @@ namespace ordlist {
                         CPPUNIT_CHECK( pGet->first == a[i] );
                         CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
 
                         CPPUNIT_CHECK( pGet->first == a[i] );
                         CPPUNIT_CHECK( pGet->second.m_val == a[i] * 2 );
 
-                        CPPUNIT_ASSERT( l.extract_with( ep, itm, other_less() ));
+                        ep = l.extract_with( itm, other_less() );
+                        CPPUNIT_ASSERT( ep );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->first == a[i] );
                         CPPUNIT_CHECK( ep->second.m_val == a[i] * 2 );
                         CPPUNIT_ASSERT( !ep.empty() );
                         CPPUNIT_CHECK( ep->first == a[i] );
                         CPPUNIT_CHECK( ep->second.m_val == a[i] * 2 );
@@ -442,7 +445,8 @@ namespace ordlist {
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr );
                     {
                         rcu_lock lock;
                         CPPUNIT_CHECK( l.get_with( itm, other_less() ) == nullptr );
-                        CPPUNIT_CHECK( !l.extract_with( ep, itm, other_less() ));
+                        ep = l.extract_with( itm, other_less() );
+                        CPPUNIT_CHECK( !ep );
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
                         CPPUNIT_CHECK( ep.empty() );
                     }
                 }
@@ -451,7 +455,7 @@ namespace ordlist {
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get_with( 3.14f, other_less() ) == nullptr );
                 {
                     rcu_lock lock;
                     CPPUNIT_CHECK( l.get_with( 3.14f, other_less() ) == nullptr );
-                    CPPUNIT_CHECK( !l.extract_with( ep, 3.14f, other_less() ));
+                    CPPUNIT_CHECK( !l.extract_with( 3.14f, other_less() ));
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }
                     CPPUNIT_CHECK( ep.empty() );
                 }
             }