cds
2.3.2
|
Michael's hash set (template specialization for gc::nogc) More...
#include <cds/intrusive/michael_set_nogc.h>
Public Types | |
typedef cds::gc::nogc | gc |
Garbage collector. | |
typedef OrderedList | ordered_list |
type of ordered list used as a bucket implementation | |
typedef Traits | traits |
Set traits. | |
typedef ordered_list::value_type | value_type |
type of value to be stored in the set | |
typedef ordered_list::key_comparator | key_comparator |
key comparing functor | |
typedef ordered_list::disposer | disposer |
Node disposer functor. | |
typedef ordered_list::stat | stat |
Internal statistics. | |
typedef cds::opt::v::hash_selector< typename traits::hash >::type | hash |
Hash functor for value_type and all its derivatives that you use. | |
typedef traits::item_counter | item_counter |
Item counter type. | |
typedef traits::allocator | allocator |
Bucket table allocator. | |
Public Member Functions | |
MichaelHashSet (size_t nMaxItemCount, size_t nLoadFactor) | |
Initializes hash set. More... | |
~MichaelHashSet () | |
Clears hash set object and destroys it. | |
bool | insert (value_type &val) |
Inserts new node. More... | |
template<typename Func > | |
std::pair< bool, bool > | update (value_type &val, Func func, bool bAllowInsert=true) |
Updates the element. More... | |
template<typename Q > | |
value_type * | contains (Q const &key) |
Checks whether the set contains key . More... | |
template<typename Q , typename Less > | |
value_type * | contains (Q const &key, Less pred) |
Checks whether the set contains key using pred predicate for searching. More... | |
template<typename Q , typename Func > | |
bool | find (Q &key, Func f) |
Finds the key key . More... | |
template<typename Q , typename Less , typename Func > | |
bool | find_with (Q &key, Less pred, Func f) |
Finds the key key using pred predicate for searching. More... | |
void | clear () |
Clears the set (non-atomic) More... | |
bool | empty () const |
Checks if the set is empty. More... | |
size_t | size () const |
Returns item count in the set. More... | |
size_t | bucket_count () const |
Returns the size of hash table. More... | |
stat const & | statistics () const |
Returns const reference to internal statistics. | |
Forward iterators | |
typedef michael_set::details::iterator< internal_bucket_type, false > | iterator |
Forward iterator. More... | |
typedef michael_set::details::iterator< internal_bucket_type, true > | const_iterator |
Const forward iterator. More... | |
iterator | begin () |
Returns a forward iterator addressing the first element in a set. More... | |
iterator | end () |
Returns an iterator that addresses the location succeeding the last element in a set. More... | |
const_iterator | begin () const |
Returns a forward const iterator addressing the first element in a set. | |
const_iterator | cbegin () const |
Returns a forward const iterator addressing the first element in a set. | |
const_iterator | end () const |
Returns an const iterator that addresses the location succeeding the last element in a set. | |
const_iterator | cend () const |
Returns an const iterator that addresses the location succeeding the last element in a set. | |
Michael's hash set (template specialization for gc::nogc)
This specialization is so-called append-only when no item reclamation may be performed. The set does not support deleting of list item.
See MichaelHashSet for description of template parameters. The template parameter OrderedList
should be any cds::gc::nogc
-derived ordered list, for example, append-only MichaelList.
typedef michael_set::details::iterator< internal_bucket_type, true > cds::intrusive::MichaelHashSet< cds::gc::nogc, OrderedList, Traits >::const_iterator |
Const forward iterator.
For iterator's features and requirements see iterator
typedef michael_set::details::iterator< internal_bucket_type, false > cds::intrusive::MichaelHashSet< cds::gc::nogc, OrderedList, Traits >::iterator |
Forward iterator.
The forward iterator for Michael's set is based on OrderedList
forward iterator and has some features:
The iterator interface:
|
inline |
Initializes hash set.
The Michael's hash set is an unbounded container, but its hash table is non-expandable. At construction time you should pass estimated maximum item count and a load factor. The load factor is average size of one bucket - a small number between 1 and 10. The bucket is an ordered single-linked list, searching in the bucket has linear complexity O(nLoadFactor)
. The constructor defines hash table size as rounding nMaxItemCount / nLoadFactor
up to nearest power of two.
nMaxItemCount | estimation of max item count in the hash set |
nLoadFactor | load factor: estimation of max number of items in the bucket |
|
inline |
|
inline |
Returns the size of hash table.
Since MichaelHashSet
cannot dynamically extend the hash table size, the value returned is an constant depending on object initialization parameters; see MichaelHashSet::MichaelHashSet for explanation.
|
inline |
Clears the set (non-atomic)
The function unlink all items from the set. The function is not atomic. It cleans up each bucket and then resets the item counter to zero. If there are a thread that performs insertion while clear
() is working the result is undefined in general case: empty()
may return true
but the set may contain item(s). Therefore, clear
() may be used only for debugging purposes.
For each item the disposer
is called after unlinking.
|
inline |
Checks whether the set contains key
.
The function searches the item with key equal to key
and returns the pointer to an element found or nullptr
.
Note the hash functor specified for class Traits
template parameter should accept a parameter of type Q
that can be not the same as value_type
.
|
inline |
Checks whether the set contains key
using pred
predicate for searching.
The function is an analog of contains( key )
but pred
is used for key comparing. Less
functor has the interface like std::less
. Less
must imply the same element order as the comparator used for building the set.
|
inline |
Checks if the set is empty.
atomicity::empty_item_counter
in traits::item_counter
, the function always returns true
.
|
inline |
|
inline |
Finds the key key
.
The function searches the item with key equal to key
and calls the functor f
for item found. The interface of Func
functor is:
where item
is the item found, key
is the find
function argument.
The functor can change non-key fields of item
. The functor does not serialize simultaneous access to the set item
. If such access is possible you must provide your own synchronization schema on item level to exclude unsafe item modifications.
The key
argument is non-const since it can be used as f
functor destination i.e., the functor can modify both arguments.
Note the hash functor specified for class Traits
template parameter should accept a parameter of type Q
that can be not the same as value_type
.
The function returns true
if key
is found, false
otherwise.
|
inline |
Finds the key key
using pred
predicate for searching.
The function is an analog of find(Q&, Func) but pred
is used for key comparing. Less
functor has the interface like std::less
. pred
must imply the same element order as the comparator used for building the set.
|
inline |
Inserts new node.
The function inserts val
in the set if it does not contain an item with key equal to val
.
Returns true
if val
is placed into the set, false
otherwise.
|
inline |
Returns item count in the set.
If you use atomicity::empty_item_counter
in traits::item_counter
, the function always returns 0.
|
inline |
Updates the element.
The operation performs inserting or changing data with lock-free manner.
If the item val
not found in the set, then val
is inserted iff bAllowInsert
is true
. Otherwise, the functor func
is called with item found. The functor signature is:
with arguments:
bNew
- true
if the item has been inserted, false
otherwiseitem
- item of the setval
- argument val
passed into the update
() function If new item has been inserted (i.e. bNew
is true
) then item
and val
arguments refers to the same thing.The functor may change non-key fields of the item
.
Returns std::pair<bool, bool>
where first
is true
if operation is successful, second
is true
if new item has been added or false
if the item with key
already is in the set.