- The functor signature is:
- \code
- void func( value_type& val );
- \endcode
- where \p val is the item inserted. User-defined functor \p f should guarantee that during changing
- \p val no any other changes could be made on this set's item by concurrent threads.
- The user-defined functor is called only if the inserting is success.
- */
- template <typename Func>
- bool insert( value_type& val, Func f )
+ typename node_type::state state = node_type::clean;
+ if ( succ == pSucc && ( succ.ptr() == nullptr ||
+ succ.ptr()->set_state( state, node_type::hand_off, memory_model::memory_order_acquire )))
+ {
+ marked_node_ptr p( pCur.ptr() );
+ if ( pPred->next( nLevel ).compare_exchange_strong( p, marked_node_ptr( succ.ptr()),
+ memory_model::memory_order_acquire, atomics::memory_order_relaxed ) )
+ {
+ if ( nLevel == 0 ) {
+ gc::retire( node_traits::to_value_ptr( pCur.ptr() ), dispose_node );
+ m_Stat.onEraseWhileFind();
+ }
+ }
+
+ if ( succ.ptr() )
+ succ.ptr()->clear_state( memory_model::memory_order_release );
+ }
+ else if ( succ.ptr() != nullptr )
+ m_Stat.onNodeHandOffFailed();
+ }
+
+ template <typename Q, typename Compare >
+ bool find_position( Q const& val, position& pos, Compare cmp, bool bStopIfFound )