3 #ifndef CDSUNIT_SET_TYPES_H
4 #define CDSUNIT_SET_TYPES_H
6 #include <cds/urcu/general_instant.h>
7 #include <cds/urcu/general_buffered.h>
8 #include <cds/urcu/general_threaded.h>
9 #include <cds/urcu/signal_buffered.h>
10 #include <cds/urcu/signal_threaded.h>
12 #include <cds/container/michael_list_hp.h>
13 #include <cds/container/michael_list_dhp.h>
14 #include <cds/container/michael_list_rcu.h>
15 #include <cds/container/lazy_list_hp.h>
16 #include <cds/container/lazy_list_dhp.h>
17 #include <cds/container/lazy_list_rcu.h>
19 #include <cds/container/michael_set.h>
20 #include <cds/container/michael_set_rcu.h>
22 #include <cds/container/split_list_set.h>
23 #include <cds/container/split_list_set_rcu.h>
25 #include <cds/container/cuckoo_set.h>
27 #include <cds/container/skip_list_set_hp.h>
28 #include <cds/container/skip_list_set_dhp.h>
29 #include <cds/container/skip_list_set_rcu.h>
31 #include <cds/container/ellen_bintree_set_rcu.h>
32 #include <cds/container/ellen_bintree_set_hp.h>
33 #include <cds/container/ellen_bintree_set_dhp.h>
35 #include <cds/container/striped_set/std_list.h>
36 #include <cds/container/striped_set/std_vector.h>
37 #include <cds/container/striped_set/std_set.h>
38 #include <cds/container/striped_set/std_hash_set.h>
39 #include <cds/container/striped_set/boost_unordered_set.h>
41 #include <boost/version.hpp>
42 #if BOOST_VERSION >= 104800
43 # include <cds/container/striped_set/boost_slist.h>
44 # include <cds/container/striped_set/boost_list.h>
45 # include <cds/container/striped_set/boost_vector.h>
46 # include <cds/container/striped_set/boost_stable_vector.h>
47 # include <cds/container/striped_set/boost_set.h>
48 # include <cds/container/striped_set/boost_flat_set.h>
50 #include <cds/container/striped_set.h>
52 #include <cds/sync/spinlock.h>
53 #include <boost/functional/hash/hash.hpp>
55 #include "cppunit/cppunit_mini.h"
56 #include "lock/nolock.h"
57 #include "set2/std_set.h"
58 #include "set2/std_hash_set.h"
59 #include "michael_alloc.h"
60 #include "print_cuckoo_stat.h"
61 #include "print_split_list_stat.h"
62 #include "print_skip_list_stat.h"
63 #include "print_ellenbintree_stat.h"
64 #include "ellen_bintree_update_desc_pool.h"
67 namespace cc = cds::container;
68 namespace co = cds::opt;
70 typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_gpi;
71 typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_gpb;
72 typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_gpt;
73 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
74 typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_shb;
75 typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_sht;
78 template <typename V, typename Traits>
79 class CuckooSet : public cc::CuckooSet< V, Traits >
82 typedef cc::CuckooSet< V, Traits > cuckoo_base_class;
85 CuckooSet( size_t nCapacity, size_t nLoadFactor )
86 : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int)4 )
89 template <typename Q, typename Pred>
90 bool erase_with( Q const& key, Pred /*pred*/ )
92 return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
96 template <typename Key>
98 int operator ()(Key const& k1, Key const& k2) const
100 if ( std::less<Key>( k1, k2 ) )
102 return std::less<Key>( k2, k1 ) ? 1 : 0;
106 #define CDSUNIT_INT_COMPARE(t) template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
107 CDSUNIT_INT_COMPARE(char);
108 CDSUNIT_INT_COMPARE(unsigned char);
109 CDSUNIT_INT_COMPARE(int);
110 CDSUNIT_INT_COMPARE(unsigned int);
111 CDSUNIT_INT_COMPARE(long);
112 CDSUNIT_INT_COMPARE(unsigned long);
113 CDSUNIT_INT_COMPARE(long long);
114 CDSUNIT_INT_COMPARE(unsigned long long);
115 #undef CDSUNIT_INT_COMPARE
118 struct cmp<std::string>
120 int operator()(std::string const& s1, std::string const& s2)
122 return s1.compare( s2 );
124 int operator()(std::string const& s1, char const * s2)
126 return s1.compare( s2 );
128 int operator()(char const * s1, std::string const& s2)
130 return -s2.compare( s1 );
134 template <typename Key, typename Value>
137 typedef Key key_type;
138 typedef Value value_type;
144 /*explicit*/ key_val( key_type const& k ): key(k), val() {}
145 key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
147 template <typename K>
148 /*explicit*/ key_val( K const& k ): key(k) {}
150 template <typename K, typename T>
151 key_val( K const& k, T const& v ): key(k), val(v) {}
154 typedef co::v::hash<key_type> key_hash;
155 typedef std::less<key_type> key_less;
156 typedef cmp<key_type> key_compare;
159 bool operator()( key_val const& k1, key_val const& k2 ) const
161 return key_less()( k1.key, k2.key );
163 bool operator()( key_type const& k1, key_val const& k2 ) const
165 return key_less()( k1, k2.key );
167 bool operator()( key_val const& k1, key_type const& k2 ) const
169 return key_less()( k1.key, k2 );
174 int operator()( key_val const& k1, key_val const& k2 ) const
176 return key_compare()( k1.key, k2.key );
178 int operator()( key_type const& k1, key_val const& k2 ) const
180 return key_compare()( k1, k2.key );
182 int operator()( key_val const& k1, key_type const& k2 ) const
184 return key_compare()( k1.key, k2 );
189 bool operator()( key_val const& k1, key_val const& k2 ) const
191 return key_compare()( k1.key, k2.key ) == 0;
193 bool operator()( key_type const& k1, key_val const& k2 ) const
195 return key_compare()( k1, k2.key ) == 0;
197 bool operator()( key_val const& k1, key_type const& k2 ) const
199 return key_compare()( k1.key, k2 ) == 0;
204 struct hash: public key_hash
206 size_t operator()( key_val const& v ) const
208 return key_hash::operator()( v.key );
210 size_t operator()( key_type const& key ) const
212 return key_hash::operator()( key );
214 template <typename Q>
215 size_t operator()( Q const& k ) const
217 return key_hash::operator()( k );
221 struct hash2: public hash
223 size_t operator()( key_val const& k ) const
225 size_t seed = ~hash::operator ()( k );
226 boost::hash_combine( seed, k.key );
229 size_t operator()( key_type const& k ) const
231 size_t seed = ~hash::operator ()( k );
232 boost::hash_combine( seed, k );
235 template <typename Q>
236 size_t operator()( Q const& k ) const
238 return key_hash::operator()( k );
242 // ***************************************************************************
245 struct traits_MichaelList_cmp_stdAlloc:
246 public cc::michael_list::make_traits<
247 co::compare< compare >
250 typedef cc::MichaelList< cds::gc::HP, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
251 typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
252 typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
253 typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
254 typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
255 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
256 typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
257 typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
260 struct traits_MichaelList_cmp_stdAlloc_seqcst : public traits_MichaelList_cmp_stdAlloc
262 typedef co::v::sequential_consistent memory_model;
264 typedef cc::MichaelList< cds::gc::HP, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
265 typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
266 typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
267 typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
268 typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
269 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
270 typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
271 typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
274 struct traits_MichaelList_less_stdAlloc :
275 public cc::michael_list::make_traits<
279 typedef cc::MichaelList< cds::gc::HP, key_val, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
280 typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
281 typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
282 typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
283 typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
284 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
285 typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
286 typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
289 struct traits_MichaelList_less_stdAlloc_seqcst :
290 public cc::michael_list::make_traits<
292 ,co::memory_model< co::v::sequential_consistent >
295 typedef cc::MichaelList< cds::gc::HP, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
296 typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
297 typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
298 typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
299 typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
300 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
301 typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
302 typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
305 struct traits_MichaelList_cmp_michaelAlloc :
306 public cc::michael_list::make_traits<
307 co::compare< compare >,
308 co::allocator< memory::MichaelAllocator<int> >
311 typedef cc::MichaelList< cds::gc::HP, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
312 typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
313 typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
314 typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
315 typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
316 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
317 typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
318 typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
321 struct traits_MichaelList_less_michaelAlloc :
322 public cc::michael_list::make_traits<
324 co::allocator< memory::MichaelAllocator<int> >
327 typedef cc::MichaelList< cds::gc::HP, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
328 typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
329 typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
330 typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
331 typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
332 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
333 typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
334 typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
337 // ***************************************************************************
338 // MichaelHashSet based on MichaelList
340 struct traits_MichaelSet_stdAlloc :
341 public cc::michael_set::make_traits<
345 typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_HP_cmp_stdAlloc;
346 typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_cmp_stdAlloc;
347 typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_cmp_stdAlloc;
348 typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_cmp_stdAlloc;
349 typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_cmp_stdAlloc;
350 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
351 typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_cmp_stdAlloc;
352 typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_cmp_stdAlloc;
355 typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc;
356 typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc;
357 typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc;
358 typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc;
359 typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc;
360 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
361 typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc;
362 typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc;
365 typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc_seqcst;
366 typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc_seqcst;
367 typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc_seqcst;
368 typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc_seqcst;
369 typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc_seqcst;
370 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
371 typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc_seqcst;
372 typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc_seqcst;
375 struct traits_MichaelSet_michaelAlloc :
376 public cc::michael_set::make_traits<
378 co::allocator< memory::MichaelAllocator<int> >
381 typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_HP_cmp_michaelAlloc;
382 typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_cmp_michaelAlloc;
383 typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_cmp_michaelAlloc;
384 typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_cmp_michaelAlloc;
385 typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_cmp_michaelAlloc;
386 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
387 typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_cmp_michaelAlloc;
388 typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_cmp_michaelAlloc;
391 typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_HP_less_michaelAlloc;
392 typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_less_michaelAlloc;
393 typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_less_michaelAlloc;
394 typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_less_michaelAlloc;
395 typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_less_michaelAlloc;
396 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
397 typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_less_michaelAlloc;
398 typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_less_michaelAlloc;
402 // ***************************************************************************
405 struct traits_LazyList_cmp_stdAlloc :
406 public cc::lazy_list::make_traits<
407 co::compare< compare >
410 typedef cc::LazyList< cds::gc::HP, key_val, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
411 typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
412 typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
413 typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
414 typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
415 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
416 typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
417 typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
419 struct traits_LazyList_cmp_stdAlloc_seqcst :
420 public cc::lazy_list::make_traits<
421 co::compare< compare >
422 ,co::memory_model< co::v::sequential_consistent >
425 typedef cc::LazyList< cds::gc::HP, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
426 typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
427 typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
428 typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
429 typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
430 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
431 typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
432 typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
434 struct traits_LazyList_cmp_michaelAlloc :
435 public cc::lazy_list::make_traits<
436 co::compare< compare >,
437 co::allocator< memory::MichaelAllocator<int> >
440 typedef cc::LazyList< cds::gc::HP, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
441 typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
442 typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
443 typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
444 typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
445 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
446 typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
447 typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
450 struct traits_LazyList_less_stdAlloc:
451 public cc::lazy_list::make_traits<
455 typedef cc::LazyList< cds::gc::HP, key_val, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
456 typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
457 typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
458 typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
459 typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
460 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
461 typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
462 typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
465 struct traits_LazyList_less_stdAlloc_seqcst :
466 public cc::lazy_list::make_traits<
468 ,co::memory_model< co::v::sequential_consistent >
471 typedef cc::LazyList< cds::gc::HP, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
472 typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
473 typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
474 typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
475 typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
476 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
477 typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
478 typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
481 struct traits_LazyList_less_michaelAlloc :
482 public cc::lazy_list::make_traits<
484 co::allocator< memory::MichaelAllocator<int> >
487 typedef cc::LazyList< cds::gc::HP, key_val, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
488 typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
489 typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
490 typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
491 typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
492 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
493 typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
494 typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
497 // ***************************************************************************
498 // MichaelHashSet based on LazyList
500 typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_cmp_stdAlloc;
501 typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_cmp_stdAlloc;
502 typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc;
503 typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc;
504 typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc;
505 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
506 typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc;
507 typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc;
510 typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc;
511 typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc;
512 typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc;
513 typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc;
514 typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc;
515 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
516 typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc;
517 typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc;
520 typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc_seqcst;
521 typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc_seqcst;
522 typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc_seqcst;
523 typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc_seqcst;
524 typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc_seqcst;
525 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
526 typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc_seqcst;
527 typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc_seqcst;
530 typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_cmp_michaelAlloc;
531 typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_cmp_michaelAlloc;
532 typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_cmp_michaelAlloc;
533 typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_cmp_michaelAlloc;
534 typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_cmp_michaelAlloc;
535 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
536 typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_cmp_michaelAlloc;
537 typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_cmp_michaelAlloc;
540 typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_less_michaelAlloc;
541 typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_less_michaelAlloc;
542 typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_less_michaelAlloc;
543 typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_less_michaelAlloc;
544 typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_less_michaelAlloc;
545 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
546 typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_less_michaelAlloc;
547 typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_less_michaelAlloc;
550 // ***************************************************************************
551 // SplitListSet based on MichaelList
553 struct traits_SplitList_Michael_dyn_cmp :
554 public cc::split_list::make_traits<
555 cc::split_list::ordered_list<cc::michael_list_tag>
557 ,cc::split_list::ordered_list_traits<
558 typename cc::michael_list::make_traits<
559 co::compare< compare >
564 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
565 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
566 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
567 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
568 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
569 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
570 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
571 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
574 struct traits_SplitList_Michael_dyn_cmp_stat :
575 public cc::split_list::make_traits<
576 cc::split_list::ordered_list<cc::michael_list_tag>
578 ,co::stat< cc::split_list::stat<> >
579 ,cc::split_list::ordered_list_traits<
580 typename cc::michael_list::make_traits<
581 co::compare< compare >
586 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
587 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
588 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
589 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
590 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
591 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
592 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
593 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
596 struct traits_SplitList_Michael_dyn_cmp_seqcst :
597 public cc::split_list::make_traits<
598 cc::split_list::ordered_list<cc::michael_list_tag>
600 ,co::memory_model< co::v::sequential_consistent >
601 ,cc::split_list::ordered_list_traits<
602 typename cc::michael_list::make_traits<
603 co::compare< compare >
604 ,co::memory_model< co::v::sequential_consistent >
609 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
610 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
611 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
612 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
613 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
614 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
615 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
616 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
619 struct traits_SplitList_Michael_st_cmp :
620 public cc::split_list::make_traits<
621 cc::split_list::ordered_list<cc::michael_list_tag>
622 ,cc::split_list::dynamic_bucket_table< false >
624 ,cc::split_list::ordered_list_traits<
625 typename cc::michael_list::make_traits<
626 co::compare< compare >
631 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
632 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
633 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
634 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
635 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
636 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
637 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
638 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
641 struct traits_SplitList_Michael_st_cmp_seqcst :
642 public cc::split_list::make_traits<
643 cc::split_list::ordered_list<cc::michael_list_tag>
645 ,cc::split_list::dynamic_bucket_table< false >
646 ,co::memory_model< co::v::sequential_consistent >
647 ,cc::split_list::ordered_list_traits<
648 typename cc::michael_list::make_traits<
649 co::compare< compare >
650 ,co::memory_model< co::v::sequential_consistent >
655 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_HP_st_cmp_seqcst;
656 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_DHP_st_cmp_seqcst;
657 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPI_st_cmp_seqcst;
658 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPB_st_cmp_seqcst;
659 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPT_st_cmp_seqcst;
660 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
661 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHB_st_cmp_seqcst;
662 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHT_st_cmp_seqcst;
666 struct traits_SplitList_Michael_dyn_less :
667 public cc::split_list::make_traits<
668 cc::split_list::ordered_list<cc::michael_list_tag>
670 ,cc::split_list::ordered_list_traits<
671 typename cc::michael_list::make_traits<
677 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
678 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
679 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
680 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
681 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
682 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
683 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
684 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
687 struct traits_SplitList_Michael_dyn_less_seqcst :
688 public cc::split_list::make_traits<
689 cc::split_list::ordered_list<cc::michael_list_tag>
691 ,co::memory_model< co::v::sequential_consistent >
692 ,cc::split_list::ordered_list_traits<
693 typename cc::michael_list::make_traits<
695 ,co::memory_model< co::v::sequential_consistent >
700 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
701 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
702 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
703 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
704 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
705 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
706 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
707 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
710 struct traits_SplitList_Michael_st_less :
711 public cc::split_list::make_traits<
712 cc::split_list::ordered_list<cc::michael_list_tag>
713 ,cc::split_list::dynamic_bucket_table< false >
715 ,cc::split_list::ordered_list_traits<
716 typename cc::michael_list::make_traits<
722 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
723 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
724 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
725 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
726 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
727 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
728 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
729 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
732 struct traits_SplitList_Michael_st_less_stat :
733 public cc::split_list::make_traits<
734 cc::split_list::ordered_list<cc::michael_list_tag>
735 ,cc::split_list::dynamic_bucket_table< false >
737 ,co::stat< cc::split_list::stat<>>
738 ,cc::split_list::ordered_list_traits<
739 typename cc::michael_list::make_traits<
745 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
746 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
747 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
748 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
749 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
750 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
751 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
752 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
755 struct traits_SplitList_Michael_st_less_seqcst :
756 public cc::split_list::make_traits<
757 cc::split_list::ordered_list<cc::michael_list_tag>
759 ,cc::split_list::dynamic_bucket_table< false >
760 ,co::memory_model< co::v::sequential_consistent >
761 ,cc::split_list::ordered_list_traits<
762 typename cc::michael_list::make_traits<
764 ,co::memory_model< co::v::sequential_consistent >
769 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
770 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
771 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
772 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
773 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
774 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
775 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
776 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
779 // ***************************************************************************
780 // SplitListSet based on LazyList
782 struct traits_SplitList_Lazy_dyn_cmp :
783 public cc::split_list::make_traits<
784 cc::split_list::ordered_list<cc::lazy_list_tag>
786 ,cc::split_list::ordered_list_traits<
787 typename cc::lazy_list::make_traits<
788 co::compare< compare >
793 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
794 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
795 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
796 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
797 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
798 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
799 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
800 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
803 struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
805 typedef cc::split_list::stat<> stat;
807 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
808 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
809 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
810 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
811 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
812 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
813 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
814 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
817 struct traits_SplitList_Lazy_dyn_cmp_seqcst :
818 public cc::split_list::make_traits<
819 cc::split_list::ordered_list<cc::lazy_list_tag>
821 ,co::memory_model< co::v::sequential_consistent >
822 ,cc::split_list::ordered_list_traits<
823 typename cc::lazy_list::make_traits<
824 co::compare< compare >
825 ,co::memory_model< co::v::sequential_consistent >
830 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
831 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
832 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
833 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
834 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
835 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
836 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
837 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
840 struct traits_SplitList_Lazy_st_cmp :
841 public cc::split_list::make_traits<
842 cc::split_list::ordered_list<cc::lazy_list_tag>
843 ,cc::split_list::dynamic_bucket_table< false >
845 ,cc::split_list::ordered_list_traits<
846 typename cc::lazy_list::make_traits<
847 co::compare< compare >
852 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
853 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
854 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
855 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
856 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
857 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
858 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
859 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
862 struct traits_SplitList_Lazy_st_cmp_seqcst :
863 public cc::split_list::make_traits<
864 cc::split_list::ordered_list<cc::lazy_list_tag>
866 ,cc::split_list::dynamic_bucket_table< false >
867 ,co::memory_model< co::v::sequential_consistent >
868 ,cc::split_list::ordered_list_traits<
869 typename cc::lazy_list::make_traits<
870 co::compare< compare >
871 ,co::memory_model< co::v::sequential_consistent >
876 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_HP_st_cmp_seqcst;
877 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_DHP_st_cmp_seqcst;
878 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
879 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
880 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
881 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
882 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
883 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
886 struct traits_SplitList_Lazy_dyn_less :
887 public cc::split_list::make_traits<
888 cc::split_list::ordered_list<cc::lazy_list_tag>
890 ,cc::split_list::ordered_list_traits<
891 typename cc::lazy_list::make_traits<
897 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
898 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
899 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
900 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
901 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
902 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
903 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
904 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
907 struct traits_SplitList_Lazy_dyn_less_seqcst :
908 public cc::split_list::make_traits<
909 cc::split_list::ordered_list<cc::lazy_list_tag>
911 ,co::memory_model< co::v::sequential_consistent >
912 ,cc::split_list::ordered_list_traits<
913 typename cc::lazy_list::make_traits<
915 ,co::memory_model< co::v::sequential_consistent >
920 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
921 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
922 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
923 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
924 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
925 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
926 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
927 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
930 struct traits_SplitList_Lazy_st_less :
931 public cc::split_list::make_traits<
932 cc::split_list::ordered_list<cc::lazy_list_tag>
933 ,cc::split_list::dynamic_bucket_table< false >
935 ,cc::split_list::ordered_list_traits<
936 typename cc::lazy_list::make_traits<
942 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
943 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
944 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
945 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
946 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
947 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
948 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
949 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
952 struct traits_SplitList_Lazy_st_less_seqcst :
953 public cc::split_list::make_traits<
954 cc::split_list::ordered_list<cc::lazy_list_tag>
956 ,cc::split_list::dynamic_bucket_table< false >
957 ,co::memory_model< co::v::sequential_consistent >
958 ,cc::split_list::ordered_list_traits<
959 typename cc::lazy_list::make_traits<
961 ,co::memory_model< co::v::sequential_consistent >
966 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
967 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
968 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
969 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
970 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
971 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
972 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
973 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
976 struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
978 typedef cc::split_list::stat<> stat;
980 typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
981 typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
982 typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
983 typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
984 typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
985 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
986 typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
987 typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
991 // ***************************************************************************
994 // for sequential containers
995 template <class BucketEntry, typename... Options>
996 class StripedHashSet_seq:
997 public cc::StripedSet< BucketEntry,
998 co::mutex_policy< cc::striped_set::striping<> >
999 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1003 typedef cc::StripedSet< BucketEntry,
1004 co::mutex_policy< cc::striped_set::striping<> >
1005 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1008 typedef typename base_class::resizing_policy resizing_policy_t;
1010 resizing_policy_t m_placeHolder;
1012 StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1013 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1016 template <typename Q, typename Less>
1017 bool erase_with( Q const& v, Less /*pred*/ )
1019 return base_class::erase( v );
1023 // for non-sequential ordered containers
1024 template <class BucketEntry, typename... Options>
1025 class StripedHashSet_ord:
1026 public cc::StripedSet< BucketEntry,
1027 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1028 ,co::mutex_policy< cc::striped_set::striping<> >
1032 typedef cc::StripedSet< BucketEntry,
1033 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1034 ,co::mutex_policy< cc::striped_set::striping<> >
1037 typedef typename base_class::resizing_policy resizing_policy_t;
1039 resizing_policy_t m_placeHolder;
1041 StripedHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
1042 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1045 template <typename Q, typename Less>
1046 bool erase_with( Q const& v, Less /*pred*/ )
1048 return base_class::erase( v );
1052 typedef StripedHashSet_seq<
1053 std::list< key_val >
1058 typedef StripedHashSet_seq<
1059 std::vector< key_val >
1062 > StripedSet_vector;
1064 #if BOOST_VERSION >= 104800
1065 typedef StripedHashSet_seq<
1066 boost::container::slist< key_val >
1069 > StripedSet_boost_slist;
1071 typedef StripedHashSet_seq<
1072 boost::container::list< key_val >
1075 > StripedSet_boost_list;
1077 typedef StripedHashSet_seq<
1078 boost::container::vector< key_val >
1081 > StripedSet_boost_vector;
1083 typedef StripedHashSet_seq<
1084 boost::container::stable_vector< key_val >
1087 > StripedSet_boost_stable_vector;
1090 typedef StripedHashSet_ord<
1091 std::set< key_val, less >
1095 typedef StripedHashSet_ord<
1096 std::unordered_set< key_val, hash, equal_to >
1098 > StripedSet_hashset;
1100 #if BOOST_VERSION >= 104800
1101 typedef StripedHashSet_ord<
1102 boost::container::set< key_val, less >
1104 > StripedSet_boost_set;
1106 typedef StripedHashSet_ord<
1107 boost::container::flat_set< key_val, less >
1109 > StripedSet_boost_flat_set;
1112 typedef StripedHashSet_ord<
1113 boost::unordered_set< key_val, hash, equal_to >
1115 > StripedSet_boost_unordered_set;
1119 // ***************************************************************************
1122 // for sequential containers
1123 template <class BucketEntry, typename... Options>
1124 class RefinableHashSet_seq:
1125 public cc::StripedSet< BucketEntry,
1126 co::mutex_policy< cc::striped_set::refinable<> >
1127 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1131 typedef cc::StripedSet< BucketEntry,
1132 co::mutex_policy< cc::striped_set::refinable<> >
1133 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1136 typedef typename base_class::resizing_policy resizing_policy_t;
1138 resizing_policy_t m_placeHolder;
1140 RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1141 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1144 template <typename Q, typename Less>
1145 bool erase_with( Q const& v, Less /*pred*/ )
1147 return base_class::erase( v );
1151 // for non-sequential ordered containers
1152 template <class BucketEntry, typename... Options>
1153 class RefinableHashSet_ord:
1154 public cc::StripedSet< BucketEntry,
1155 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1156 ,co::mutex_policy< cc::striped_set::refinable<> >
1160 typedef cc::StripedSet< BucketEntry,
1161 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1162 ,co::mutex_policy< cc::striped_set::refinable<> >
1165 typedef typename base_class::resizing_policy resizing_policy_t;
1167 resizing_policy_t m_placeHolder;
1169 RefinableHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
1170 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1173 template <typename Q, typename Less>
1174 bool erase_with( Q const& v, Less /*pred*/ )
1176 return base_class::erase( v );
1180 typedef RefinableHashSet_seq<
1181 std::list< key_val >
1184 > RefinableSet_list;
1186 typedef RefinableHashSet_seq<
1187 std::vector< key_val >
1190 > RefinableSet_vector;
1192 #if BOOST_VERSION >= 104800
1193 typedef RefinableHashSet_seq<
1194 boost::container::slist< key_val >
1197 > RefinableSet_boost_slist;
1199 typedef RefinableHashSet_seq<
1200 boost::container::list< key_val >
1203 > RefinableSet_boost_list;
1205 typedef RefinableHashSet_seq<
1206 boost::container::vector< key_val >
1209 > RefinableSet_boost_vector;
1211 typedef RefinableHashSet_seq<
1212 boost::container::stable_vector< key_val >
1215 > RefinableSet_boost_stable_vector;
1218 typedef RefinableHashSet_ord<
1219 std::set< key_val, less >
1223 typedef RefinableHashSet_ord<
1224 std::unordered_set< key_val, hash, equal_to >
1226 > RefinableSet_hashset;
1228 #if BOOST_VERSION >= 104800
1229 typedef RefinableHashSet_ord<
1230 boost::container::set< key_val, less >
1232 > RefinableSet_boost_set;
1234 typedef RefinableHashSet_ord<
1235 boost::container::flat_set< key_val, less >
1237 > RefinableSet_boost_flat_set;
1240 typedef RefinableHashSet_ord<
1241 boost::unordered_set< key_val, hash, equal_to >
1243 > RefinableSet_boost_unordered_set;
1245 // ***************************************************************************
1248 template <typename Traits>
1249 struct traits_CuckooStripedSet : public Traits
1251 typedef cc::cuckoo::striping<> mutex_policy;
1253 template <typename Traits>
1254 struct traits_CuckooRefinableSet : public Traits
1256 typedef cc::cuckoo::refinable<> mutex_policy;
1259 struct traits_CuckooSet_list_unord :
1260 public cc::cuckoo::make_traits <
1261 cc::cuckoo::probeset_type< cc::cuckoo::list >
1262 , co::equal_to< equal_to >
1263 , co::hash< std::tuple< hash, hash2 > >
1266 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord>> CuckooStripedSet_list_unord;
1267 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord>> CuckooRefinableSet_list_unord;
1269 struct traits_CuckooSet_list_unord_stat : public traits_CuckooSet_list_unord
1271 typedef cc::cuckoo::stat stat;
1273 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_stat>> CuckooStripedSet_list_unord_stat;
1274 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_stat>> CuckooRefinableSet_list_unord_stat;
1276 struct traits_CuckooSet_list_unord_storehash : public traits_CuckooSet_list_unord
1278 static CDS_CONSTEXPR const bool store_hash = true;
1280 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_storehash>> CuckooStripedSet_list_unord_storehash;
1281 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_storehash>> CuckooRefinableSet_list_unord_storehash;
1283 struct traits_CuckooSet_list_ord :
1284 public cc::cuckoo::make_traits <
1285 cc::cuckoo::probeset_type< cc::cuckoo::list >
1286 , co::compare< compare >
1287 , co::hash< std::tuple< hash, hash2 > >
1290 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord>> CuckooStripedSet_list_ord;
1291 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord>> CuckooRefinableSet_list_ord;
1293 struct traits_CuckooSet_list_ord_stat : public traits_CuckooSet_list_ord
1295 typedef cc::cuckoo::stat stat;
1297 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_stat>> CuckooStripedSet_list_ord_stat;
1298 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_stat>> CuckooRefinableSet_list_ord_stat;
1300 struct traits_CuckooSet_list_ord_storehash : public traits_CuckooSet_list_ord
1302 static CDS_CONSTEXPR const bool store_hash = true;
1304 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_storehash>> CuckooStripedSet_list_ord_storehash;
1305 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_storehash>> CuckooRefinableSet_list_ord_storehash;
1308 struct traits_CuckooSet_vector_unord :
1309 public cc::cuckoo::make_traits <
1310 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1311 , co::equal_to< equal_to >
1312 , co::hash< std::tuple< hash, hash2 > >
1315 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord>> CuckooStripedSet_vector_unord;
1316 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord>> CuckooRefinableSet_vector_unord;
1318 struct traits_CuckooSet_vector_unord_stat : public traits_CuckooSet_vector_unord
1320 typedef cc::cuckoo::stat stat;
1322 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_stat>> CuckooStripedSet_vector_unord_stat;
1323 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_stat>> CuckooRefinableSet_vector_unord_stat;
1325 struct traits_CuckooSet_vector_unord_storehash : public traits_CuckooSet_vector_unord
1327 static CDS_CONSTEXPR const bool store_hash = true;
1329 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_storehash>> CuckooStripedSet_vector_unord_storehash;
1330 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_storehash>> CuckooRefinableSet_vector_unord_storehash;
1332 struct traits_CuckooSet_vector_ord :
1333 public cc::cuckoo::make_traits <
1334 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1335 , co::compare< compare >
1336 , co::hash< std::tuple< hash, hash2 > >
1339 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord>> CuckooStripedSet_vector_ord;
1340 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord>> CuckooRefinableSet_vector_ord;
1342 struct traits_CuckooSet_vector_ord_stat : public traits_CuckooSet_vector_ord
1344 typedef cc::cuckoo::stat stat;
1346 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_stat>> CuckooStripedSet_vector_ord_stat;
1347 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_stat>> CuckooRefinableSet_vector_ord_stat;
1349 struct traits_CuckooSet_vector_ord_storehash : public traits_CuckooSet_vector_ord
1351 static CDS_CONSTEXPR const bool store_hash = true;
1353 typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_storehash>> CuckooStripedSet_vector_ord_storehash;
1354 typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_storehash>> CuckooRefinableSet_vector_ord_storehash;
1357 // ***************************************************************************
1360 class traits_SkipListSet_less_pascal: public cc::skip_list::make_traits <
1362 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1363 ,co::item_counter< cds::atomicity::item_counter >
1366 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal > SkipListSet_hp_less_pascal;
1367 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal > SkipListSet_dhp_less_pascal;
1368 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpi_less_pascal;
1369 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpb_less_pascal;
1370 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpt_less_pascal;
1371 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1372 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_shb_less_pascal;
1373 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_sht_less_pascal;
1376 class traits_SkipListSet_less_pascal_seqcst: public cc::skip_list::make_traits <
1378 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1379 ,co::memory_model< co::v::sequential_consistent >
1380 ,co::item_counter< cds::atomicity::item_counter >
1383 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
1384 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_dhp_less_pascal_seqcst;
1385 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
1386 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
1387 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
1388 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1389 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
1390 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
1393 class traits_SkipListSet_less_pascal_stat: public cc::skip_list::make_traits <
1395 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1396 ,co::stat< cc::skip_list::stat<> >
1397 ,co::item_counter< cds::atomicity::item_counter >
1400 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
1401 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_dhp_less_pascal_stat;
1402 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
1403 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
1404 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
1405 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1406 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
1407 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
1410 class traits_SkipListSet_cmp_pascal: public cc::skip_list::make_traits <
1411 co::compare< compare >
1412 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1413 ,co::item_counter< cds::atomicity::item_counter >
1416 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_hp_cmp_pascal;
1417 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_dhp_cmp_pascal;
1418 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
1419 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
1420 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
1421 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1422 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
1423 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
1426 class traits_SkipListSet_cmp_pascal_stat: public cc::skip_list::make_traits <
1427 co::compare< compare >
1428 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1429 ,co::stat< cc::skip_list::stat<> >
1430 ,co::item_counter< cds::atomicity::item_counter >
1433 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
1434 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_dhp_cmp_pascal_stat;
1435 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
1436 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
1437 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
1438 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1439 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
1440 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
1443 class traits_SkipListSet_less_xorshift: public cc::skip_list::make_traits <
1445 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1446 ,co::item_counter< cds::atomicity::item_counter >
1449 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_hp_less_xorshift;
1450 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_dhp_less_xorshift;
1451 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
1452 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
1453 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
1454 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1455 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
1456 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
1459 class traits_SkipListSet_less_xorshift_stat: public cc::skip_list::make_traits <
1461 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1462 ,co::stat< cc::skip_list::stat<> >
1463 ,co::item_counter< cds::atomicity::item_counter >
1466 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
1467 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_dhp_less_xorshift_stat;
1468 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
1469 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
1470 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
1471 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1472 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
1473 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
1476 class traits_SkipListSet_cmp_xorshift: public cc::skip_list::make_traits <
1477 co::compare< compare >
1478 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1479 ,co::item_counter< cds::atomicity::item_counter >
1482 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
1483 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_dhp_cmp_xorshift;
1484 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
1485 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
1486 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
1487 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1488 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
1489 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
1492 class traits_SkipListSet_cmp_xorshift_stat: public cc::skip_list::make_traits <
1493 co::compare< compare >
1494 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1495 ,co::stat< cc::skip_list::stat<> >
1496 ,co::item_counter< cds::atomicity::item_counter >
1499 typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
1500 typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_dhp_cmp_xorshift_stat;
1501 typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
1502 typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
1503 typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
1504 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1505 typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
1506 typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
1510 // ***************************************************************************
1512 struct ellen_bintree_props {
1513 struct key_extractor {
1514 void operator()( key_type& dest, key_val const& src ) const
1521 bool operator()( key_val const& v1, key_val const& v2 ) const
1523 return key_less()( v1.key, v2.key );
1525 bool operator()( key_type const& k, key_val const& v ) const
1527 return key_less()( k, v.key );
1529 bool operator()( key_val const& v, key_type const& k ) const
1531 return key_less()( v.key, k );
1533 bool operator()( key_type const& k1, key_type const& k2 ) const
1535 return key_less()( k1, k2 );
1540 typedef cc::ellen_bintree::node<cds::gc::HP, key_val> leaf_node;
1541 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1542 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1546 typedef cc::ellen_bintree::node<cds::gc::DHP, key_val> leaf_node;
1547 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1548 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1552 typedef cc::ellen_bintree::node<rcu_gpi, key_val> leaf_node;
1553 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1554 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1557 typedef cc::ellen_bintree::node<rcu_gpb, key_val> leaf_node;
1558 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1559 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1562 typedef cc::ellen_bintree::node<rcu_gpt, key_val> leaf_node;
1563 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1564 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1566 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1568 typedef cc::ellen_bintree::node<rcu_shb, key_val> leaf_node;
1569 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1570 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1573 typedef cc::ellen_bintree::node<rcu_sht, key_val> leaf_node;
1574 typedef cc::ellen_bintree::internal_node< key_type, leaf_node > internal_node;
1575 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1580 struct traits_EllenBinTreeSet: public cc::ellen_bintree::make_set_traits<
1581 cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
1582 ,co::less< typename ellen_bintree_props::less >
1583 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1587 struct traits_EllenBinTreeSet_hp : public traits_EllenBinTreeSet
1589 typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1591 typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
1593 struct traits_EllenBinTreeSet_dhp : public traits_EllenBinTreeSet
1595 typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1597 typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_dhp > EllenBinTreeSet_dhp;
1599 struct traits_EllenBinTreeSet_gpi : public traits_EllenBinTreeSet
1601 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1603 typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_gpi > EllenBinTreeSet_rcu_gpi;
1605 struct traits_EllenBinTreeSet_gpb : public traits_EllenBinTreeSet
1607 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1609 typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_gpb > EllenBinTreeSet_rcu_gpb;
1611 struct traits_EllenBinTreeSet_gpt : public traits_EllenBinTreeSet
1613 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1615 typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_gpt > EllenBinTreeSet_rcu_gpt;
1617 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1618 struct traits_EllenBinTreeSet_shb : public traits_EllenBinTreeSet
1620 typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1622 typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_shb > EllenBinTreeSet_rcu_shb;
1624 struct traits_EllenBinTreeSet_sht : public traits_EllenBinTreeSet
1626 typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1628 typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_sht > EllenBinTreeSet_rcu_sht;
1632 struct traits_EllenBinTreeSet_yield : public traits_EllenBinTreeSet
1634 typedef cds::backoff::yield back_off;
1637 struct traits_EllenBinTreeSet_yield_hp : public traits_EllenBinTreeSet_yield
1639 typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1641 typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_yield_hp > EllenBinTreeSet_yield_hp;
1643 struct traits_EllenBinTreeSet_yield_dhp : public traits_EllenBinTreeSet_yield
1645 typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1647 typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_yield_dhp > EllenBinTreeSet_yield_dhp;
1650 struct traits_EllenBinTreeSet_yield_gpb : public traits_EllenBinTreeSet_yield
1652 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1654 typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_yield_gpb > EllenBinTreeSet_yield_rcu_gpb;
1657 struct traits_EllenBinTreeSet_stat: public cc::ellen_bintree::make_set_traits<
1658 cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
1659 ,co::less< typename ellen_bintree_props::less >
1660 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1661 ,co::stat< cc::ellen_bintree::stat<> >
1665 struct traits_EllenBinTreeSet_stat_hp : public traits_EllenBinTreeSet_stat
1667 typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1669 typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_stat_hp > EllenBinTreeSet_hp_stat;
1671 struct traits_EllenBinTreeSet_stat_dhp : public traits_EllenBinTreeSet_stat
1673 typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1675 typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_stat_dhp > EllenBinTreeSet_dhp_stat;
1677 struct traits_EllenBinTreeSet_stat_gpi : public traits_EllenBinTreeSet_stat
1679 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1681 typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_stat_gpi > EllenBinTreeSet_rcu_gpi_stat;
1683 struct traits_EllenBinTreeSet_stat_gpb : public traits_EllenBinTreeSet_stat
1685 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1687 typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_stat_gpb > EllenBinTreeSet_rcu_gpb_stat;
1689 struct traits_EllenBinTreeSet_stat_gpt : public traits_EllenBinTreeSet_stat
1691 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1693 typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_stat_gpt > EllenBinTreeSet_rcu_gpt_stat;
1695 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1696 struct traits_EllenBinTreeSet_stat_shb : public traits_EllenBinTreeSet_stat
1698 typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1700 typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_stat_shb > EllenBinTreeSet_rcu_shb_stat;
1702 struct traits_EllenBinTreeSet_stat_sht : public traits_EllenBinTreeSet_stat
1704 typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1706 typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_stat_sht > EllenBinTreeSet_rcu_sht_stat;
1709 // ***************************************************************************
1710 // Standard implementations
1712 typedef StdSet< key_val, less, cds::sync::spin > StdSet_Spin;
1713 typedef StdSet< key_val, less, lock::NoLock> StdSet_NoLock;
1715 typedef StdHashSet< key_val, hash, less, equal_to, cds::sync::spin > StdHashSet_Spin;
1716 typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock > StdHashSet_NoLock;
1721 // *************************************************
1723 // *************************************************
1725 template <typename Set>
1726 static inline void print_stat( Set const& /*s*/ )
1729 template <typename GC, typename T, typename Traits>
1730 static inline void print_stat( cc::SplitListSet<GC, T, Traits> const& s )
1732 CPPUNIT_MSG( s.statistics() );
1735 template <typename GC, typename T, typename Traits>
1736 static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
1738 CPPUNIT_MSG( s.statistics() );
1741 template <typename GC, typename Key, typename T, typename Traits>
1742 static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
1744 CPPUNIT_MSG( s.statistics() );
1747 template <typename T, typename Traits >
1748 static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
1750 CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
1753 template <typename V, typename Traits>
1754 static inline void print_stat( CuckooSet< V, Traits > const& s )
1756 typedef CuckooSet< V, Traits > set_type;
1757 print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
1761 //*******************************************************
1763 //*******************************************************
1765 template <typename Set>
1766 static inline void additional_check( Set& /*set*/ )
1769 template <typename Set>
1770 static inline void additional_cleanup( Set& /*set*/ )
1773 namespace ellen_bintree_check {
1774 static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& /*s*/ )
1776 // Not true for threaded RCU
1778 CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
1779 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1780 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
1785 static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
1787 CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
1788 CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
1789 //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
1790 CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
1791 // true if RCU is not threaded
1792 //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
1794 } // namespace ellen_bintree_check
1796 template <typename GC, typename Key, typename T, typename Traits>
1797 static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
1799 GC::force_dispose();
1800 ellen_bintree_check::check_stat( s.statistics() );
1803 template <typename GC, typename Key, typename T, typename Traits>
1804 static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& /*s*/ )
1806 ellen_bintree_pool::internal_node_counter::reset();
1811 #endif // ifndef CDSUNIT_SET_TYPES_H