set2 unit test: fixed GCC incompatibility
[libcds.git] / tests / unit / set2 / set_type_cuckoo.h
1 //$$CDS-header$$
2
3 #ifndef CDSUNIT_SET_TYPE_CUCKOO_H
4 #define CDSUNIT_SET_TYPE_CUCKOO_H
5
6 #include "set2/set_type.h"
7
8 #include <cds/container/cuckoo_set.h>
9 #include "print_cuckoo_stat.h"
10
11 namespace set2 {
12
13     template <typename V, typename Traits>
14     class CuckooSet : public cc::CuckooSet< V, Traits >
15     {
16     public:
17         typedef cc::CuckooSet< V, Traits > cuckoo_base_class;
18
19     public:
20         CuckooSet( size_t nCapacity, size_t nLoadFactor )
21             : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int)4 )
22         {}
23
24         template <typename Q, typename Pred>
25         bool erase_with( Q const& key, Pred /*pred*/ )
26         {
27             return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
28         }
29     };
30
31
32     template <typename Key, typename Val>
33     struct set_type< cds::intrusive::cuckoo::implementation_tag, Key, Val >: public set_type_base< Key, Val >
34     {
35         typedef set_type_base< Key, Val > base_class;
36         typedef typename base_class::key_val key_val;
37         typedef typename base_class::compare compare;
38         typedef typename base_class::equal_to equal_to;
39         typedef typename base_class::less less;
40         typedef typename base_class::hash hash;
41         typedef typename base_class::hash2 hash2;
42
43         // ***************************************************************************
44         // CuckooSet
45
46         template <typename Traits>
47         struct traits_CuckooStripedSet : public Traits
48         {
49             typedef cc::cuckoo::striping<> mutex_policy;
50         };
51         template <typename Traits>
52         struct traits_CuckooRefinableSet : public Traits
53         {
54             typedef cc::cuckoo::refinable<> mutex_policy;
55         };
56
57         struct traits_CuckooSet_list_unord :
58             public cc::cuckoo::make_traits <
59                 cc::cuckoo::probeset_type< cc::cuckoo::list >
60                 , co::equal_to< equal_to >
61                 , co::hash< std::tuple< hash, hash2 > >
62             > ::type
63         {};
64         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord>> CuckooStripedSet_list_unord;
65         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord>> CuckooRefinableSet_list_unord;
66
67         struct traits_CuckooSet_list_unord_stat : public traits_CuckooSet_list_unord
68         {
69             typedef cc::cuckoo::stat stat;
70         };
71         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_stat>> CuckooStripedSet_list_unord_stat;
72         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_stat>> CuckooRefinableSet_list_unord_stat;
73
74         struct traits_CuckooSet_list_unord_storehash : public traits_CuckooSet_list_unord
75         {
76             static CDS_CONSTEXPR const bool store_hash = true;
77         };
78         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_storehash>> CuckooStripedSet_list_unord_storehash;
79         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_storehash>> CuckooRefinableSet_list_unord_storehash;
80
81         struct traits_CuckooSet_list_ord :
82             public cc::cuckoo::make_traits <
83                 cc::cuckoo::probeset_type< cc::cuckoo::list >
84                 , co::compare< compare >
85                 , co::hash< std::tuple< hash, hash2 > >
86             > ::type
87         {};
88         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord>> CuckooStripedSet_list_ord;
89         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord>> CuckooRefinableSet_list_ord;
90
91         struct traits_CuckooSet_list_ord_stat : public traits_CuckooSet_list_ord
92         {
93             typedef cc::cuckoo::stat stat;
94         };
95         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_stat>> CuckooStripedSet_list_ord_stat;
96         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_stat>> CuckooRefinableSet_list_ord_stat;
97
98         struct traits_CuckooSet_list_ord_storehash : public traits_CuckooSet_list_ord
99         {
100             static CDS_CONSTEXPR const bool store_hash = true;
101         };
102         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_storehash>> CuckooStripedSet_list_ord_storehash;
103         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_storehash>> CuckooRefinableSet_list_ord_storehash;
104
105
106         struct traits_CuckooSet_vector_unord :
107             public cc::cuckoo::make_traits <
108                 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
109                 , co::equal_to< equal_to >
110                 , co::hash< std::tuple< hash, hash2 > >
111             > ::type
112         {};
113         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord>> CuckooStripedSet_vector_unord;
114         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord>> CuckooRefinableSet_vector_unord;
115
116         struct traits_CuckooSet_vector_unord_stat : public traits_CuckooSet_vector_unord
117         {
118             typedef cc::cuckoo::stat stat;
119         };
120         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_stat>> CuckooStripedSet_vector_unord_stat;
121         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_stat>> CuckooRefinableSet_vector_unord_stat;
122
123         struct traits_CuckooSet_vector_unord_storehash : public traits_CuckooSet_vector_unord
124         {
125             static CDS_CONSTEXPR const bool store_hash = true;
126         };
127         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_storehash>> CuckooStripedSet_vector_unord_storehash;
128         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_storehash>> CuckooRefinableSet_vector_unord_storehash;
129
130         struct traits_CuckooSet_vector_ord :
131             public cc::cuckoo::make_traits <
132                 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
133                 , co::compare< compare >
134                 , co::hash< std::tuple< hash, hash2 > >
135             > ::type
136         {};
137         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord>> CuckooStripedSet_vector_ord;
138         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord>> CuckooRefinableSet_vector_ord;
139
140         struct traits_CuckooSet_vector_ord_stat : public traits_CuckooSet_vector_ord
141         {
142             typedef cc::cuckoo::stat stat;
143         };
144         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_stat>> CuckooStripedSet_vector_ord_stat;
145         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_stat>> CuckooRefinableSet_vector_ord_stat;
146
147         struct traits_CuckooSet_vector_ord_storehash : public traits_CuckooSet_vector_ord
148         {
149             static CDS_CONSTEXPR const bool store_hash = true;
150         };
151         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_storehash>> CuckooStripedSet_vector_ord_storehash;
152         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_storehash>> CuckooRefinableSet_vector_ord_storehash;
153
154     };
155
156     template <typename T, typename Traits >
157     static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
158     {
159         CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
160     }
161
162     template <typename V, typename Traits>
163     static inline void print_stat( CuckooSet< V, Traits > const& s )
164     {
165         typedef CuckooSet< V, Traits > set_type;
166         print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
167     }
168
169 } // namespace set2
170
171 #endif // #ifndef CDSUNIT_SET_TYPE_CUCKOO_H