3 #ifndef CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H
4 #define CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H
6 #include <cds/intrusive/details/multilevel_hashset_base.h>
7 #include <cds/container/details/base.h>
9 namespace cds { namespace container {
10 /// \p MultiLevelHashSet related definitions
11 /** @ingroup cds_nonintrusive_helper
13 namespace multilevel_hashset {
15 using cds::intrusive::multilevel_hashset::implementation_tag;
18 /// Hash accessor option
20 @copydetails cds::intrusive::multilevel_hashset::traits::hash_accessor
22 template <typename Accessor>
23 using hash_accessor = cds::intrusive::multilevel_hashset::hash_accessor< Accessor >;
25 /// \p MultiLevelHashSet internal statistics, see cds::intrusive::multilevel_hashset::stat
26 template <typename EventCounter = cds::atomicity::event_counter>
27 using stat = cds::intrusive::multilevel_hashset::stat< EventCounter >;
29 /// \p MultiLevelHashSet empty internal statistics
30 typedef cds::intrusive::multilevel_hashset::empty_stat empty_stat;
32 /// Bit-wise memcmp-based comparator for hash value \p T
34 using bitwise_compare = cds::intrusive::multilevel_hashset::bitwise_compare< T >;
36 /// \p MultiLevelHashSet traits
39 /// Mandatory functor to get hash value from data node
41 @copydetails cds::intrusive::multilevel_hashset::traits::hash_accessor
43 typedef cds::opt::none hash_accessor;
45 /// Hash comparing functor
47 @copydetails cds::intrusive::multilevel_hashset::traits::compare
49 typedef cds::opt::none compare;
51 /// Specifies binary predicate used for hash compare.
53 @copydetails cds::intrusive::multilevel_hashset::traits::less
55 typedef cds::opt::none less;
59 @copydetails cds::intrusive::multilevel_hashset::traits::item_counter
61 typedef cds::atomicity::item_counter item_counter;
65 Default is \ref CDS_DEFAULT_ALLOCATOR
67 typedef CDS_DEFAULT_ALLOCATOR allocator;
69 /// Array node allocator
71 @copydetails cds::intrusive::multilevel_hashset::traits::node_allocator
73 typedef CDS_DEFAULT_ALLOCATOR node_allocator;
75 /// C++ memory ordering model
77 @copydetails cds::intrusive::multilevel_hashset::traits::memory_model
79 typedef cds::opt::v::relaxed_ordering memory_model;
82 typedef cds::backoff::Default back_off;
84 /// Internal statistics
86 @copydetails cds::intrusive::multilevel_hashset::traits::stat
88 typedef empty_stat stat;
90 /// RCU deadlock checking policy (only for \ref cds_container_MultilevelHashSet_rcu "RCU-based MultilevelHashSet")
92 @copydetails cds::intrusive::multilevel_hashset::traits::rcu_check_deadlock
94 typedef cds::opt::v::rcu_throw_deadlock rcu_check_deadlock;
97 /// Metafunction converting option list to \p multilevel_hashset::traits
99 Supported \p Options are:
100 - \p multilevel_hashset::hash_accessor - mandatory option, hash accessor functor.
101 @copydetails traits::hash_accessor
102 - \p opt::allocator - item allocator
103 @copydetails traits::allocator
104 - \p opt::node_allocator - array node allocator.
105 @copydetails traits::node_allocator
106 - \p opt::compare - hash comparison functor. No default functor is provided.
107 If the option is not specified, the \p opt::less is used.
108 - \p opt::less - specifies binary predicate used for hash comparison.
109 @copydetails cds::container::multilevel_hashset::traits::less
110 - \p opt::back_off - back-off strategy used. If the option is not specified, the \p cds::backoff::Default is used.
111 - \p opt::item_counter - the type of item counting feature.
112 @copydetails cds::intrusive::multilevel_hashset::traits::item_counter
113 - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default)
114 or \p opt::v::sequential_consistent (sequentially consisnent memory model).
115 - \p opt::stat - internal statistics. By default, it is disabled (\p multilevel_hashset::empty_stat).
116 To enable it use \p multilevel_hashset::stat
117 - \p opt::rcu_check_deadlock - a deadlock checking policy for \ref cds_intrusive_MultilevelHashSet_rcu "RCU-based MultilevelHashSet"
118 Default is \p opt::v::rcu_throw_deadlock
120 template <typename... Options>
123 # ifdef CDS_DOXYGEN_INVOKED
124 typedef implementation_defined type ; ///< Metafunction result
126 typedef typename cds::opt::make_options<
127 typename cds::opt::find_type_traits< traits, Options... >::type
132 } // namespace multilevel_hashset
135 // Forward declaration
136 template < class GC, typename T, class Traits = cds::container::multilevel_hashset::traits >
137 class MultiLevelHashSet;
143 template <typename GC, typename T, typename Traits>
144 struct make_multilevel_hashset
147 typedef T value_type;
148 typedef Traits original_traits;
150 typedef cds::details::Allocator< value_type, typename original_traits::allocator > cxx_node_allocator;
154 void operator()( value_type * p ) const
156 cxx_node_allocator().Delete( p );
160 struct intrusive_traits: public original_traits
162 typedef node_disposer disposer;
165 // Metafunction result
166 typedef cds::intrusive::MultiLevelHashSet< GC, T, intrusive_traits > type;
168 } // namespace details
171 }} // namespace cds::container
173 #endif // #ifndef CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H