//$$CDS-header$$
-#ifndef __CDS_CONTAINER_MICHAEL_MAP_RCU_H
-#define __CDS_CONTAINER_MICHAEL_MAP_RCU_H
+#ifndef CDSLIB_CONTAINER_MICHAEL_MAP_RCU_H
+#define CDSLIB_CONTAINER_MICHAEL_MAP_RCU_H
#include <cds/container/details/michael_map_base.h>
#include <cds/details/allocator.h>
static_assert( std::is_same<gc, typename bucket_type::gc>::value, "GC and OrderedList::gc must be the same");
// atomicity::empty_item_counter is not allowed as a item counter
- static_assert( !std::is_same<item_counter, cds::atomicity::empty_item_counter>::value,
+ static_assert( !std::is_same<item_counter, cds::atomicity::empty_item_counter>::value,
"cds::atomicity::empty_item_counter is not allowed as a item counter");
m_Buckets = bucket_table_allocator().NewArray( bucket_count() );
synchronization.
*/
template <typename K, typename Func>
- bool insert_key( const K& key, Func func )
+ bool insert_with( const K& key, Func func )
{
- const bool bRet = bucket( key ).insert_key( key, func );
+ const bool bRet = bucket( key ).insert_with( key, func );
if ( bRet )
++m_ItemCounter;
return bRet;
void operator()(value_type& item) { ... }
};
\endcode
- The functor may be passed by reference using <tt>boost:ref</tt>
RCU \p synchronize method can be called. RCU should not be locked.
/// 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
// 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
...
}
\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;
- return true;
- }
- return false;
+ return p;
}
/// Extracts an item from the map using \p pred predicate for searching
\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;
- return true;
- }
- return false;
+ return p;
}
/// Finds the key \p key
};
}} // namespace cds::container
-#endif // ifndef __CDS_CONTAINER_MICHAEL_MAP_RCU_H
+#endif // ifndef CDSLIB_CONTAINER_MICHAEL_MAP_RCU_H