MichaelList, LazyList, MichaelMap:
[libcds.git] / cds / container / details / multilevel_hashset_base.h
1 //$$CDS-header$$
2
3 #ifndef CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H
4 #define CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H
5
6 #include <cds/intrusive/details/multilevel_hashset_base.h>
7 #include <cds/container/details/base.h>
8
9 namespace cds { namespace container {
10     /// \p MultiLevelHashSet related definitions
11     /** @ingroup cds_nonintrusive_helper
12     */
13     namespace multilevel_hashset {
14         //@cond
15         using cds::intrusive::multilevel_hashset::implementation_tag;
16         //@endcond
17
18         /// Hash accessor option
19         /**
20             @copydetails cds::intrusive::multilevel_hashset::traits::hash_accessor
21         */
22         template <typename Accessor>
23         using hash_accessor = cds::intrusive::multilevel_hashset::hash_accessor< Accessor >;
24
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 >;
28
29         /// \p MultiLevelHashSet empty internal statistics
30         typedef cds::intrusive::multilevel_hashset::empty_stat empty_stat;
31
32         /// Bit-wise memcmp-based comparator for hash value \p T
33         template <typename T>
34         using bitwise_compare = cds::intrusive::multilevel_hashset::bitwise_compare< T >;
35
36         /// \p MultiLevelHashSet traits
37         struct traits
38         {
39             /// Mandatory functor to get hash value from data node
40             /**
41                 @copydetails cds::intrusive::multilevel_hashset::traits::hash_accessor
42             */
43             typedef cds::opt::none hash_accessor;
44
45             /// Hash comparing functor
46             /**
47                 @copydetails cds::intrusive::multilevel_hashset::traits::compare
48             */
49             typedef cds::opt::none compare;
50
51             /// Specifies binary predicate used for hash compare.
52             /**
53                 @copydetails cds::intrusive::multilevel_hashset::traits::less
54             */
55             typedef cds::opt::none less;
56
57             /// Item counter
58             /**
59                 @copydetails cds::intrusive::multilevel_hashset::traits::item_counter
60             */
61             typedef cds::atomicity::item_counter item_counter;
62
63             /// Item allocator
64             /**
65                 Default is \ref CDS_DEFAULT_ALLOCATOR
66             */
67             typedef CDS_DEFAULT_ALLOCATOR allocator;
68
69             /// Array node allocator
70             /**
71                 @copydetails cds::intrusive::multilevel_hashset::traits::node_allocator
72             */
73             typedef CDS_DEFAULT_ALLOCATOR node_allocator;
74
75             /// C++ memory ordering model
76             /**
77                 @copydetails cds::intrusive::multilevel_hashset::traits::memory_model
78             */
79             typedef cds::opt::v::relaxed_ordering memory_model;
80
81             /// Back-off strategy
82             typedef cds::backoff::Default back_off;
83
84             /// Internal statistics
85             /**
86                 @copydetails cds::intrusive::multilevel_hashset::traits::stat
87             */
88             typedef empty_stat stat;
89
90             /// RCU deadlock checking policy (only for \ref cds_container_MultilevelHashSet_rcu "RCU-based MultilevelHashSet")
91             /**
92                 @copydetails cds::intrusive::multilevel_hashset::traits::rcu_check_deadlock
93             */
94             typedef cds::opt::v::rcu_throw_deadlock rcu_check_deadlock;
95         };
96
97         /// Metafunction converting option list to \p multilevel_hashset::traits
98         /**
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
119         */
120         template <typename... Options>
121         struct make_traits
122         {
123 #   ifdef CDS_DOXYGEN_INVOKED
124             typedef implementation_defined type ;   ///< Metafunction result
125 #   else
126             typedef typename cds::opt::make_options<
127                 typename cds::opt::find_type_traits< traits, Options... >::type
128                 ,Options...
129             >::type   type;
130 #   endif
131         };
132     } // namespace multilevel_hashset
133
134     //@cond
135     // Forward declaration
136     template < class GC, typename T, class Traits = cds::container::multilevel_hashset::traits >
137     class MultiLevelHashSet;
138     //@endcond
139
140     //@cond
141     namespace details {
142
143         template <typename GC, typename T, typename Traits>
144         struct make_multilevel_hashset
145         {
146             typedef GC      gc;
147             typedef T       value_type;
148             typedef Traits  original_traits;
149
150             typedef cds::details::Allocator< value_type, typename original_traits::allocator > cxx_node_allocator;
151
152             struct node_disposer
153             {
154                 void operator()( value_type * p ) const
155                 {
156                     cxx_node_allocator().Delete( p );
157                 }
158             };
159
160             struct intrusive_traits: public original_traits
161             {
162                 typedef node_disposer disposer;
163             };
164
165             // Metafunction result
166             typedef cds::intrusive::MultiLevelHashSet< GC, T, intrusive_traits > type;
167         };
168     } // namespace details
169     //@endcond
170
171 }} // namespace cds::container
172
173 #endif // #ifndef CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H