3875ead7937cafadb964b868dd96b8d28d9bd1e2
[libcds.git] / tests / unit / map2 / map_type_cuckoo.h
1 //$$CDS-header$$
2
3 #ifndef CDSUNIT_MAP_TYPE_CUCKOO_H
4 #define CDSUNIT_MAP_TYPE_CUCKOO_H
5
6 #include "map2/map_type.h"
7
8 #include <cds/container/cuckoo_map.h>
9
10 #include "print_cuckoo_stat.h"
11
12 namespace map2 {
13
14     template <typename K, typename V, typename Traits>
15     class CuckooMap :
16         public cc::CuckooMap< K, V, Traits >
17     {
18     public:
19         typedef cc::CuckooMap< K, V, Traits > cuckoo_base_class;
20
21     public:
22         CuckooMap( size_t nCapacity, size_t nLoadFactor )
23             : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
24         {}
25
26         template <typename Q, typename Pred>
27         bool erase_with( Q const& key, Pred /*pred*/ )
28         {
29             return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
30         }
31     };
32
33     template <typename Key, typename Value>
34     struct map_type< cds::intrusive::cuckoo::implementation_tag, Key, Value >: public map_type_base< Key, Value >
35     {
36         typedef map_type_base< Key, Value > base_class;
37         typedef typename base_class::compare    compare;
38         typedef typename base_class::less       less;
39         typedef typename base_class::equal_to   equal_to;
40         typedef typename base_class::key_hash   key_hash;
41         typedef typename base_class::hash       hash;
42         typedef typename base_class::hash2      hash2;
43
44         template <typename Traits>
45         struct traits_CuckooStripedMap: public Traits
46         {
47             typedef cc::cuckoo::striping<> mutex_policy;
48         };
49         template <typename Traits>
50         struct traits_CuckooRefinableMap : public Traits
51         {
52             typedef cc::cuckoo::refinable<> mutex_policy;
53         };
54
55         struct traits_CuckooMap_list_unord :
56             public cc::cuckoo::make_traits <
57                 cc::cuckoo::probeset_type< cc::cuckoo::list >
58                 , co::equal_to< equal_to >
59                 , co::hash< std::tuple< hash, hash2 > >
60             > ::type
61         {};
62         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_unord>> CuckooStripedMap_list_unord;
63         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_unord>> CuckooRefinableMap_list_unord;
64
65         struct traits_CuckooMap_list_unord_stat : public traits_CuckooMap_list_unord
66         {
67             typedef cc::cuckoo::stat stat;
68         };
69         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_unord_stat>> CuckooStripedMap_list_unord_stat;
70         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_unord_stat>> CuckooRefinableMap_list_unord_stat;
71
72         struct traits_CuckooMap_list_unord_storehash : public traits_CuckooMap_list_unord
73         {
74             static CDS_CONSTEXPR const bool store_hash = true;
75         };
76         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_unord_storehash>> CuckooStripedMap_list_unord_storehash;
77         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_unord_storehash>> CuckooRefinableMap_list_unord_storehash;
78
79         struct traits_CuckooMap_list_ord :
80             public cc::cuckoo::make_traits <
81                 cc::cuckoo::probeset_type< cc::cuckoo::list >
82                 , co::compare< compare >
83                 , co::hash< std::tuple< hash, hash2 > >
84             >::type
85         {};
86         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_ord>> CuckooStripedMap_list_ord;
87         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_ord>> CuckooRefinableMap_list_ord;
88
89         struct traits_CuckooMap_list_ord_stat : public traits_CuckooMap_list_ord
90         {
91             typedef cc::cuckoo::stat stat;
92         };
93         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_ord_stat>> CuckooStripedMap_list_ord_stat;
94         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_ord_stat>> CuckooRefinableMap_list_ord_stat;
95
96         struct traits_CuckooMap_list_ord_storehash : public traits_CuckooMap_list_ord
97         {
98             static CDS_CONSTEXPR const bool store_hash = true;
99         };
100         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_ord_storehash>> CuckooStripedMap_list_ord_storehash;
101         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_ord_storehash>> CuckooRefinableMap_list_ord_storehash;
102
103         struct traits_CuckooMap_vector_unord :
104             public cc::cuckoo::make_traits <
105                 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
106                 , co::equal_to< equal_to >
107                 , co::hash< std::tuple< hash, hash2 > >
108             >::type
109         {};
110         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_unord>> CuckooStripedMap_vector_unord;
111         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_unord>> CuckooRefinableMap_vector_unord;
112
113         struct traits_CuckooMap_vector_unord_stat : public traits_CuckooMap_vector_unord
114         {
115             typedef cc::cuckoo::stat stat;
116         };
117         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_unord_stat>> CuckooStripedMap_vector_unord_stat;
118         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_unord_stat>> CuckooRefinableMap_vector_unord_stat;
119
120         struct traits_CuckooMap_vector_unord_storehash : public traits_CuckooMap_vector_unord
121         {
122             static CDS_CONSTEXPR const bool store_hash = true;
123         };
124         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_unord_storehash>> CuckooStripedMap_vector_unord_storehash;
125         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_unord_storehash>> CuckooRefinableMap_vector_unord_storehash;
126
127         struct traits_CuckooMap_vector_ord :
128             public cc::cuckoo::make_traits <
129                 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
130                 , co::compare< compare >
131                 , co::hash< std::tuple< hash, hash2 > >
132             >::type
133         {};
134         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_ord>> CuckooStripedMap_vector_ord;
135         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_ord>> CuckooRefinableMap_vector_ord;
136
137         struct traits_CuckooMap_vector_ord_stat : public traits_CuckooMap_vector_ord
138         {
139             typedef cc::cuckoo::stat stat;
140         };
141         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_ord_stat>> CuckooStripedMap_vector_ord_stat;
142         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_ord_stat>> CuckooRefinableMap_vector_ord_stat;
143
144         struct traits_CuckooMap_vector_ord_storehash : public traits_CuckooMap_vector_ord
145         {
146             static CDS_CONSTEXPR const bool store_hash = true;
147         };
148         typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_ord_storehash>> CuckooStripedMap_vector_ord_storehash;
149         typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_ord_storehash>> CuckooRefinableMap_vector_ord_storehash;
150
151     };
152
153     template <typename K, typename T, typename Traits >
154     static inline void print_stat( cc::CuckooMap< K, T, Traits > const& m )
155     {
156         CPPUNIT_MSG( m.statistics() << m.mutex_policy_statistics() );
157     }
158
159     template <typename K, typename V, typename Traits>
160     static inline void print_stat( CuckooMap< K, V, Traits > const& m )
161     {
162         typedef CuckooMap< K, V, Traits > map_type;
163         print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
164     }
165
166 }   // namespace map2
167
168 #endif // ifndef CDSUNIT_MAP_TYPE_CUCKOO_H