3 #ifndef CDSUNIT_MAP_TYPES_H
4 #define CDSUNIT_MAP_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_kvlist_hp.h>
13 #include <cds/container/michael_kvlist_dhp.h>
14 #include <cds/container/michael_kvlist_rcu.h>
15 #include <cds/container/michael_kvlist_nogc.h>
17 #include <cds/container/lazy_kvlist_hp.h>
18 #include <cds/container/lazy_kvlist_dhp.h>
19 #include <cds/container/lazy_kvlist_rcu.h>
20 #include <cds/container/lazy_kvlist_nogc.h>
22 #include <cds/container/michael_map.h>
23 #include <cds/container/michael_map_rcu.h>
24 #include <cds/container/michael_map_nogc.h>
26 #include <cds/container/split_list_map.h>
27 #include <cds/container/split_list_map_rcu.h>
28 #include <cds/container/split_list_map_nogc.h>
30 #include <cds/container/striped_map/std_list.h>
31 #include <cds/container/striped_map/std_map.h>
32 #include <cds/container/striped_map/std_hash_map.h>
33 #include <cds/container/cuckoo_map.h>
35 #include <cds/container/skip_list_map_hp.h>
36 #include <cds/container/skip_list_map_dhp.h>
37 #include <cds/container/skip_list_map_rcu.h>
38 #include <cds/container/skip_list_map_nogc.h>
40 #include <cds/container/ellen_bintree_map_rcu.h>
41 #include <cds/container/ellen_bintree_map_hp.h>
42 #include <cds/container/ellen_bintree_map_dhp.h>
44 #include <cds/sync/pool_monitor.h>
45 #include <cds/container/bronson_avltree_map_rcu.h>
47 #include <boost/version.hpp>
48 #if BOOST_VERSION >= 104800
49 # include <cds/container/striped_map/boost_list.h>
50 # include <cds/container/striped_map/boost_slist.h>
51 # include <cds/container/striped_map/boost_map.h>
52 # include <cds/container/striped_map/boost_flat_map.h>
54 #include <cds/container/striped_map/boost_unordered_map.h>
55 #include <cds/container/striped_map.h>
57 #include <cds/sync/spinlock.h>
59 #include "cppunit/cppunit_mini.h"
60 #include "lock/nolock.h"
61 #include "map2/std_map.h"
62 #include "map2/std_hash_map.h"
63 #include "michael_alloc.h"
64 #include "print_cuckoo_stat.h"
65 #include "print_split_list_stat.h"
66 #include "print_skip_list_stat.h"
67 #include "print_ellenbintree_stat.h"
68 #include "print_bronsonavltree_stat.h"
69 #include "print_sync_monitor_stat.h"
70 #include "ellen_bintree_update_desc_pool.h"
73 namespace cc = cds::container;
74 namespace co = cds::opt;
76 typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_gpi;
77 typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_gpb;
78 typedef cds::urcu::gc< cds::urcu::general_threaded<> > rcu_gpt;
79 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
80 typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_shb;
81 typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_sht;
84 template <typename Key>
86 int operator ()(Key const& k1, Key const& k2) const
88 if ( std::less<Key>( k1, k2 ) )
90 return std::less<Key>( k2, k1 ) ? 1 : 0;
94 #define CDSUNIT_INT_COMPARE(t) template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
95 CDSUNIT_INT_COMPARE(char);
96 CDSUNIT_INT_COMPARE(unsigned char);
97 CDSUNIT_INT_COMPARE(int);
98 CDSUNIT_INT_COMPARE(unsigned int);
99 CDSUNIT_INT_COMPARE(long);
100 CDSUNIT_INT_COMPARE(unsigned long);
101 CDSUNIT_INT_COMPARE(long long);
102 CDSUNIT_INT_COMPARE(unsigned long long);
103 #undef CDSUNIT_INT_COMPARE
106 struct cmp<std::string>
108 int operator()(std::string const& s1, std::string const& s2)
110 return s1.compare( s2 );
112 int operator()(std::string const& s1, char const * s2)
114 return s1.compare( s2 );
116 int operator()(char const * s1, std::string const& s2)
118 return -s2.compare( s1 );
122 template <typename K, typename V, typename Traits>
124 public cc::CuckooMap< K, V, Traits >
127 typedef cc::CuckooMap< K, V, Traits > cuckoo_base_class;
130 CuckooMap( size_t nCapacity, size_t nLoadFactor )
131 : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
134 template <typename Q, typename Pred>
135 bool erase_with( Q const& key, Pred /*pred*/ )
137 return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
141 template <typename Key, typename Value>
143 typedef co::v::hash<Key> key_hash;
144 typedef std::less<Key> less;
145 typedef cmp<Key> compare;
148 bool operator()( Key const& k1, Key const& k2 ) const
150 return compare()( k1, k2 ) == 0;
154 struct hash: public key_hash
156 size_t operator()( Key const& k ) const
158 return key_hash::operator()( k );
160 template <typename Q>
161 size_t operator()( Q const& k ) const
163 return key_hash::operator()( k );
167 struct hash2: public key_hash
169 size_t operator()( Key const& k ) const
171 size_t seed = ~key_hash::operator ()( k );
172 boost::hash_combine( seed, k );
175 template <typename Q>
176 size_t operator()( Q const& k ) const
178 size_t seed = ~key_hash::operator()( k );
179 boost::hash_combine( seed, k );
184 // ***************************************************************************
187 struct traits_MichaelList_cmp_stdAlloc :
188 public cc::michael_list::make_traits<
189 co::compare< compare >
192 typedef cc::MichaelKVList< cds::gc::HP, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
193 typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
194 typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_NOGC_cmp_stdAlloc;
195 typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
196 typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
197 typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
198 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
199 typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
200 typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
203 struct traits_MichaelList_cmp_stdAlloc_seqcst :
204 public cc::michael_list::make_traits<
205 co::compare< compare >
206 ,co::memory_model< co::v::sequential_consistent >
209 typedef cc::MichaelKVList< cds::gc::HP, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
210 typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
211 typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_NOGC_cmp_stdAlloc_seqcst;
212 typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
213 typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
214 typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
215 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
216 typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
217 typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
220 struct traits_MichaelList_cmp_michaelAlloc :
221 public cc::michael_list::make_traits<
222 co::compare< compare >,
223 co::allocator< memory::MichaelAllocator<int> >
226 typedef cc::MichaelKVList< cds::gc::HP, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
227 typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
228 typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_NOGC_cmp_michaelAlloc;
229 typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
230 typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
231 typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
232 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
233 typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
234 typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
237 struct traits_MichaelList_less_stdAlloc :
238 public cc::michael_list::make_traits<
242 typedef cc::MichaelKVList< cds::gc::HP, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
243 typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
244 typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_NOGC_less_stdAlloc;
245 typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
246 typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
247 typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
248 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
249 typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
250 typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
253 struct traits_MichaelList_less_stdAlloc_seqcst :
254 public cc::michael_list::make_traits<
256 ,co::memory_model< co::v::sequential_consistent >
259 typedef cc::MichaelKVList< cds::gc::HP, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
260 typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
261 typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_NOGC_less_stdAlloc_seqcst;
262 typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
263 typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
264 typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
265 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
266 typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
267 typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
270 struct traits_MichaelList_less_michaelAlloc :
271 public cc::michael_list::make_traits<
273 co::allocator< memory::MichaelAllocator<int> >
276 typedef cc::MichaelKVList< cds::gc::HP, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
277 typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
278 typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_NOGC_less_michaelAlloc;
279 typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
280 typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
281 typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
282 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
283 typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
284 typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
287 template <typename Base>
288 class NogcMapWrapper: public Base
290 typedef Base base_class;
292 NogcMapWrapper( size_t nMaxItemCount, size_t nLoadFactor )
293 : base_class( nMaxItemCount, nLoadFactor )
296 template <typename K>
297 bool insert( K const& key )
299 return base_class::insert( key ) != base_class::end();
302 template <typename K, typename V>
303 bool insert( K const& key, V const& val )
305 return base_class::insert( key, val ) != base_class::end();
308 template <typename K, typename Func>
309 bool insert_with( K const& key, Func func )
311 return base_class::insert_with( key, func ) != base_class::end();
314 template <typename K>
315 bool find( K const& key )
317 return base_class::find( key ) != base_class::end();
326 template <typename Base>
327 class NogcMapWrapper_dctor: public Base
329 typedef Base base_class;
331 NogcMapWrapper_dctor()
334 template <typename K>
335 bool insert( K const& key )
337 return base_class::insert( key ) != base_class::end();
340 template <typename K, typename V>
341 bool insert( K const& key, V const& val )
343 return base_class::insert( key, val ) != base_class::end();
346 template <typename K, typename Func>
347 bool insert_with( K const& key, Func func )
349 return base_class::insert_with( key, func ) != base_class::end();
352 template <typename K>
353 bool find( K const& key )
355 return base_class::find( key ) != base_class::end();
359 // SplitListMap<gc::nogc> has no clear() method
360 template <typename Base>
361 class NogcSplitMapWrapper: public Base
363 typedef Base base_class;
365 NogcSplitMapWrapper( size_t nMaxItemCount, size_t nLoadFactor )
366 : base_class( nMaxItemCount, nLoadFactor )
369 template <typename K>
370 bool insert( K const& key )
372 return base_class::insert( key ) != base_class::end();
375 template <typename K, typename V>
376 bool insert( K const& key, V const& val )
378 return base_class::insert( key, val ) != base_class::end();
381 template <typename K, typename Func>
382 bool insert_with( K const& key, Func func )
384 return base_class::insert_with( key, func ) != base_class::end();
387 template <typename K>
388 bool find( K const& key )
390 return base_class::find( key ) != base_class::end();
398 // ***************************************************************************
399 // MichaelHashMap based on MichaelKVList
401 struct traits_MichaelMap_hash :
402 public cc::michael_map::make_traits<
406 typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_HP_cmp_stdAlloc;
407 typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_DHP_cmp_stdAlloc;
408 typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_NOGC_cmp_stdAlloc;
409 typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPI_cmp_stdAlloc;
410 typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPB_cmp_stdAlloc;
411 typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPT_cmp_stdAlloc;
412 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
413 typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHB_cmp_stdAlloc;
414 typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHT_cmp_stdAlloc;
417 typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_HP_less_stdAlloc;
418 typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_DHP_less_stdAlloc;
419 typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_NOGC_less_stdAlloc;
420 typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPI_less_stdAlloc;
421 typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPB_less_stdAlloc;
422 typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPT_less_stdAlloc;
423 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
424 typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHB_less_stdAlloc;
425 typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHT_less_stdAlloc;
428 typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_HP_cmp_stdAlloc_seqcst;
429 typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_DHP_cmp_stdAlloc_seqcst;
430 typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_NOGC_cmp_stdAlloc_seqcst;
431 typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPI_cmp_stdAlloc_seqcst;
432 typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPB_cmp_stdAlloc_seqcst;
433 typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPT_cmp_stdAlloc_seqcst;
434 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
435 typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHB_cmp_stdAlloc_seqcst;
436 typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHT_cmp_stdAlloc_seqcst;
439 typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_HP_less_stdAlloc_seqcst;
440 typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_DHP_less_stdAlloc_seqcst;
441 typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_NOGC_less_stdAlloc_seqcst;
442 typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPI_less_stdAlloc_seqcst;
443 typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPB_less_stdAlloc_seqcst;
444 typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPT_less_stdAlloc_seqcst;
445 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
446 typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHB_less_stdAlloc_seqcst;
447 typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHT_less_stdAlloc_seqcst;
450 struct traits_MichaelSet_michaelAlloc :
451 public traits_MichaelMap_hash
453 typedef memory::MichaelAllocator<int> allocator;
455 typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_HP_cmp_michaelAlloc;
456 typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_DHP_cmp_michaelAlloc;
457 typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_NOGC_cmp_michaelAlloc;
458 typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPI_cmp_michaelAlloc;
459 typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPB_cmp_michaelAlloc;
460 typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPT_cmp_michaelAlloc;
461 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
462 typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHB_cmp_michaelAlloc;
463 typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHT_cmp_michaelAlloc;
465 typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_HP_less_michaelAlloc;
466 typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_DHP_less_michaelAlloc;
467 typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_NOGC_less_michaelAlloc;
468 typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPI_less_michaelAlloc;
469 typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPB_less_michaelAlloc;
470 typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPT_less_michaelAlloc;
471 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
472 typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHB_less_michaelAlloc;
473 typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHT_less_michaelAlloc;
476 // ***************************************************************************
479 struct traits_LazyList_cmp_stdAlloc :
480 public cc::lazy_list::make_traits<
481 co::compare< compare >
484 typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
485 typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
486 typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_NOGC_cmp_stdAlloc;
487 typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
488 typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
489 typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
490 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
491 typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
492 typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
495 struct traits_LazyList_cmp_stdAlloc_seqcst :
496 public cc::lazy_list::make_traits<
497 co::compare< compare >
498 ,co::memory_model< co::v::sequential_consistent >
501 typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
502 typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
503 typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_NOGC_cmp_stdAlloc_seqcst;
504 typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
505 typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
506 typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
507 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
508 typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
509 typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
512 struct traits_LazyList_cmp_michaelAlloc :
513 public cc::lazy_list::make_traits<
514 co::compare< compare >,
515 co::allocator< memory::MichaelAllocator<int> >
518 typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
519 typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
520 typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_NOGC_cmp_michaelAlloc;
521 typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
522 typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
523 typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
524 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
525 typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
526 typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
528 struct traits_LazyList_less_stdAlloc :
529 public cc::lazy_list::make_traits<
533 typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
534 typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
535 typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_less_stdAlloc > LazyList_NOGC_less_stdAlloc;
536 typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
537 typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
538 typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
539 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
540 typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
541 typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
544 struct traits_LazyList_less_stdAlloc_seqcst :
545 public cc::lazy_list::make_traits<
547 ,co::memory_model< co::v::sequential_consistent >
550 typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
551 typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
552 typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_NOGC_less_stdAlloc_seqcst;
553 typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
554 typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
555 typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
556 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
557 typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
558 typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
561 struct traits_LazyList_less_michaelAlloc :
562 public cc::lazy_list::make_traits<
564 co::allocator< memory::MichaelAllocator<int> >
567 typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
568 typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
569 typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_NOGC_less_michaelAlloc;
570 typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
571 typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
572 typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
573 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
574 typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
575 typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
578 // ***************************************************************************
579 // MichaelHashMap based on LazyKVList
580 typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_HP_cmp_stdAlloc;
581 typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_cmp_stdAlloc;
582 typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_cmp_stdAlloc;
583 typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc;
584 typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc;
585 typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc;
586 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
587 typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc;
588 typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc;
591 typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_HP_less_stdAlloc;
592 typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_less_stdAlloc;
593 typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_less_stdAlloc;
594 typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_less_stdAlloc;
595 typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_less_stdAlloc;
596 typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_less_stdAlloc;
597 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
598 typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_less_stdAlloc;
599 typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_less_stdAlloc;
602 typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_HP_cmp_stdAlloc_seqcst;
603 typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_cmp_stdAlloc_seqcst;
604 typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_cmp_stdAlloc_seqcst;
605 typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc_seqcst;
606 typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc_seqcst;
607 typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc_seqcst;
608 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
609 typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc_seqcst;
610 typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc_seqcst;
613 typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_HP_less_stdAlloc_seqcst;
614 typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_less_stdAlloc_seqcst;
615 typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_less_stdAlloc_seqcst;
616 typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_less_stdAlloc_seqcst;
617 typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_less_stdAlloc_seqcst;
618 typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_less_stdAlloc_seqcst;
619 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
620 typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_less_stdAlloc_seqcst;
621 typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_less_stdAlloc_seqcst;
624 typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_HP_cmp_michaelAlloc;
625 typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_DHP_cmp_michaelAlloc;
626 typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_NOGC_cmp_michaelAlloc;
627 typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPI_cmp_michaelAlloc;
628 typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPB_cmp_michaelAlloc;
629 typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPT_cmp_michaelAlloc;
630 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
631 typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHB_cmp_michaelAlloc;
632 typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHT_cmp_michaelAlloc;
634 typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_HP_less_michaelAlloc;
635 typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_DHP_less_michaelAlloc;
636 typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_NOGC_less_michaelAlloc;
637 typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPI_less_michaelAlloc;
638 typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPB_less_michaelAlloc;
639 typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPT_less_michaelAlloc;
640 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
641 typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHB_less_michaelAlloc;
642 typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHT_less_michaelAlloc;
645 // ***************************************************************************
646 // SplitListMap based on MichaelList
649 struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
650 cc::split_list::ordered_list<cc::michael_list_tag>
652 ,cc::split_list::ordered_list_traits<
653 typename cc::michael_list::make_traits<
654 co::compare< compare >
659 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
660 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
661 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp >> SplitList_Michael_NOGC_dyn_cmp;
662 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
663 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
664 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
665 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
666 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
667 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
670 struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
672 typedef cc::split_list::stat<> stat;
674 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
675 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
676 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat >> SplitList_Michael_NOGC_dyn_cmp_stat;
677 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
678 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
679 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
680 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
681 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
682 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
685 struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
686 cc::split_list::ordered_list<cc::michael_list_tag>
688 ,co::memory_model< co::v::sequential_consistent >
689 ,cc::split_list::ordered_list_traits<
690 typename cc::michael_list::make_traits<
691 co::compare< compare >
692 ,co::memory_model< co::v::sequential_consistent >
697 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
698 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
699 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst >> SplitList_Michael_NOGC_dyn_cmp_seqcst;
700 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
701 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
702 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
703 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
704 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
705 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
708 struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
709 cc::split_list::ordered_list<cc::michael_list_tag>
710 ,cc::split_list::dynamic_bucket_table< false >
712 ,cc::split_list::ordered_list_traits<
713 typename cc::michael_list::make_traits<
714 co::compare< compare >
719 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
720 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
721 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp >> SplitList_Michael_NOGC_st_cmp;
722 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
723 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
724 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
725 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
726 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
727 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
730 struct traits_SplitList_Michael_st_cmp_seqcst: public cc::split_list::make_traits<
731 cc::split_list::ordered_list<cc::michael_list_tag>
733 ,cc::split_list::dynamic_bucket_table< false >
734 ,co::memory_model< co::v::sequential_consistent >
735 ,cc::split_list::ordered_list_traits<
736 typename cc::michael_list::make_traits<
737 co::compare< compare >
738 ,co::memory_model< co::v::sequential_consistent >
743 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_HP_st_cmp_seqcst;
744 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_DHP_st_cmp_seqcst;
745 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp_seqcst >> SplitList_Michael_NOGC_st_cmp_seqcst;
746 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPI_st_cmp_seqcst;
747 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPB_st_cmp_seqcst;
748 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPT_st_cmp_seqcst;
749 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
750 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHB_st_cmp_seqcst;
751 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHT_st_cmp_seqcst;
755 struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
756 cc::split_list::ordered_list<cc::michael_list_tag>
758 ,cc::split_list::ordered_list_traits<
759 typename cc::michael_list::make_traits<
765 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
766 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
767 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less >> SplitList_Michael_NOGC_dyn_less;
768 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
769 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
770 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
771 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
772 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
773 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
777 struct traits_SplitList_Michael_dyn_less_seqcst: public cc::split_list::make_traits<
778 cc::split_list::ordered_list<cc::michael_list_tag>
780 ,co::memory_model< co::v::sequential_consistent >
781 ,cc::split_list::ordered_list_traits<
782 typename cc::michael_list::make_traits<
784 ,co::memory_model< co::v::sequential_consistent >
789 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
790 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
791 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less_seqcst >> SplitList_Michael_NOGC_dyn_less_seqcst;
792 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
793 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
794 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
795 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
796 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
797 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
800 struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
801 cc::split_list::ordered_list<cc::michael_list_tag>
802 ,cc::split_list::dynamic_bucket_table< false >
804 ,cc::split_list::ordered_list_traits<
805 typename cc::michael_list::make_traits<
811 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
812 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
813 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less >> SplitList_Michael_NOGC_st_less;
814 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
815 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
816 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
817 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
818 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
819 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
822 struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
824 typedef cc::split_list::stat<> stat;
826 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
827 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
828 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat >> SplitList_Michael_NOGC_st_less_stat;
829 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
830 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
831 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
832 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
833 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
834 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
838 class traits_SplitList_Michael_st_less_seqcst: public cc::split_list::make_traits<
839 cc::split_list::ordered_list<cc::michael_list_tag>
841 ,cc::split_list::dynamic_bucket_table< false >
842 ,co::memory_model< co::v::sequential_consistent >
843 ,cc::split_list::ordered_list_traits<
844 typename cc::michael_list::make_traits<
846 ,co::memory_model< co::v::sequential_consistent >
851 typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
852 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
853 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_seqcst >> SplitList_Michael_NOGC_st_less_seqcst;
854 typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
855 typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
856 typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
857 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
858 typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
859 typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
863 // ***************************************************************************
864 // SplitListMap based on LazyKVList
866 struct SplitList_Lazy_dyn_cmp :
867 public cc::split_list::make_traits<
868 cc::split_list::ordered_list<cc::lazy_list_tag>
870 ,cc::split_list::ordered_list_traits<
871 typename cc::lazy_list::make_traits<
872 co::compare< compare >
877 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
878 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
879 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp >> SplitList_Lazy_NOGC_dyn_cmp;
880 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
881 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
882 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
883 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
884 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
885 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
888 struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
890 typedef cc::split_list::stat<> stat;
892 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
893 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
894 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat >> SplitList_Lazy_NOGC_dyn_cmp_stat;
895 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
896 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
897 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
898 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
899 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
900 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
903 struct SplitList_Lazy_dyn_cmp_seqcst :
904 public cc::split_list::make_traits<
905 cc::split_list::ordered_list<cc::lazy_list_tag>
907 ,co::memory_model< co::v::sequential_consistent >
908 ,cc::split_list::ordered_list_traits<
909 typename cc::lazy_list::make_traits<
910 co::compare< compare >
911 ,co::memory_model< co::v::sequential_consistent >
916 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
917 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
918 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst >> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
919 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
920 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
921 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
922 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
923 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
924 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
927 struct SplitList_Lazy_st_cmp :
928 public cc::split_list::make_traits<
929 cc::split_list::ordered_list<cc::lazy_list_tag>
930 ,cc::split_list::dynamic_bucket_table< false >
932 ,cc::split_list::ordered_list_traits<
933 typename cc::lazy_list::make_traits<
934 co::compare< compare >
939 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
940 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
941 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp >> SplitList_Lazy_NOGC_st_cmp;
942 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
943 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
944 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
945 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
946 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
947 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
951 struct SplitList_Lazy_st_cmp_seqcst :
952 public cc::split_list::make_traits<
953 cc::split_list::ordered_list<cc::lazy_list_tag>
955 ,cc::split_list::dynamic_bucket_table< false >
956 ,co::memory_model< co::v::sequential_consistent >
957 ,cc::split_list::ordered_list_traits<
958 typename cc::lazy_list::make_traits<
959 co::compare< compare >
960 ,co::memory_model< co::v::sequential_consistent >
965 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_HP_st_cmp_seqcst;
966 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_DHP_st_cmp_seqcst;
967 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp_seqcst >> SplitList_Lazy_NOGC_st_cmp_seqcst;
968 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
969 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
970 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
971 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
972 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
973 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
977 struct SplitList_Lazy_dyn_less :
978 public cc::split_list::make_traits<
979 cc::split_list::ordered_list<cc::lazy_list_tag>
981 ,cc::split_list::ordered_list_traits<
982 typename cc::lazy_list::make_traits<
988 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
989 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
990 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less >> SplitList_Lazy_NOGC_dyn_less;
991 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
992 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
993 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
994 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
995 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
996 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
999 struct SplitList_Lazy_dyn_less_seqcst:
1000 public cc::split_list::make_traits<
1001 cc::split_list::ordered_list<cc::lazy_list_tag>
1003 ,co::memory_model< co::v::sequential_consistent >
1004 ,cc::split_list::ordered_list_traits<
1005 typename cc::lazy_list::make_traits<
1007 ,co::memory_model< co::v::sequential_consistent >
1012 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
1013 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
1014 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less_seqcst >> SplitList_Lazy_NOGC_dyn_less_seqcst;
1015 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
1016 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
1017 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
1018 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1019 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
1020 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
1023 struct SplitList_Lazy_st_less :
1024 public cc::split_list::make_traits<
1025 cc::split_list::ordered_list<cc::lazy_list_tag>
1026 ,cc::split_list::dynamic_bucket_table< false >
1028 ,cc::split_list::ordered_list_traits<
1029 typename cc::lazy_list::make_traits<
1035 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
1036 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
1037 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less >> SplitList_Lazy_NOGC_st_less;
1038 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
1039 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
1040 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
1041 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1042 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
1043 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
1046 struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
1048 typedef cc::split_list::stat<> stat;
1050 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
1051 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
1052 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat >> SplitList_Lazy_NOGC_st_less_stat;
1053 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
1054 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
1055 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
1056 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1057 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
1058 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
1061 struct SplitList_Lazy_st_less_seqcst :
1062 public cc::split_list::make_traits<
1063 cc::split_list::ordered_list<cc::lazy_list_tag>
1065 ,cc::split_list::dynamic_bucket_table< false >
1066 ,co::memory_model< co::v::sequential_consistent >
1067 ,cc::split_list::ordered_list_traits<
1068 typename cc::lazy_list::make_traits<
1070 ,co::memory_model< co::v::sequential_consistent >
1075 typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
1076 typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
1077 typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_seqcst >> SplitList_Lazy_NOGC_st_less_seqcst;
1078 typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
1079 typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
1080 typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
1081 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1082 typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
1083 typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
1088 // ***************************************************************************
1091 // for sequential containers
1092 template <class BucketEntry, typename... Options>
1093 class StripedHashMap_seq:
1094 public cc::StripedMap< BucketEntry,
1095 co::mutex_policy< cc::striped_set::striping<> >
1096 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1100 typedef cc::StripedMap< BucketEntry,
1101 co::mutex_policy< cc::striped_set::striping<> >
1102 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1105 typedef typename base_class::resizing_policy resizing_policy_t;
1107 resizing_policy_t m_placeHolder;
1109 StripedHashMap_seq( size_t nCapacity, size_t nLoadFactor )
1110 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1114 // for non-sequential ordered containers
1115 template <class BucketEntry, typename... Options>
1116 class StripedHashMap_ord:
1117 public cc::StripedMap< BucketEntry,
1118 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1119 ,co::mutex_policy< cc::striped_set::striping<> >
1123 typedef cc::StripedMap< BucketEntry,
1124 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1125 ,co::mutex_policy< cc::striped_set::striping<> >
1128 typedef typename base_class::resizing_policy resizing_policy_t;
1130 resizing_policy_t m_placeHolder;
1132 StripedHashMap_ord( size_t /*nCapacity*/, size_t nLoadFactor )
1133 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1138 typedef StripedHashMap_seq<
1139 std::list< std::pair< Key const, Value > >
1144 #if (CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)) && _MSC_VER < 1600
1145 typedef StripedHashMap_ord<
1146 stdext::hash_map< Key, Value, stdext::hash_compare<Key, less > >
1148 > StripedMap_hashmap;
1150 typedef StripedHashMap_ord<
1151 std::unordered_map< Key, Value, hash, equal_to >
1153 > StripedMap_hashmap;
1156 typedef StripedHashMap_ord<
1157 std::map< Key, Value, less >
1161 typedef StripedHashMap_ord<
1162 boost::unordered_map< Key, Value, hash, equal_to >
1164 > StripedMap_boost_unordered_map;
1166 #if BOOST_VERSION >= 104800
1167 typedef StripedHashMap_seq<
1168 boost::container::slist< std::pair< Key const, Value > >
1173 typedef StripedHashMap_seq<
1174 boost::container::list< std::pair< Key const, Value > >
1177 > StripedMap_boost_list;
1179 typedef StripedHashMap_ord<
1180 boost::container::map< Key, Value, less >
1182 > StripedMap_boost_map;
1184 //# ifdef CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS
1185 typedef StripedHashMap_ord<
1186 boost::container::flat_map< Key, Value, less >
1188 > StripedMap_boost_flat_map;
1190 #endif // BOOST_VERSION >= 104800
1192 // ***************************************************************************
1195 // for sequential containers
1196 template <class BucketEntry, typename... Options>
1197 class RefinableHashMap_seq:
1198 public cc::StripedMap< BucketEntry,
1199 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1200 ,co::mutex_policy< cc::striped_set::refinable<> >
1204 typedef cc::StripedMap< BucketEntry,
1205 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1206 ,co::mutex_policy< cc::striped_set::refinable<> >
1209 typedef typename base_class::resizing_policy resizing_policy_t;
1211 resizing_policy_t m_placeHolder;
1213 RefinableHashMap_seq( size_t nCapacity, size_t nLoadFactor )
1214 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1218 // for non-sequential ordered containers
1219 template <class BucketEntry, typename... Options>
1220 class RefinableHashMap_ord:
1221 public cc::StripedMap< BucketEntry,
1222 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1223 ,co::mutex_policy< cc::striped_set::refinable<> >
1227 typedef cc::StripedMap< BucketEntry,
1228 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1229 ,co::mutex_policy< cc::striped_set::refinable<> >
1232 typedef typename base_class::resizing_policy resizing_policy_t;
1234 resizing_policy_t m_placeHolder;
1236 RefinableHashMap_ord( size_t /*nCapacity*/, size_t nLoadFactor )
1237 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1242 typedef RefinableHashMap_seq<
1243 std::list< std::pair< Key const, Value > >
1246 > RefinableMap_list;
1248 #if BOOST_VERSION >= 104800
1249 typedef RefinableHashMap_seq<
1250 boost::container::slist< std::pair< Key const, Value > >
1253 > RefinableMap_slist;
1256 typedef RefinableHashMap_ord<
1257 std::map< Key, Value, less >
1261 typedef RefinableHashMap_ord<
1262 std::unordered_map< Key, Value, hash, equal_to >
1264 > RefinableMap_hashmap;
1266 typedef RefinableHashMap_ord<
1267 boost::unordered_map< Key, Value, hash, equal_to >
1269 > RefinableMap_boost_unordered_map;
1271 #if BOOST_VERSION >= 104800
1272 typedef RefinableHashMap_seq<
1273 boost::container::list< std::pair< Key const, Value > >
1276 > RefinableMap_boost_list;
1278 typedef RefinableHashMap_ord<
1279 boost::container::map< Key, Value, less >
1281 > RefinableMap_boost_map;
1283 typedef RefinableHashMap_ord<
1284 boost::container::flat_map< Key, Value, less >
1286 > RefinableMap_boost_flat_map;
1287 #endif // #if BOOST_VERSION >= 104800
1290 // ***************************************************************************
1293 template <typename Traits>
1294 struct traits_CuckooStripedMap: public Traits
1296 typedef cc::cuckoo::striping<> mutex_policy;
1298 template <typename Traits>
1299 struct traits_CuckooRefinableMap : public Traits
1301 typedef cc::cuckoo::refinable<> mutex_policy;
1304 struct traits_CuckooMap_list_unord :
1305 public cc::cuckoo::make_traits <
1306 cc::cuckoo::probeset_type< cc::cuckoo::list >
1307 , co::equal_to< equal_to >
1308 , co::hash< std::tuple< hash, hash2 > >
1311 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_unord>> CuckooStripedMap_list_unord;
1312 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_unord>> CuckooRefinableMap_list_unord;
1314 struct traits_CuckooMap_list_unord_stat : public traits_CuckooMap_list_unord
1316 typedef cc::cuckoo::stat stat;
1318 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_unord_stat>> CuckooStripedMap_list_unord_stat;
1319 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_unord_stat>> CuckooRefinableMap_list_unord_stat;
1321 struct traits_CuckooMap_list_unord_storehash : public traits_CuckooMap_list_unord
1323 static CDS_CONSTEXPR const bool store_hash = true;
1325 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_unord_storehash>> CuckooStripedMap_list_unord_storehash;
1326 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_unord_storehash>> CuckooRefinableMap_list_unord_storehash;
1328 struct traits_CuckooMap_list_ord :
1329 public cc::cuckoo::make_traits <
1330 cc::cuckoo::probeset_type< cc::cuckoo::list >
1331 , co::compare< compare >
1332 , co::hash< std::tuple< hash, hash2 > >
1335 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_ord>> CuckooStripedMap_list_ord;
1336 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_ord>> CuckooRefinableMap_list_ord;
1338 struct traits_CuckooMap_list_ord_stat : public traits_CuckooMap_list_ord
1340 typedef cc::cuckoo::stat stat;
1342 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_ord_stat>> CuckooStripedMap_list_ord_stat;
1343 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_ord_stat>> CuckooRefinableMap_list_ord_stat;
1345 struct traits_CuckooMap_list_ord_storehash : public traits_CuckooMap_list_ord
1347 static CDS_CONSTEXPR const bool store_hash = true;
1349 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_list_ord_storehash>> CuckooStripedMap_list_ord_storehash;
1350 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_list_ord_storehash>> CuckooRefinableMap_list_ord_storehash;
1352 struct traits_CuckooMap_vector_unord :
1353 public cc::cuckoo::make_traits <
1354 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1355 , co::equal_to< equal_to >
1356 , co::hash< std::tuple< hash, hash2 > >
1359 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_unord>> CuckooStripedMap_vector_unord;
1360 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_unord>> CuckooRefinableMap_vector_unord;
1362 struct traits_CuckooMap_vector_unord_stat : public traits_CuckooMap_vector_unord
1364 typedef cc::cuckoo::stat stat;
1366 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_unord_stat>> CuckooStripedMap_vector_unord_stat;
1367 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_unord_stat>> CuckooRefinableMap_vector_unord_stat;
1369 struct traits_CuckooMap_vector_unord_storehash : public traits_CuckooMap_vector_unord
1371 static CDS_CONSTEXPR const bool store_hash = true;
1373 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_unord_storehash>> CuckooStripedMap_vector_unord_storehash;
1374 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_unord_storehash>> CuckooRefinableMap_vector_unord_storehash;
1376 struct traits_CuckooMap_vector_ord :
1377 public cc::cuckoo::make_traits <
1378 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1379 , co::compare< compare >
1380 , co::hash< std::tuple< hash, hash2 > >
1383 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_ord>> CuckooStripedMap_vector_ord;
1384 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_ord>> CuckooRefinableMap_vector_ord;
1386 struct traits_CuckooMap_vector_ord_stat : public traits_CuckooMap_vector_ord
1388 typedef cc::cuckoo::stat stat;
1390 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_ord_stat>> CuckooStripedMap_vector_ord_stat;
1391 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_ord_stat>> CuckooRefinableMap_vector_ord_stat;
1393 struct traits_CuckooMap_vector_ord_storehash : public traits_CuckooMap_vector_ord
1395 static CDS_CONSTEXPR const bool store_hash = true;
1397 typedef CuckooMap< Key, Value, traits_CuckooStripedMap<traits_CuckooMap_vector_ord_storehash>> CuckooStripedMap_vector_ord_storehash;
1398 typedef CuckooMap< Key, Value, traits_CuckooRefinableMap<traits_CuckooMap_vector_ord_storehash>> CuckooRefinableMap_vector_ord_storehash;
1400 // ***************************************************************************
1403 class traits_SkipListMap_less_pascal: public cc::skip_list::make_traits <
1405 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1406 ,co::item_counter< cds::atomicity::item_counter >
1409 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_hp_less_pascal;
1410 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_dhp_less_pascal;
1411 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_nogc_less_pascal;
1412 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_gpi_less_pascal;
1413 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_gpb_less_pascal;
1414 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_gpt_less_pascal;
1415 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1416 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_shb_less_pascal;
1417 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_sht_less_pascal;
1420 class traits_SkipListMap_less_pascal_seqcst: public cc::skip_list::make_traits <
1422 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1423 ,co::memory_model< co::v::sequential_consistent >
1424 ,co::item_counter< cds::atomicity::item_counter >
1427 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_hp_less_pascal_seqcst;
1428 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_dhp_less_pascal_seqcst;
1429 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_nogc_less_pascal_seqcst;
1430 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_gpi_less_pascal_seqcst;
1431 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_gpb_less_pascal_seqcst;
1432 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_gpt_less_pascal_seqcst;
1433 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1434 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_shb_less_pascal_seqcst;
1435 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_sht_less_pascal_seqcst;
1438 class traits_SkipListMap_less_pascal_stat: public cc::skip_list::make_traits <
1440 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1441 ,co::stat< cc::skip_list::stat<> >
1442 ,co::item_counter< cds::atomicity::item_counter >
1445 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_hp_less_pascal_stat;
1446 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_dhp_less_pascal_stat;
1447 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_nogc_less_pascal_stat;
1448 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_gpi_less_pascal_stat;
1449 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_gpb_less_pascal_stat;
1450 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_gpt_less_pascal_stat;
1451 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1452 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_shb_less_pascal_stat;
1453 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_sht_less_pascal_stat;
1456 class traits_SkipListMap_cmp_pascal: public cc::skip_list::make_traits <
1457 co::compare< compare >
1458 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1459 ,co::item_counter< cds::atomicity::item_counter >
1462 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_hp_cmp_pascal;
1463 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_dhp_cmp_pascal;
1464 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_nogc_cmp_pascal;
1465 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_gpi_cmp_pascal;
1466 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_gpb_cmp_pascal;
1467 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_gpt_cmp_pascal;
1468 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1469 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_shb_cmp_pascal;
1470 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_sht_cmp_pascal;
1473 class traits_SkipListMap_cmp_pascal_stat: public cc::skip_list::make_traits <
1474 co::compare< compare >
1475 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1476 ,co::stat< cc::skip_list::stat<> >
1477 ,co::item_counter< cds::atomicity::item_counter >
1480 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_hp_cmp_pascal_stat;
1481 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_dhp_cmp_pascal_stat;
1482 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_nogc_cmp_pascal_stat;
1483 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_gpi_cmp_pascal_stat;
1484 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_gpb_cmp_pascal_stat;
1485 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_gpt_cmp_pascal_stat;
1486 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1487 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_shb_cmp_pascal_stat;
1488 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_sht_cmp_pascal_stat;
1491 class traits_SkipListMap_less_xorshift: public cc::skip_list::make_traits <
1493 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1494 ,co::item_counter< cds::atomicity::item_counter >
1497 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_hp_less_xorshift;
1498 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_dhp_less_xorshift;
1499 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_nogc_less_xorshift;
1500 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_gpi_less_xorshift;
1501 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_gpb_less_xorshift;
1502 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_gpt_less_xorshift;
1503 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1504 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_shb_less_xorshift;
1505 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_sht_less_xorshift;
1508 class traits_SkipListMap_less_xorshift_stat: public cc::skip_list::make_traits <
1510 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1511 ,co::stat< cc::skip_list::stat<> >
1512 ,co::item_counter< cds::atomicity::item_counter >
1515 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_hp_less_xorshift_stat;
1516 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_dhp_less_xorshift_stat;
1517 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_nogc_less_xorshift_stat;
1518 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_gpi_less_xorshift_stat;
1519 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_gpb_less_xorshift_stat;
1520 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_gpt_less_xorshift_stat;
1521 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1522 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_shb_less_xorshift_stat;
1523 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_sht_less_xorshift_stat;
1526 class traits_SkipListMap_cmp_xorshift: public cc::skip_list::make_traits <
1527 co::compare< compare >
1528 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1529 ,co::item_counter< cds::atomicity::item_counter >
1532 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_hp_cmp_xorshift;
1533 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_dhp_cmp_xorshift;
1534 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_nogc_cmp_xorshift;
1535 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_gpi_cmp_xorshift;
1536 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_gpb_cmp_xorshift;
1537 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_gpt_cmp_xorshift;
1538 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1539 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_shb_cmp_xorshift;
1540 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_sht_cmp_xorshift;
1543 class traits_SkipListMap_cmp_xorshift_stat: public cc::skip_list::make_traits <
1544 co::compare< compare >
1545 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1546 ,co::stat< cc::skip_list::stat<> >
1547 ,co::item_counter< cds::atomicity::item_counter >
1550 typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_hp_cmp_xorshift_stat;
1551 typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_dhp_cmp_xorshift_stat;
1552 typedef cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_nogc_cmp_xorshift_stat;
1553 typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_gpi_cmp_xorshift_stat;
1554 typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_gpb_cmp_xorshift_stat;
1555 typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_gpt_cmp_xorshift_stat;
1556 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1557 typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_shb_cmp_xorshift_stat;
1558 typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_sht_cmp_xorshift_stat;
1562 // ***************************************************************************
1564 struct ellen_bintree_props {
1566 typedef cc::ellen_bintree::map_node<cds::gc::HP, Key, Value> leaf_node;
1567 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1568 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1571 typedef cc::ellen_bintree::map_node<cds::gc::DHP, Key, Value> leaf_node;
1572 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1573 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1576 typedef cc::ellen_bintree::map_node<rcu_gpi, Key, Value> leaf_node;
1577 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1578 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1581 typedef cc::ellen_bintree::map_node<rcu_gpb, Key, Value> leaf_node;
1582 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1583 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1586 typedef cc::ellen_bintree::map_node<rcu_gpt, Key, Value> leaf_node;
1587 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1588 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1590 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1592 typedef cc::ellen_bintree::map_node<rcu_shb, Key, Value> leaf_node;
1593 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1594 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1597 typedef cc::ellen_bintree::map_node<rcu_sht, Key, Value> leaf_node;
1598 typedef cc::ellen_bintree::internal_node< Key, leaf_node > internal_node;
1599 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
1604 struct traits_EllenBinTreeMap: public cc::ellen_bintree::make_set_traits<
1606 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1607 ,co::item_counter< cds::atomicity::item_counter >
1610 struct traits_EllenBinTreeMap_hp : traits_EllenBinTreeMap {
1611 typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1613 typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp >EllenBinTreeMap_hp;
1615 struct traits_EllenBinTreeMap_dhp : traits_EllenBinTreeMap {
1616 typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1618 typedef cc::EllenBinTreeMap< cds::gc::DHP, Key, Value, traits_EllenBinTreeMap_dhp >EllenBinTreeMap_dhp;
1620 struct traits_EllenBinTreeMap_gpi : traits_EllenBinTreeMap {
1621 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1623 typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_gpi >EllenBinTreeMap_rcu_gpi;
1625 struct traits_EllenBinTreeMap_gpb : traits_EllenBinTreeMap {
1626 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1628 typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_gpb >EllenBinTreeMap_rcu_gpb;
1630 struct traits_EllenBinTreeMap_gpt : traits_EllenBinTreeMap {
1631 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1633 typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_gpt >EllenBinTreeMap_rcu_gpt;
1635 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1636 struct traits_EllenBinTreeMap_shb : traits_EllenBinTreeMap {
1637 typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1639 typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_shb >EllenBinTreeMap_rcu_shb;
1641 struct traits_EllenBinTreeMap_sht : traits_EllenBinTreeMap {
1642 typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1644 typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_sht >EllenBinTreeMap_rcu_sht;
1647 struct traits_EllenBinTreeMap_yield : public traits_EllenBinTreeMap
1649 typedef cds::backoff::yield back_off;
1651 struct traits_EllenBinTreeMap_hp_yield : traits_EllenBinTreeMap_yield {
1652 typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1654 typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp_yield >EllenBinTreeMap_hp_yield;
1656 struct traits_EllenBinTreeMap_dhp_yield : traits_EllenBinTreeMap_yield {
1657 typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1659 typedef cc::EllenBinTreeMap< cds::gc::DHP, Key, Value, traits_EllenBinTreeMap_dhp_yield >EllenBinTreeMap_dhp_yield;
1661 struct traits_EllenBinTreeMap_gpb_yield : traits_EllenBinTreeMap_yield {
1662 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1664 typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_gpb_yield >EllenBinTreeMap_rcu_gpb_yield;
1667 struct traits_EllenBinTreeMap_stat: public cc::ellen_bintree::make_set_traits<
1669 ,cc::ellen_bintree::update_desc_allocator<
1670 cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
1672 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1673 ,co::stat< cc::ellen_bintree::stat<> >
1674 ,co::item_counter< cds::atomicity::item_counter >
1678 struct traits_EllenBinTreeMap_stat_hp : public traits_EllenBinTreeMap_stat
1680 typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1682 typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_stat_hp > EllenBinTreeMap_hp_stat;
1684 struct traits_EllenBinTreeMap_stat_dhp : public traits_EllenBinTreeMap_stat
1686 typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1688 typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_stat_dhp > EllenBinTreeMap_dhp_stat;
1690 struct traits_EllenBinTreeMap_stat_gpi : public traits_EllenBinTreeMap_stat
1692 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1694 typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_stat_gpi > EllenBinTreeMap_rcu_gpi_stat;
1696 struct traits_EllenBinTreeMap_stat_gpb : public traits_EllenBinTreeMap_stat
1698 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1700 typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_stat_gpb > EllenBinTreeMap_rcu_gpb_stat;
1702 struct traits_EllenBinTreeMap_stat_gpt : public traits_EllenBinTreeMap_stat
1704 typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1706 typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_stat_gpt > EllenBinTreeMap_rcu_gpt_stat;
1708 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1709 struct traits_EllenBinTreeMap_stat_shb : public traits_EllenBinTreeMap_stat
1711 typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1713 typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_stat_shb > EllenBinTreeMap_rcu_shb_stat;
1715 struct traits_EllenBinTreeMap_stat_sht : public traits_EllenBinTreeMap_stat
1717 typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1719 typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_stat_sht > EllenBinTreeMap_rcu_sht_stat;
1722 // ***************************************************************************
1723 // BronsonAVLTreeMap
1724 typedef cds::memory::vyukov_queue_pool< std::mutex > BronsonAVLTreeMap_simple_pool;
1725 typedef cds::memory::lazy_vyukov_queue_pool< std::mutex > BronsonAVLTreeMap_lazy_pool;
1726 typedef cds::memory::bounded_vyukov_queue_pool< std::mutex > BronsonAVLTreeMap_bounded_pool;
1728 struct BronsonAVLTreeMap_less: public
1729 cc::bronson_avltree::make_traits<
1731 ,cc::bronson_avltree::relaxed_insert< false >
1732 ,co::item_counter< cds::atomicity::item_counter >
1735 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less > BronsonAVLTreeMap_rcu_gpi_less;
1736 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less > BronsonAVLTreeMap_rcu_gpb_less;
1737 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less > BronsonAVLTreeMap_rcu_gpt_less;
1738 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1739 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less > BronsonAVLTreeMap_rcu_shb_less;
1740 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less > BronsonAVLTreeMap_rcu_sht_less;
1742 struct BronsonAVLTreeMap_cmp_stat: public
1743 cc::bronson_avltree::make_traits<
1744 co::compare< compare >
1745 ,cc::bronson_avltree::relaxed_insert< false >
1746 ,co::item_counter< cds::atomicity::item_counter >
1747 ,co::stat< cc::bronson_avltree::stat<>>
1750 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_cmp_stat > BronsonAVLTreeMap_rcu_gpi_cmp_stat;
1751 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_cmp_stat > BronsonAVLTreeMap_rcu_gpb_cmp_stat;
1752 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_cmp_stat > BronsonAVLTreeMap_rcu_gpt_cmp_stat;
1753 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1754 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_cmp_stat > BronsonAVLTreeMap_rcu_shb_cmp_stat;
1755 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_cmp_stat > BronsonAVLTreeMap_rcu_sht_cmp_stat;
1758 struct BronsonAVLTreeMap_less_pool_simple: public BronsonAVLTreeMap_less
1760 typedef cds::sync::pool_monitor<BronsonAVLTreeMap_simple_pool> sync_monitor;
1762 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less_pool_simple > BronsonAVLTreeMap_rcu_gpi_less_pool_simple;
1763 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less_pool_simple > BronsonAVLTreeMap_rcu_gpb_less_pool_simple;
1764 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less_pool_simple > BronsonAVLTreeMap_rcu_gpt_less_pool_simple;
1765 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1766 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less_pool_simple > BronsonAVLTreeMap_rcu_shb_less_pool_simple;
1767 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less_pool_simple > BronsonAVLTreeMap_rcu_sht_less_pool_simple;
1769 struct BronsonAVLTreeMap_less_pool_simple_stat : public BronsonAVLTreeMap_less
1771 typedef cc::bronson_avltree::stat<> stat;
1772 typedef cds::sync::pool_monitor<BronsonAVLTreeMap_simple_pool, cds::opt::none, true > sync_monitor;
1774 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less_pool_simple_stat > BronsonAVLTreeMap_rcu_gpi_less_pool_simple_stat;
1775 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less_pool_simple_stat > BronsonAVLTreeMap_rcu_gpb_less_pool_simple_stat;
1776 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less_pool_simple_stat > BronsonAVLTreeMap_rcu_gpt_less_pool_simple_stat;
1777 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1778 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less_pool_simple_stat > BronsonAVLTreeMap_rcu_shb_less_pool_simple_stat;
1779 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less_pool_simple_stat > BronsonAVLTreeMap_rcu_sht_less_pool_simple_stat;
1781 struct BronsonAVLTreeMap_less_pool_lazy: public BronsonAVLTreeMap_less
1783 typedef cds::sync::pool_monitor<BronsonAVLTreeMap_lazy_pool> sync_monitor;
1784 static CDS_CONSTEXPR bool const relaxed_insert = true;
1786 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less_pool_lazy > BronsonAVLTreeMap_rcu_gpi_less_pool_lazy;
1787 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less_pool_lazy > BronsonAVLTreeMap_rcu_gpb_less_pool_lazy;
1788 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less_pool_lazy > BronsonAVLTreeMap_rcu_gpt_less_pool_lazy;
1789 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1790 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less_pool_lazy > BronsonAVLTreeMap_rcu_shb_less_pool_lazy;
1791 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less_pool_lazy > BronsonAVLTreeMap_rcu_sht_less_pool_lazy;
1793 struct BronsonAVLTreeMap_less_pool_lazy_stat : public BronsonAVLTreeMap_less
1795 typedef cc::bronson_avltree::stat<> stat;
1796 typedef cds::sync::pool_monitor<BronsonAVLTreeMap_lazy_pool, cds::opt::none, true > sync_monitor;
1797 static CDS_CONSTEXPR bool const relaxed_insert = true;
1799 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less_pool_lazy_stat > BronsonAVLTreeMap_rcu_gpi_less_pool_lazy_stat;
1800 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less_pool_lazy_stat > BronsonAVLTreeMap_rcu_gpb_less_pool_lazy_stat;
1801 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less_pool_lazy_stat > BronsonAVLTreeMap_rcu_gpt_less_pool_lazy_stat;
1802 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1803 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less_pool_lazy_stat > BronsonAVLTreeMap_rcu_shb_less_pool_lazy_stat;
1804 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less_pool_lazy_stat > BronsonAVLTreeMap_rcu_sht_less_pool_lazy_stat;
1806 struct BronsonAVLTreeMap_less_pool_bounded: public BronsonAVLTreeMap_less
1808 typedef cds::sync::pool_monitor<BronsonAVLTreeMap_bounded_pool> sync_monitor;
1809 static CDS_CONSTEXPR bool const relaxed_insert = true;
1811 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less_pool_bounded > BronsonAVLTreeMap_rcu_gpi_less_pool_bounded;
1812 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less_pool_bounded > BronsonAVLTreeMap_rcu_gpb_less_pool_bounded;
1813 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less_pool_bounded > BronsonAVLTreeMap_rcu_gpt_less_pool_bounded;
1814 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1815 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less_pool_bounded > BronsonAVLTreeMap_rcu_shb_less_pool_bounded;
1816 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less_pool_bounded > BronsonAVLTreeMap_rcu_sht_less_pool_bounded;
1818 struct BronsonAVLTreeMap_less_pool_bounded_stat : public BronsonAVLTreeMap_less
1820 typedef cc::bronson_avltree::stat<> stat;
1821 typedef cds::sync::pool_monitor<BronsonAVLTreeMap_bounded_pool, cds::opt::none, true > sync_monitor;
1822 static CDS_CONSTEXPR bool const relaxed_insert = true;
1824 typedef cc::BronsonAVLTreeMap< rcu_gpi, Key, Value, BronsonAVLTreeMap_less_pool_bounded_stat > BronsonAVLTreeMap_rcu_gpi_less_pool_bounded_stat;
1825 typedef cc::BronsonAVLTreeMap< rcu_gpb, Key, Value, BronsonAVLTreeMap_less_pool_bounded_stat > BronsonAVLTreeMap_rcu_gpb_less_pool_bounded_stat;
1826 typedef cc::BronsonAVLTreeMap< rcu_gpt, Key, Value, BronsonAVLTreeMap_less_pool_bounded_stat > BronsonAVLTreeMap_rcu_gpt_less_pool_bounded_stat;
1827 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1828 typedef cc::BronsonAVLTreeMap< rcu_shb, Key, Value, BronsonAVLTreeMap_less_pool_bounded_stat > BronsonAVLTreeMap_rcu_shb_less_pool_bounded_stat;
1829 typedef cc::BronsonAVLTreeMap< rcu_sht, Key, Value, BronsonAVLTreeMap_less_pool_bounded_stat > BronsonAVLTreeMap_rcu_sht_less_pool_bounded_stat;
1832 // ***************************************************************************
1833 // Standard implementations
1835 typedef StdMap< Key, Value, cds::sync::spin > StdMap_Spin;
1836 typedef StdMap< Key, Value, lock::NoLock> StdMap_NoLock;
1838 typedef StdHashMap< Key, Value, cds::sync::spin > StdHashMap_Spin;
1839 typedef StdHashMap< Key, Value, lock::NoLock > StdHashMap_NoLock;
1843 template <typename Map>
1844 static inline void print_stat( Map const& /*m*/ )
1847 template <typename Map>
1848 static inline void check_before_cleanup( Map& /*m*/ )
1851 template <typename Map>
1852 static inline void additional_cleanup( Map& /*m*/ )
1855 template <typename Map>
1856 static inline void additional_check( Map& /*m*/ )
1860 template <typename K, typename T, typename Traits >
1861 static inline void print_stat( cc::CuckooMap< K, T, Traits > const& m )
1863 CPPUNIT_MSG( m.statistics() << m.mutex_policy_statistics() );
1866 template <typename GC, typename K, typename T, typename Traits >
1867 static inline void print_stat( cc::SkipListMap< GC, K, T, Traits > const& m )
1869 CPPUNIT_MSG( m.statistics() );
1872 template <typename GC, typename K, typename T, typename Traits >
1873 static inline void print_stat( cc::SplitListMap< GC, K, T, Traits > const& m )
1875 CPPUNIT_MSG( m.statistics() );
1879 template <typename GC, typename Key, typename T, typename Traits>
1880 static inline void print_stat( cc::EllenBinTreeMap<GC, Key, T, Traits> const& s )
1882 CPPUNIT_MSG( s.statistics() );
1884 template <typename GC, typename Key, typename T, typename Traits>
1885 static inline void additional_cleanup( cc::EllenBinTreeMap<GC, Key, T, Traits>& /*s*/ )
1887 ellen_bintree_pool::internal_node_counter::reset();
1889 namespace ellen_bintree_check {
1890 static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& /*s*/ )
1892 // This check is not valid for thread-based RCU
1894 CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
1895 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1896 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
1901 static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
1903 CPPUNIT_CHECK_CURRENT_EX( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted,
1904 "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated
1905 << " m_nInternalNodeDeleted=" << stat.m_nInternalNodeDeleted );
1906 CPPUNIT_CHECK_CURRENT_EX( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted,
1907 "m_nUpdateDescCreated=" << stat.m_nUpdateDescCreated
1908 << " m_nUpdateDescDeleted=" << stat.m_nUpdateDescDeleted );
1909 CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated,
1910 "allocated=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1911 << "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated );
1913 } // namespace ellen_bintree_check
1914 template <typename GC, typename Key, typename T, typename Traits>
1915 static inline void additional_check( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
1917 GC::force_dispose();
1918 ellen_bintree_check::check_stat( s.statistics() );
1921 template <typename GC, typename Key, typename T, typename Traits>
1922 static inline void check_before_cleanup( cc::EllenBinTreeMap<GC, Key, T, Traits>& m )
1924 CPPUNIT_MSG( " Check internal consistency (single-threaded)..." );
1925 CPPUNIT_CHECK_CURRENT( m.check_consistency() );
1929 // BronsonAVLTreeMap
1930 template <typename GC, typename Key, typename T, typename Traits>
1931 static inline void print_stat( cc::BronsonAVLTreeMap<GC, Key, T, Traits> const& m )
1933 CPPUNIT_MSG( m.statistics() );
1934 CPPUNIT_MSG( m.monitor().statistics() );
1937 template <typename GC, typename Key, typename T, typename Traits>
1938 static inline void check_before_cleanup( cc::BronsonAVLTreeMap<GC, Key, T, Traits>& m )
1940 CPPUNIT_MSG( " Check internal consistency (single-threaded)..." );
1941 bool bOk = m.check_consistency([]( size_t nLevel, size_t hLeft, size_t hRight )
1943 CPPUNIT_MSG( "Tree violation on level=" << nLevel << ": hLeft=" << hLeft << ", hRight=" << hRight )
1945 CPPUNIT_CHECK_CURRENT_EX( bOk, "check_consistency failed");
1948 template <typename K, typename V, typename Traits>
1949 static inline void print_stat( CuckooMap< K, V, Traits > const& m )
1951 typedef CuckooMap< K, V, Traits > map_type;
1952 print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
1956 #endif // ifndef CDSUNIT_MAP_TYPES_H