[draft] container::MultiLevelHashMap
[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
15         /// Hash accessor option
16         /**
17             @copydetails cds::intrusive::multilevel_hashset::traits::hash_accessor
18         */
19         template <typename Accessor>
20         using hash_accessor = cds::intrusive::hash_accessor< Accessor >;
21
22         /// \p MultiLevelHashSet internal statistics, see cds::intrusive::multilevel_hashset::stat
23         template <typename EventCounter = cds::atomicity::event_counter>
24         using stat = cds::intrusive::multilevel_hashset::stat< EventCounter >;
25
26         /// \p MultiLevelHashSet empty internal statistics
27         typedef cds::intrusive::multilevel_hashset::empty_stat empty_stat;
28
29         /// Bit-wise memcmp-based comparator for hash value \p T
30         template <typename T>
31         using bitwise_compare = cds::intrusive::multilevel_hashset::bitwise_compare< T >;
32
33         /// \p MultiLevelHashSet traits
34         struct traits
35         {
36             /// Mandatory functor to get hash value from data node
37             /**
38                 @copydetails cds::intrusive::multilevel_hashset::traits::hash_accessor
39             */
40             typedef cds::opt::none hash_accessor;
41
42             /// Hash comparing functor
43             /**
44                 @copydetails cds::intrusive::multilevel_hashset::traits::compare
45             */
46             typedef cds::opt::none compare;
47
48             /// Specifies binary predicate used for hash compare.
49             /**
50                 @copydetails cds::intrusive::multilevel_hashset::traits::less
51             */
52             typedef cds::opt::none less;
53
54             /// Item counter
55             /**
56                 @copydetails cds::intrusive::multilevel_hashset::traits::item_counter
57             */
58             typedef cds::atomicity::item_counter item_counter;
59
60             /// Item allocator
61             /**
62                 Default is \ref CDS_DEFAULT_ALLOCATOR
63             */
64             typedef CDS_DEFAULT_ALLOCATOR allocator;
65
66             /// Array node allocator
67             /**
68                 @copydetails cds::intrusive::multilevel_hashset::traits::node_allocator
69             */
70             typedef CDS_DEFAULT_ALLOCATOR node_allocator;
71
72             /// C++ memory ordering model
73             /**
74                 @copydetails cds::intrusive::multilevel_hashset::traits::memory_model
75             */
76             typedef cds::opt::v::relaxed_ordering memory_model;
77
78             /// Back-off strategy
79             typedef cds::backoff::Default back_off;
80
81             /// Internal statistics
82             /**
83                 @copydetails cds::intrusive::multilevel_hashset::traits::stat
84             */
85             typedef empty_stat stat;
86
87             /// RCU deadlock checking policy (only for \ref cds_container_MultilevelHashSet_rcu "RCU-based MultilevelHashSet")
88             /**
89                 @copydetails cds::intrusive::multilevel_hashset::traits::rcu_check_deadlock
90             */
91             typedef cds::opt::v::rcu_throw_deadlock rcu_check_deadlock;
92         };
93
94         /// Metafunction converting option list to \p multilevel_hashset::traits
95         /**
96             Supported \p Options are:
97             - \p multilevel_hashset::hash_accessor - mandatory option, hash accessor functor.
98                 @copydetails traits::hash_accessor
99             - \p opt::allocator - item allocator
100                 @copydetails traits::allocator
101             - \p opt::node_allocator - array node allocator.
102                 @copydetails traits::node_allocator
103             - \p opt::compare - hash comparison functor. No default functor is provided.
104                 If the option is not specified, the \p opt::less is used.
105             - \p opt::less - specifies binary predicate used for hash comparison. 
106                 @copydetails cds::container::multilevel_hashset::traits::less
107             - \p opt::back_off - back-off strategy used. If the option is not specified, the \p cds::backoff::Default is used.
108             - \p opt::item_counter - the type of item counting feature.
109                 @copydetails cds::intrusive::multilevel_hashset::traits::item_counter
110             - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default)                
111                 or \p opt::v::sequential_consistent (sequentially consisnent memory model).
112             - \p opt::stat - internal statistics. By default, it is disabled (\p multilevel_hashset::empty_stat).
113                 To enable it use \p multilevel_hashset::stat
114             - \p opt::rcu_check_deadlock - a deadlock checking policy for \ref cds_intrusive_MultilevelHashSet_rcu "RCU-based MultilevelHashSet"
115                 Default is \p opt::v::rcu_throw_deadlock
116         */
117         template <typename... Options>
118         struct make_traits
119         {
120 #   ifdef CDS_DOXYGEN_INVOKED
121             typedef implementation_defined type ;   ///< Metafunction result
122 #   else
123             typedef typename cds::opt::make_options<
124                 typename cds::opt::find_type_traits< traits, Options... >::type
125                 ,Options...
126             >::type   type;
127 #   endif
128         };
129     } // namespace multilevel_hashset
130
131     //@cond
132     // Forward declaration
133     template < class GC, typename T, class Traits = multilevel_hashset::traits >
134     class MultiLevelHashSet;
135     //@endcond
136
137     //@cond
138     namespace details {
139
140         template <typename GC, typename T, typename Traits>
141         struct make_multilevel_hashset
142         {
143             typedef GC      gc;
144             typedef T       value_type;
145             typedef Traits  original_traits;
146
147             typedef cds::details::Allocator< value_type, typename original_traits::allocator > cxx_node_allocator;
148
149             struct node_disposer
150             {
151                 void operator()( value_type * p ) const
152                 {
153                     cxx_node_allocator().Delete( p );
154                 }
155             };
156
157             struct intrusive_traits: public original_traits
158             {
159                 typedef node_disposer disposer;
160             };
161
162             // Metafunction result
163             typedef cds::intrusive::MultiLevelHashSet< GC, T, intrusive_traits > type;
164         };
165     } // namespace details
166     //@endcond
167
168 }} // namespace cds::container
169
170 #endif // #ifndef CDSLIB_CONTAINER_DETAILS_MULTILEVEL_HASHSET_BASE_H