3 #ifndef CDSUNIT_SET_TYPE_STRIPED_H
4 #define CDSUNIT_SET_TYPE_STRIPED_H
6 #include "set2/set_type.h"
8 #include <cds/container/striped_set/std_list.h>
9 #include <cds/container/striped_set/std_vector.h>
10 #include <cds/container/striped_set/std_set.h>
11 #include <cds/container/striped_set/std_hash_set.h>
12 #include <cds/container/striped_set/boost_unordered_set.h>
14 #include <boost/version.hpp>
15 #if BOOST_VERSION >= 104800
16 # include <cds/container/striped_set/boost_slist.h>
17 # include <cds/container/striped_set/boost_list.h>
18 # include <cds/container/striped_set/boost_vector.h>
19 # include <cds/container/striped_set/boost_stable_vector.h>
20 # include <cds/container/striped_set/boost_set.h>
21 # include <cds/container/striped_set/boost_flat_set.h>
23 #include <cds/container/striped_set.h>
27 template <typename Key, typename Val>
28 struct set_type< cc::striped_set::implementation_tag, Key, Val >: public set_type_base< Key, Val >
30 typedef set_type_base< Key, Val > base_class;
31 typedef typename base_class::key_val key_val;
32 typedef typename base_class::compare compare;
33 typedef typename base_class::less less;
34 typedef typename base_class::equal_to equal_to;
35 typedef typename base_class::hash hash;
36 typedef typename base_class::hash2 hash2;
39 // ***************************************************************************
42 // for sequential containers
43 template <class BucketEntry, typename... Options>
44 class StripedHashSet_seq:
45 public cc::StripedSet< BucketEntry,
46 co::mutex_policy< cc::striped_set::striping<> >
47 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
51 typedef cc::StripedSet< BucketEntry,
52 co::mutex_policy< cc::striped_set::striping<> >
53 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
56 typedef typename base_class::resizing_policy resizing_policy_t;
58 resizing_policy_t m_placeHolder;
60 StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
61 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
64 template <typename Q, typename Less>
65 bool erase_with( Q const& v, Less /*pred*/ )
67 return base_class::erase( v );
71 template <class BucketEntry, typename... Options>
72 class StripedHashSet_seq_rational:
73 public cc::StripedSet< BucketEntry,
74 co::mutex_policy< cc::striped_set::striping<> >
75 ,co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
79 typedef cc::StripedSet< BucketEntry,
80 co::mutex_policy< cc::striped_set::striping<> >
81 ,co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
84 typedef typename base_class::resizing_policy resizing_policy_t;
86 resizing_policy_t m_placeHolder;
88 StripedHashSet_seq_rational( size_t nCapacity, size_t nDenominator ) // LoadFactor = 1 / nDenominator
89 : base_class( nCapacity * nDenominator / 16, *(new(&m_placeHolder) resizing_policy_t( 1, nDenominator )) )
92 template <typename Q, typename Less>
93 bool erase_with( Q const& v, Less /*pred*/ )
95 return base_class::erase( v );
99 // for non-sequential ordered containers
100 template <class BucketEntry, typename... Options>
101 class StripedHashSet_ord:
102 public cc::StripedSet< BucketEntry,
103 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
104 ,co::mutex_policy< cc::striped_set::striping<> >
108 typedef cc::StripedSet< BucketEntry,
109 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
110 ,co::mutex_policy< cc::striped_set::striping<> >
113 typedef typename base_class::resizing_policy resizing_policy_t;
115 resizing_policy_t m_placeHolder;
117 StripedHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
118 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
121 template <typename Q, typename Less>
122 bool erase_with( Q const& v, Less /*pred*/ )
124 return base_class::erase( v );
128 template <class BucketEntry, typename... Options>
129 class StripedHashSet_ord_rational:
130 public cc::StripedSet< BucketEntry,
131 co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
132 ,co::mutex_policy< cc::striped_set::striping<> >
136 typedef cc::StripedSet< BucketEntry,
137 co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
138 ,co::mutex_policy< cc::striped_set::striping<> >
141 typedef typename base_class::resizing_policy resizing_policy_t;
143 resizing_policy_t m_placeHolder;
145 StripedHashSet_ord_rational( size_t /*nCapacity*/, size_t nDenominator ) // LoadFactor = 1 / nDenominator
146 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( 1024, nDenominator )) )
149 template <typename Q, typename Less>
150 bool erase_with( Q const& v, Less /*pred*/ )
152 return base_class::erase( v );
156 typedef StripedHashSet_seq<
162 typedef StripedHashSet_seq_rational<
166 > StripedSet_rational_list;
168 typedef StripedHashSet_seq<
169 std::vector< key_val >
174 typedef StripedHashSet_seq_rational<
175 std::vector< key_val >
178 > StripedSet_rational_vector;
180 #if BOOST_VERSION >= 104800
181 typedef StripedHashSet_seq<
182 boost::container::slist< key_val >
185 > StripedSet_boost_slist;
187 typedef StripedHashSet_seq_rational<
188 boost::container::slist< key_val >
191 > StripedSet_rational_boost_slist;
193 typedef StripedHashSet_seq<
194 boost::container::list< key_val >
197 > StripedSet_boost_list;
199 typedef StripedHashSet_seq_rational<
200 boost::container::list< key_val >
203 > StripedSet_rational_boost_list;
205 typedef StripedHashSet_seq<
206 boost::container::vector< key_val >
209 > StripedSet_boost_vector;
211 typedef StripedHashSet_seq_rational<
212 boost::container::vector< key_val >
215 > StripedSet_rational_boost_vector;
217 typedef StripedHashSet_seq<
218 boost::container::stable_vector< key_val >
221 > StripedSet_boost_stable_vector;
223 typedef StripedHashSet_seq_rational<
224 boost::container::stable_vector< key_val >
227 > StripedSet_rational_boost_stable_vector;
230 typedef StripedHashSet_ord<
231 std::set< key_val, less >
235 typedef StripedHashSet_ord_rational<
236 std::set< key_val, less >
238 > StripedSet_rational_set;
240 typedef StripedHashSet_ord<
241 std::unordered_set< key_val, hash, equal_to >
243 > StripedSet_hashset;
245 typedef StripedHashSet_ord_rational<
246 std::unordered_set< key_val, hash, equal_to >
248 > StripedSet_rational_hashset;
250 #if BOOST_VERSION >= 104800
251 typedef StripedHashSet_ord<
252 boost::container::set< key_val, less >
254 > StripedSet_boost_set;
256 typedef StripedHashSet_ord_rational<
257 boost::container::set< key_val, less >
259 > StripedSet_rational_boost_set;
261 typedef StripedHashSet_ord<
262 boost::container::flat_set< key_val, less >
264 > StripedSet_boost_flat_set;
266 typedef StripedHashSet_ord_rational<
267 boost::container::flat_set< key_val, less >
269 > StripedSet_rational_boost_flat_set;
272 typedef StripedHashSet_ord<
273 boost::unordered_set< key_val, hash, equal_to >
275 > StripedSet_boost_unordered_set;
277 typedef StripedHashSet_ord_rational<
278 boost::unordered_set< key_val, hash, equal_to >
280 > StripedSet_rational_boost_unordered_set;
283 // ***************************************************************************
286 // for sequential containers
287 template <class BucketEntry, typename... Options>
288 class RefinableHashSet_seq:
289 public cc::StripedSet< BucketEntry,
290 co::mutex_policy< cc::striped_set::refinable<> >
291 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
295 typedef cc::StripedSet< BucketEntry,
296 co::mutex_policy< cc::striped_set::refinable<> >
297 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
300 typedef typename base_class::resizing_policy resizing_policy_t;
302 resizing_policy_t m_placeHolder;
304 RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
305 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
308 template <typename Q, typename Less>
309 bool erase_with( Q const& v, Less /*pred*/ )
311 return base_class::erase( v );
315 template <class BucketEntry, typename... Options>
316 class RefinableHashSet_seq_rational:
317 public cc::StripedSet< BucketEntry,
318 co::mutex_policy< cc::striped_set::refinable<> >
319 ,co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
323 typedef cc::StripedSet< BucketEntry,
324 co::mutex_policy< cc::striped_set::refinable<> >
325 ,co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
328 typedef typename base_class::resizing_policy resizing_policy_t;
330 resizing_policy_t m_placeHolder;
332 RefinableHashSet_seq_rational( size_t nCapacity, size_t nDenominator ) // LoadFactor = 1 / nDenominator
333 : base_class( nCapacity * nDenominator / 16, *(new(&m_placeHolder) resizing_policy_t( 1, nDenominator )) )
336 template <typename Q, typename Less>
337 bool erase_with( Q const& v, Less /*pred*/ )
339 return base_class::erase( v );
343 // for non-sequential ordered containers
344 template <class BucketEntry, typename... Options>
345 class RefinableHashSet_ord:
346 public cc::StripedSet< BucketEntry,
347 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
348 ,co::mutex_policy< cc::striped_set::refinable<> >
352 typedef cc::StripedSet< BucketEntry,
353 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
354 ,co::mutex_policy< cc::striped_set::refinable<> >
357 typedef typename base_class::resizing_policy resizing_policy_t;
359 resizing_policy_t m_placeHolder;
361 RefinableHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
362 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
365 template <typename Q, typename Less>
366 bool erase_with( Q const& v, Less /*pred*/ )
368 return base_class::erase( v );
372 template <class BucketEntry, typename... Options>
373 class RefinableHashSet_ord_rational:
374 public cc::StripedSet< BucketEntry,
375 co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
376 ,co::mutex_policy< cc::striped_set::refinable<> >
380 typedef cc::StripedSet< BucketEntry,
381 co::resizing_policy<cc::striped_set::rational_load_factor_resizing<0> >
382 ,co::mutex_policy< cc::striped_set::refinable<> >
385 typedef typename base_class::resizing_policy resizing_policy_t;
387 resizing_policy_t m_placeHolder;
389 RefinableHashSet_ord_rational( size_t /*nCapacity*/, size_t nDenominator ) // LoadFactor = 1 / nDenominator
390 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( 1024, nDenominator )) )
393 template <typename Q, typename Less>
394 bool erase_with( Q const& v, Less /*pred*/ )
396 return base_class::erase( v );
400 typedef RefinableHashSet_seq<
406 typedef RefinableHashSet_seq_rational<
410 > RefinableSet_rational_list;
412 typedef RefinableHashSet_seq<
413 std::vector< key_val >
416 > RefinableSet_vector;
418 typedef RefinableHashSet_seq_rational<
419 std::vector< key_val >
422 > RefinableSet_rational_vector;
424 #if BOOST_VERSION >= 104800
425 typedef RefinableHashSet_seq<
426 boost::container::slist< key_val >
429 > RefinableSet_boost_slist;
431 typedef RefinableHashSet_seq_rational<
432 boost::container::slist< key_val >
435 > RefinableSet_rational_boost_slist;
437 typedef RefinableHashSet_seq<
438 boost::container::list< key_val >
441 > RefinableSet_boost_list;
443 typedef RefinableHashSet_seq_rational<
444 boost::container::list< key_val >
447 > RefinableSet_rational_boost_list;
449 typedef RefinableHashSet_seq<
450 boost::container::vector< key_val >
453 > RefinableSet_boost_vector;
455 typedef RefinableHashSet_seq_rational<
456 boost::container::vector< key_val >
459 > RefinableSet_rational_boost_vector;
461 typedef RefinableHashSet_seq<
462 boost::container::stable_vector< key_val >
465 > RefinableSet_boost_stable_vector;
467 typedef RefinableHashSet_seq_rational<
468 boost::container::stable_vector< key_val >
471 > RefinableSet_rational_boost_stable_vector;
474 typedef RefinableHashSet_ord<
475 std::set< key_val, less >
479 typedef RefinableHashSet_ord_rational<
480 std::set< key_val, less >
482 > RefinableSet_rational_set;
484 typedef RefinableHashSet_ord<
485 std::unordered_set< key_val, hash, equal_to >
487 > RefinableSet_hashset;
489 typedef RefinableHashSet_ord_rational<
490 std::unordered_set< key_val, hash, equal_to >
492 > RefinableSet_rational_hashset;
494 #if BOOST_VERSION >= 104800
495 typedef RefinableHashSet_ord<
496 boost::container::set< key_val, less >
498 > RefinableSet_boost_set;
500 typedef RefinableHashSet_ord_rational<
501 boost::container::set< key_val, less >
503 > RefinableSet_rational_boost_set;
505 typedef RefinableHashSet_ord<
506 boost::container::flat_set< key_val, less >
508 > RefinableSet_boost_flat_set;
510 typedef RefinableHashSet_ord_rational<
511 boost::container::flat_set< key_val, less >
513 > RefinableSet_rational_boost_flat_set;
516 typedef RefinableHashSet_ord<
517 boost::unordered_set< key_val, hash, equal_to >
519 > RefinableSet_boost_unordered_set;
521 typedef RefinableHashSet_ord_rational<
522 boost::unordered_set< key_val, hash, equal_to >
524 > RefinableSet_rational_boost_unordered_set;
529 #endif // #ifndef CDSUNIT_SET_TYPE_STRIPED_H