//$$CDS-header$$
-#ifndef __CDS_CONTAINER_MICHAEL_SET_H
-#define __CDS_CONTAINER_MICHAEL_SET_H
+#ifndef CDSLIB_CONTAINER_MICHAEL_SET_H
+#define CDSLIB_CONTAINER_MICHAEL_SET_H
#include <cds/container/details/michael_set_base.h>
#include <cds/details/allocator.h>
/// Extracts the item with specified \p key
/** \anchor cds_nonintrusive_MichaelHashSet_hp_extract
The function searches an item with key equal to \p key,
- unlinks it from the set, and returns it in \p dest parameter.
- If the item with key equal to \p key is not found the function returns \p false.
+ unlinks it from the set, and returns it as \p guarded_ptr.
+ If \p key is not found the function returns an empty guadd pointer.
Note the compare functor should accept a parameter of type \p Q that may be not the same as \p value_type.
- The extracted item is freed automatically when returned \ref guarded_ptr object will be destroyed or released.
+ The extracted item is freed automatically when returned \p guarded_ptr object will be destroyed or released.
@note Each \p guarded_ptr object uses the GC's guard that can be limited resource.
Usage:
michael_set theSet;
// ...
{
- michael_set::guarded_ptr gp;
- theSet.extract( gp, 5 );
- // Deal with gp
- // ...
-
+ michael_set::guarded_ptr gp( theSet.extract( 5 ));
+ if ( gp ) {
+ // Deal with gp
+ // ...
+ }
// Destructor of gp releases internal HP guard
}
\endcode
*/
template <typename Q>
- bool extract( guarded_ptr& dest, Q const& key )
+ guarded_ptr extract( Q const& key )
{
- const bool bRet = bucket( key ).extract( dest, key );
- if ( bRet )
+ guarded_ptr gp( bucket( key ).extract( key ));
+ if ( gp )
--m_ItemCounter;
- return bRet;
+ return gp;
}
/// Extracts the item using compare functor \p pred
/**
- The function is an analog of \ref cds_nonintrusive_MichaelHashSet_hp_extract "extract(guarded_ptr&, Q const&)"
+ The function is an analog of \ref cds_nonintrusive_MichaelHashSet_hp_extract "extract(Q const&)"
but \p pred predicate is used for key comparing.
\p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
\p pred must imply the same element order as the comparator used for building the set.
*/
template <typename Q, typename Less>
- bool extract_with( guarded_ptr& dest, Q const& key, Less pred )
+ guarded_ptr extract_with( Q const& key, Less pred )
{
- const bool bRet = bucket( key ).extract_with( dest, key, pred );
- if ( bRet )
+ guarded_ptr gp( bucket( key ).extract_with( key, pred ));
+ if ( gp )
--m_ItemCounter;
- return bRet;
+ return gp;
}
/// Finds the key \p key
\endcode
where \p item is the item found, \p key is the <tt>find</tt> function argument.
- You may pass \p f argument by reference using \p std::ref.
-
The functor may change non-key fields of \p item. Note that the functor is only guarantee
that \p item cannot be disposed during functor is executing.
The functor does not serialize simultaneous access to the set's \p item. If such access is
{
return bucket( key ).find( key, f );
}
+ //@cond
+ template <typename Q, typename Func>
+ bool find( Q const& key, Func f )
+ {
+ return bucket( key ).find( key, f );
+ }
+ //@endcond
/// Finds the key \p key using \p pred predicate for searching
/**
{
return bucket( key ).find_with( key, pred, f );
}
+ //@cond
+ template <typename Q, typename Less, typename Func>
+ bool find_with( Q const& key, Less pred, Func f )
+ {
+ return bucket( key ).find_with( key, pred, f );
+ }
+ //@endcond
/// Finds the key \p key
/** \anchor cds_nonintrusive_MichaelSet_find_val
/// Finds the key \p key and return the item found
/** \anchor cds_nonintrusive_MichaelHashSet_hp_get
The function searches the item with key equal to \p key
- and assigns the item found to guarded pointer \p ptr.
- The function returns \p true if \p key is found, and \p false otherwise.
- If \p key is not found the \p ptr parameter is not changed.
+ and returns the guarded pointer to the item found.
+ If \p key is not found the functin returns an empty guarded pointer.
@note Each \p guarded_ptr object uses one GC's guard which can be limited resource.
michael_set theSet;
// ...
{
- michael_set::guarded_ptr gp;
- if ( theSet.get( gp, 5 )) {
+ michael_set::guarded_ptr gp( theSet.get( 5 ));
+ if ( gp ) {
// Deal with gp
//...
}
should accept a parameter of type \p Q that can be not the same as \p value_type.
*/
template <typename Q>
- bool get( guarded_ptr& ptr, Q const& key )
+ guarded_ptr get( Q const& key )
{
- return bucket( key ).get( ptr, key );
+ return bucket( key ).get( key );
}
/// Finds the key \p key and return the item found
/**
- The function is an analog of \ref cds_nonintrusive_MichaelHashSet_hp_get "get( guarded_ptr& ptr, Q const&)"
+ The function is an analog of \ref cds_nonintrusive_MichaelHashSet_hp_get "get( Q const&)"
but \p pred is used for comparing the keys.
\p Less functor has the semantics like \p std::less but should take arguments of type \ref value_type and \p Q
\p pred must imply the same element order as the comparator used for building the set.
*/
template <typename Q, typename Less>
- bool get_with( guarded_ptr& ptr, Q const& key, Less pred )
+ guarded_ptr get_with( Q const& key, Less pred )
{
- return bucket( key ).get_with( ptr, key, pred );
+ return bucket( key ).get_with( key, pred );
}
/// Clears the set (non-atomic)
}} // namespace cds::container
-#endif // ifndef __CDS_CONTAINER_MICHAEL_SET_H
+#endif // ifndef CDSLIB_CONTAINER_MICHAEL_SET_H