EllenBinTree refactoring
[libcds.git] / tests / unit / map2 / map_types.h
1 //$$CDS-header$$
2
3 #ifndef _CDSUNIT_MAP2_MAP_TYPES_H
4 #define _CDSUNIT_MAP2_MAP_TYPES_H
5
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>
11
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>
16
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>
21
22 #include <cds/container/michael_map.h>
23 #include <cds/container/michael_map_rcu.h>
24 #include <cds/container/michael_map_nogc.h>
25
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>
29
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>
34
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>
39
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>
43
44 #include <boost/version.hpp>
45 #if BOOST_VERSION >= 104800
46 #   include <cds/container/striped_map/boost_list.h>
47 #   include <cds/container/striped_map/boost_slist.h>
48 #   include <cds/container/striped_map/boost_map.h>
49 #   include <cds/container/striped_map/boost_flat_map.h>
50 #endif
51 #include <cds/container/striped_map/boost_unordered_map.h>
52 #include <cds/container/striped_map.h>
53
54 #include <cds/lock/spinlock.h>
55
56 #include "cppunit/cppunit_mini.h"
57 #include "lock/nolock.h"
58 #include "map2/std_map.h"
59 #include "map2/std_hash_map.h"
60 #include "michael_alloc.h"
61 #include "print_cuckoo_stat.h"
62 #include "print_split_list_stat.h"
63 #include "print_skip_list_stat.h"
64 #include "print_ellenbintree_stat.h"
65 #include "ellen_bintree_update_desc_pool.h"
66
67 namespace map2 {
68     namespace cc = cds::container;
69     namespace co = cds::opt;
70
71     typedef cds::urcu::gc< cds::urcu::general_instant<> >   rcu_gpi;
72     typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_gpb;
73     typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_gpt;
74 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
75     typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_shb;
76     typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_sht;
77 #endif
78
79     template <typename Key>
80     struct cmp {
81         int operator ()(Key const& k1, Key const& k2) const
82         {
83             if ( std::less<Key>( k1, k2 ) )
84                 return -1;
85             return std::less<Key>( k2, k1 ) ? 1 : 0;
86         }
87     };
88
89 #define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
90     CDSUNIT_INT_COMPARE(char);
91     CDSUNIT_INT_COMPARE(unsigned char);
92     CDSUNIT_INT_COMPARE(int);
93     CDSUNIT_INT_COMPARE(unsigned int);
94     CDSUNIT_INT_COMPARE(long);
95     CDSUNIT_INT_COMPARE(unsigned long);
96     CDSUNIT_INT_COMPARE(long long);
97     CDSUNIT_INT_COMPARE(unsigned long long);
98 #undef CDSUNIT_INT_COMPARE
99
100     template <>
101     struct cmp<std::string>
102     {
103         int operator()(std::string const& s1, std::string const& s2)
104         {
105             return s1.compare( s2 );
106         }
107         int operator()(std::string const& s1, char const * s2)
108         {
109             return s1.compare( s2 );
110         }
111         int operator()(char const * s1, std::string const& s2)
112         {
113             return -s2.compare( s1 );
114         }
115     };
116
117     template <typename K, typename V, typename... Options>
118     class CuckooStripedMap:
119         public cc::CuckooMap< K, V,
120             typename cc::cuckoo::make_traits<
121                 co::mutex_policy< cc::cuckoo::striping<> >
122                 ,Options...
123             >::type
124         >
125     {
126     public:
127         typedef typename cc::cuckoo::make_traits<
128             co::mutex_policy< cc::cuckoo::striping<> >
129             ,Options...
130         >::type cuckoo_traits;
131
132         typedef cc::CuckooMap< K, V, cuckoo_traits > cuckoo_base_class;
133
134     public:
135         CuckooStripedMap( size_t nCapacity, size_t nLoadFactor )
136             : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
137         {}
138
139         template <typename Q, typename Pred>
140         bool erase_with( Q const& key, Pred pred )
141         {
142             return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
143         }
144     };
145
146     template <typename K, typename V, typename... Options>
147     class CuckooRefinableMap:
148         public cc::CuckooMap< K, V,
149             typename cc::cuckoo::make_traits<
150                 co::mutex_policy< cc::cuckoo::refinable<> >
151                 ,Options...
152             >::type
153         >
154     {
155     public:
156         typedef typename cc::cuckoo::make_traits<
157             co::mutex_policy< cc::cuckoo::refinable<> >
158             ,Options...
159         >::type cuckoo_traits;
160
161         typedef cc::CuckooMap< K, V, cuckoo_traits > cuckoo_base_class;
162
163     public:
164         CuckooRefinableMap( size_t nCapacity, size_t nLoadFactor )
165             : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
166         {}
167
168         template <typename Q, typename Pred>
169         bool erase_with( Q const& key, Pred pred )
170         {
171             return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
172         }
173     };
174
175     template <typename Key, typename Value>
176     struct MapTypes {
177         typedef co::v::hash<Key>    key_hash;
178         typedef std::less<Key>      less;
179         typedef cmp<Key>            compare;
180
181         struct equal_to {
182             bool operator()( Key const& k1, Key const& k2 ) const
183             {
184                 return compare()( k1, k2 ) == 0;
185             }
186         };
187
188         struct hash: public key_hash
189         {
190             size_t operator()( Key const& k ) const
191             {
192                 return key_hash::operator()( k );
193             }
194             template <typename Q>
195             size_t operator()( Q const& k ) const
196             {
197                 return key_hash::operator()( k );
198             }
199         };
200
201         struct hash2: public key_hash
202         {
203             size_t operator()( Key const& k ) const
204             {
205                 size_t seed = ~key_hash::operator ()( k );
206                 boost::hash_combine( seed, k );
207                 return seed;
208             }
209             template <typename Q>
210             size_t operator()( Q const& k ) const
211             {
212                 size_t seed = ~key_hash::operator()( k );
213                 boost::hash_combine( seed, k );
214                 return seed;
215             }
216         };
217
218         // ***************************************************************************
219         // MichaelKVList
220
221         struct traits_MichaelList_cmp_stdAlloc :
222             public cc::michael_list::make_traits<
223                 co::compare< compare >
224             >::type
225         {};
226         typedef cc::MichaelKVList< cds::gc::HP,  Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
227         typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
228         typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_NOGC_cmp_stdAlloc;
229         typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
230         typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
231         typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
232 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
233         typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
234         typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
235 #endif
236
237         struct traits_MichaelList_cmp_stdAlloc_seqcst :
238             public cc::michael_list::make_traits<
239                 co::compare< compare >
240                 ,co::memory_model< co::v::sequential_consistent >
241             >::type
242         {};
243         typedef cc::MichaelKVList< cds::gc::HP,  Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
244         typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
245         typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_NOGC_cmp_stdAlloc_seqcst;
246         typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
247         typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
248         typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
249 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
250         typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
251         typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
252 #endif
253
254         struct traits_MichaelList_cmp_michaelAlloc :
255             public cc::michael_list::make_traits<
256                 co::compare< compare >,
257                 co::allocator< memory::MichaelAllocator<int> >
258             >::type
259         {};
260         typedef cc::MichaelKVList< cds::gc::HP,  Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
261         typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
262         typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_NOGC_cmp_michaelAlloc;
263         typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
264         typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
265         typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
266 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
267         typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
268         typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
269 #endif
270
271         struct traits_MichaelList_less_stdAlloc :
272             public cc::michael_list::make_traits<
273                 co::less< less >
274             >::type
275         {};
276         typedef cc::MichaelKVList< cds::gc::HP,  Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
277         typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
278         typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_NOGC_less_stdAlloc;
279         typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
280         typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
281         typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
282 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
283         typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
284         typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
285 #endif
286
287         struct traits_MichaelList_less_stdAlloc_seqcst :
288             public cc::michael_list::make_traits<
289                 co::less< less >
290                 ,co::memory_model< co::v::sequential_consistent >
291             >::type
292         {};
293         typedef cc::MichaelKVList< cds::gc::HP,  Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
294         typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
295         typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_NOGC_less_stdAlloc_seqcst;
296         typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
297         typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
298         typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
299 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
300         typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
301         typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
302 #endif
303
304         struct traits_MichaelList_less_michaelAlloc :
305             public cc::michael_list::make_traits<
306                 co::less< less >,
307                 co::allocator< memory::MichaelAllocator<int> >
308             >::type
309         {};
310         typedef cc::MichaelKVList< cds::gc::HP,  Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
311         typedef cc::MichaelKVList< cds::gc::DHP, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
312         typedef cc::MichaelKVList< cds::gc::nogc, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_NOGC_less_michaelAlloc;
313         typedef cc::MichaelKVList< rcu_gpi, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
314         typedef cc::MichaelKVList< rcu_gpb, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
315         typedef cc::MichaelKVList< rcu_gpt, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
316 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
317         typedef cc::MichaelKVList< rcu_shb, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
318         typedef cc::MichaelKVList< rcu_sht, Key, Value, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
319 #endif
320
321         template <typename Base>
322         class NogcMapWrapper: public Base
323         {
324             typedef Base    base_class;
325         public:
326             NogcMapWrapper( size_t nMaxItemCount, size_t nLoadFactor )
327                 : base_class( nMaxItemCount, nLoadFactor )
328             {}
329
330             template <typename K>
331             bool insert( K const& key )
332             {
333                 return base_class::insert( key ) != base_class::end();
334             }
335
336             template <typename K, typename V>
337             bool insert( K const& key, V const& val )
338             {
339                 return base_class::insert( key, val ) != base_class::end();
340             }
341
342             template <typename K, typename Func>
343             bool insert_key( K const& key, Func func )
344             {
345                 return base_class::insert_key( key, func ) != base_class::end();
346             }
347
348             template <typename K>
349             bool find( K const& key )
350             {
351                 return base_class::find( key ) != base_class::end();
352             }
353
354             void clear()
355             {
356                 base_class::clear();
357             }
358         };
359
360         template <typename Base>
361         class NogcMapWrapper_dctor: public Base
362         {
363             typedef Base    base_class;
364         public:
365             NogcMapWrapper_dctor()
366             {}
367
368             template <typename K>
369             bool insert( K const& key )
370             {
371                 return base_class::insert( key ) != base_class::end();
372             }
373
374             template <typename K, typename V>
375             bool insert( K const& key, V const& val )
376             {
377                 return base_class::insert( key, val ) != base_class::end();
378             }
379
380             template <typename K, typename Func>
381             bool insert_key( K const& key, Func func )
382             {
383                 return base_class::insert_key( key, func ) != base_class::end();
384             }
385
386             template <typename K>
387             bool find( K const& key )
388             {
389                 return base_class::find( key ) != base_class::end();
390             }
391         };
392
393         // SplitListMap<gc::nogc> has no clear() method
394         template <typename Base>
395         class NogcSplitMapWrapper: public Base
396         {
397             typedef Base    base_class;
398         public:
399             NogcSplitMapWrapper( size_t nMaxItemCount, size_t nLoadFactor )
400                 : base_class( nMaxItemCount, nLoadFactor )
401             {}
402
403             template <typename K>
404             bool insert( K const& key )
405             {
406                 return base_class::insert( key ) != base_class::end();
407             }
408
409             template <typename K, typename V>
410             bool insert( K const& key, V const& val )
411             {
412                 return base_class::insert( key, val ) != base_class::end();
413             }
414
415             template <typename K, typename Func>
416             bool insert_key( K const& key, Func func )
417             {
418                 return base_class::insert_key( key, func ) != base_class::end();
419             }
420
421             template <typename K>
422             bool find( K const& key )
423             {
424                 return base_class::find( key ) != base_class::end();
425             }
426
427             void clear()
428             {}
429         };
430
431
432         // ***************************************************************************
433         // MichaelHashMap based on MichaelKVList
434
435         struct traits_MichaelMap_hash :
436             public cc::michael_map::make_traits<
437                 co::hash< hash >
438             >::type
439         {};
440         typedef cc::MichaelHashMap< cds::gc::HP,  MichaelList_HP_cmp_stdAlloc,  traits_MichaelMap_hash > MichaelMap_HP_cmp_stdAlloc;
441         typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_DHP_cmp_stdAlloc;
442         typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_NOGC_cmp_stdAlloc;
443         typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPI_cmp_stdAlloc;
444         typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPB_cmp_stdAlloc;
445         typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPT_cmp_stdAlloc;
446 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
447         typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHB_cmp_stdAlloc;
448         typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHT_cmp_stdAlloc;
449 #endif
450
451         typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_HP_less_stdAlloc;
452         typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_DHP_less_stdAlloc;
453         typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_NOGC_less_stdAlloc;
454         typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPI_less_stdAlloc;
455         typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPB_less_stdAlloc;
456         typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_GPT_less_stdAlloc;
457 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
458         typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHB_less_stdAlloc;
459         typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_RCU_SHT_less_stdAlloc;
460 #endif
461
462         typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_HP_cmp_stdAlloc_seqcst;
463         typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_DHP_cmp_stdAlloc_seqcst;
464         typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_NOGC_cmp_stdAlloc_seqcst;
465         typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPI_cmp_stdAlloc_seqcst;
466         typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPB_cmp_stdAlloc_seqcst;
467         typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPT_cmp_stdAlloc_seqcst;
468 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
469         typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHB_cmp_stdAlloc_seqcst;
470         typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHT_cmp_stdAlloc_seqcst;
471 #endif
472
473         typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_HP_less_stdAlloc_seqcst;
474         typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_DHP_less_stdAlloc_seqcst;
475         typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_NOGC_less_stdAlloc_seqcst;
476         typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPI_less_stdAlloc_seqcst;
477         typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPB_less_stdAlloc_seqcst;
478         typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_GPT_less_stdAlloc_seqcst;
479 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
480         typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHB_less_stdAlloc_seqcst;
481         typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_RCU_SHT_less_stdAlloc_seqcst;
482 #endif
483
484         struct traits_MichaelSet_michaelAlloc :
485             public traits_MichaelMap_hash
486         {
487             typedef memory::MichaelAllocator<int> allocator;
488         };
489         typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_HP_cmp_michaelAlloc;
490         typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_DHP_cmp_michaelAlloc;
491         typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_NOGC_cmp_michaelAlloc;
492         typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPI_cmp_michaelAlloc;
493         typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPB_cmp_michaelAlloc;
494         typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPT_cmp_michaelAlloc;
495 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
496         typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHB_cmp_michaelAlloc;
497         typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHT_cmp_michaelAlloc;
498 #endif
499         typedef cc::MichaelHashMap< cds::gc::HP, MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_HP_less_michaelAlloc;
500         typedef cc::MichaelHashMap< cds::gc::DHP, MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_DHP_less_michaelAlloc;
501         typedef cc::MichaelHashMap< cds::gc::nogc, MichaelList_NOGC_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_NOGC_less_michaelAlloc;
502         typedef cc::MichaelHashMap< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPI_less_michaelAlloc;
503         typedef cc::MichaelHashMap< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPB_less_michaelAlloc;
504         typedef cc::MichaelHashMap< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_GPT_less_michaelAlloc;
505 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
506         typedef cc::MichaelHashMap< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHB_less_michaelAlloc;
507         typedef cc::MichaelHashMap< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_RCU_SHT_less_michaelAlloc;
508 #endif
509
510         // ***************************************************************************
511         // LazyKVList
512
513         struct traits_LazyList_cmp_stdAlloc :
514             public cc::lazy_list::make_traits<
515                 co::compare< compare >
516             >::type
517         {};
518         typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
519         typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
520         typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_NOGC_cmp_stdAlloc;
521         typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
522         typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
523         typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
524 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
525         typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
526         typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
527 #endif
528
529         struct traits_LazyList_cmp_stdAlloc_seqcst :
530             public cc::lazy_list::make_traits<
531                 co::compare< compare >
532                 ,co::memory_model< co::v::sequential_consistent >
533             >::type
534         {};
535         typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
536         typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
537         typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_NOGC_cmp_stdAlloc_seqcst;
538         typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
539         typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
540         typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
541 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
542         typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
543         typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
544 #endif
545
546         struct traits_LazyList_cmp_michaelAlloc :
547             public cc::lazy_list::make_traits<
548                 co::compare< compare >,
549                 co::allocator< memory::MichaelAllocator<int> >
550             >::type
551         {};
552         typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
553         typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
554         typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_NOGC_cmp_michaelAlloc;
555         typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
556         typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
557         typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
558 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
559         typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
560         typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
561 #endif
562         struct traits_LazyList_less_stdAlloc :
563             public cc::lazy_list::make_traits<
564                 co::less< less >
565             >::type
566         {};
567         typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
568         typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
569         typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_less_stdAlloc > LazyList_NOGC_less_stdAlloc;
570         typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
571         typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
572         typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
573 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
574         typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
575         typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
576 #endif
577
578         struct traits_LazyList_less_stdAlloc_seqcst :
579             public cc::lazy_list::make_traits<
580                 co::less< less >
581                 ,co::memory_model< co::v::sequential_consistent >
582             >::type
583         {};
584         typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
585         typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
586         typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_NOGC_less_stdAlloc_seqcst;
587         typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
588         typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
589         typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
590 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
591         typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
592         typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
593 #endif
594
595         struct traits_LazyList_less_michaelAlloc :
596             public cc::lazy_list::make_traits<
597                 co::less< less >,
598                 co::allocator< memory::MichaelAllocator<int> >
599             >::type
600         {};
601         typedef cc::LazyKVList< cds::gc::HP, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
602         typedef cc::LazyKVList< cds::gc::DHP, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
603         typedef cc::LazyKVList< cds::gc::nogc, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_NOGC_less_michaelAlloc;
604         typedef cc::LazyKVList< rcu_gpi, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
605         typedef cc::LazyKVList< rcu_gpb, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
606         typedef cc::LazyKVList< rcu_gpt, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
607 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
608         typedef cc::LazyKVList< rcu_shb, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
609         typedef cc::LazyKVList< rcu_sht, Key, Value, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
610 #endif
611
612         // ***************************************************************************
613         // MichaelHashMap based on LazyKVList
614         typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_HP_cmp_stdAlloc;
615         typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_cmp_stdAlloc;
616         typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_cmp_stdAlloc;
617         typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc;
618         typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc;
619         typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc;
620 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
621         typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc;
622         typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc;
623 #endif
624
625         typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_HP_less_stdAlloc;
626         typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_less_stdAlloc;
627         typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_less_stdAlloc;
628         typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_less_stdAlloc;
629         typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_less_stdAlloc;
630         typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_less_stdAlloc;
631 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
632         typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_less_stdAlloc;
633         typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_stdAlloc, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_less_stdAlloc;
634 #endif
635
636         typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_HP_cmp_stdAlloc_seqcst;
637         typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_cmp_stdAlloc_seqcst;
638         typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_cmp_stdAlloc_seqcst;
639         typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_cmp_stdAlloc_seqcst;
640         typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_cmp_stdAlloc_seqcst;
641         typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_cmp_stdAlloc_seqcst;
642 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
643         typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_cmp_stdAlloc_seqcst;
644         typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_cmp_stdAlloc_seqcst;
645 #endif
646
647         typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_HP_less_stdAlloc_seqcst;
648         typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_DHP_less_stdAlloc_seqcst;
649         typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_NOGC_less_stdAlloc_seqcst;
650         typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPI_less_stdAlloc_seqcst;
651         typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPB_less_stdAlloc_seqcst;
652         typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_GPT_less_stdAlloc_seqcst;
653 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
654         typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHB_less_stdAlloc_seqcst;
655         typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelMap_hash > MichaelMap_Lazy_RCU_SHT_less_stdAlloc_seqcst;
656 #endif
657
658         typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_HP_cmp_michaelAlloc;
659         typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_DHP_cmp_michaelAlloc;
660         typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_NOGC_cmp_michaelAlloc;
661         typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPI_cmp_michaelAlloc;
662         typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPB_cmp_michaelAlloc;
663         typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPT_cmp_michaelAlloc;
664 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
665         typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHB_cmp_michaelAlloc;
666         typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHT_cmp_michaelAlloc;
667 #endif
668         typedef cc::MichaelHashMap< cds::gc::HP, LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_HP_less_michaelAlloc;
669         typedef cc::MichaelHashMap< cds::gc::DHP, LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_DHP_less_michaelAlloc;
670         typedef cc::MichaelHashMap< cds::gc::nogc, LazyList_NOGC_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_NOGC_less_michaelAlloc;
671         typedef cc::MichaelHashMap< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPI_less_michaelAlloc;
672         typedef cc::MichaelHashMap< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPB_less_michaelAlloc;
673         typedef cc::MichaelHashMap< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_GPT_less_michaelAlloc;
674 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
675         typedef cc::MichaelHashMap< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHB_less_michaelAlloc;
676         typedef cc::MichaelHashMap< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelMap_Lazy_RCU_SHT_less_michaelAlloc;
677 #endif
678
679         // ***************************************************************************
680         // SplitListMap based on MichaelList
681
682         // HP
683         struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
684                 cc::split_list::ordered_list<cc::michael_list_tag>
685                 ,co::hash< hash >
686                 ,cc::split_list::ordered_list_traits<
687                     typename cc::michael_list::make_traits<
688                         co::compare< compare >
689                     >::type
690                 >
691             >::type
692         {};
693         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
694         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
695         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp >> SplitList_Michael_NOGC_dyn_cmp;
696         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
697         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
698         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
699 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
700         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
701         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
702 #endif
703
704         struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
705         {
706             typedef cc::split_list::stat<> stat;
707         };
708         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
709         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
710         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat >> SplitList_Michael_NOGC_dyn_cmp_stat;
711         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
712         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
713         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
714 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
715         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
716         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
717 #endif
718
719         struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
720                 cc::split_list::ordered_list<cc::michael_list_tag>
721                 ,co::hash< hash >
722                 ,co::memory_model< co::v::sequential_consistent >
723                 ,cc::split_list::ordered_list_traits<
724                     typename cc::michael_list::make_traits<
725                         co::compare< compare >
726                         ,co::memory_model< co::v::sequential_consistent >
727                     >::type
728                 >
729             >::type
730         {};
731         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
732         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
733         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst >> SplitList_Michael_NOGC_dyn_cmp_seqcst;
734         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
735         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
736         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
737 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
738         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
739         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
740 #endif
741
742         struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
743                 cc::split_list::ordered_list<cc::michael_list_tag>
744                 ,cc::split_list::dynamic_bucket_table< false >
745                 ,co::hash< hash >
746                 ,cc::split_list::ordered_list_traits<
747                     typename cc::michael_list::make_traits<
748                         co::compare< compare >
749                     >::type
750                 >
751             >::type
752         {};
753         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
754         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
755         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp >> SplitList_Michael_NOGC_st_cmp;
756         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
757         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
758         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
759 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
760         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
761         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
762 #endif
763
764         struct traits_SplitList_Michael_st_cmp_seqcst: public cc::split_list::make_traits<
765                 cc::split_list::ordered_list<cc::michael_list_tag>
766                 ,co::hash< hash >
767                 ,cc::split_list::dynamic_bucket_table< false >
768                 ,co::memory_model< co::v::sequential_consistent >
769                 ,cc::split_list::ordered_list_traits<
770                     typename cc::michael_list::make_traits<
771                         co::compare< compare >
772                         ,co::memory_model< co::v::sequential_consistent >
773                     >::type
774                 >
775             >::type
776         {};
777         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_HP_st_cmp_seqcst;
778         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_DHP_st_cmp_seqcst;
779         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp_seqcst >> SplitList_Michael_NOGC_st_cmp_seqcst;
780         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPI_st_cmp_seqcst;
781         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPB_st_cmp_seqcst;
782         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPT_st_cmp_seqcst;
783 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
784         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHB_st_cmp_seqcst;
785         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHT_st_cmp_seqcst;
786 #endif
787
788         //HP + less
789         struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
790                 cc::split_list::ordered_list<cc::michael_list_tag>
791                 ,co::hash< hash >
792                 ,cc::split_list::ordered_list_traits<
793                     typename cc::michael_list::make_traits<
794                         co::less< less >
795                     >::type
796                 >
797             >::type
798         {};
799         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
800         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
801         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less >> SplitList_Michael_NOGC_dyn_less;
802         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
803         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
804         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
805 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
806         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
807         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
808 #endif
809
810
811         struct traits_SplitList_Michael_dyn_less_seqcst: public cc::split_list::make_traits<
812                 cc::split_list::ordered_list<cc::michael_list_tag>
813                 ,co::hash< hash >
814                 ,co::memory_model< co::v::sequential_consistent >
815                 ,cc::split_list::ordered_list_traits<
816                     typename cc::michael_list::make_traits<
817                         co::less< less >
818                         ,co::memory_model< co::v::sequential_consistent >
819                     >::type
820                 >
821             >::type
822         {};
823         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
824         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
825         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less_seqcst >> SplitList_Michael_NOGC_dyn_less_seqcst;
826         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
827         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
828         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
829 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
830         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
831         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
832 #endif
833
834         struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
835                 cc::split_list::ordered_list<cc::michael_list_tag>
836                 ,cc::split_list::dynamic_bucket_table< false >
837                 ,co::hash< hash >
838                 ,cc::split_list::ordered_list_traits<
839                     typename cc::michael_list::make_traits<
840                         co::less< less >
841                     >::type
842                 >
843             >::type
844         {};
845         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
846         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
847         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less >> SplitList_Michael_NOGC_st_less;
848         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
849         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
850         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
851 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
852         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
853         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
854 #endif
855
856         struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
857         {
858             typedef cc::split_list::stat<> stat;
859         };
860         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
861         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
862         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat >> SplitList_Michael_NOGC_st_less_stat;
863         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
864         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
865         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
866 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
867         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
868         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
869 #endif
870
871
872         class traits_SplitList_Michael_st_less_seqcst: public cc::split_list::make_traits<
873                 cc::split_list::ordered_list<cc::michael_list_tag>
874                 ,co::hash< hash >
875                 ,cc::split_list::dynamic_bucket_table< false >
876                 ,co::memory_model< co::v::sequential_consistent >
877                 ,cc::split_list::ordered_list_traits<
878                     typename cc::michael_list::make_traits<
879                         co::less< less >
880                         ,co::memory_model< co::v::sequential_consistent >
881                     >::type
882                 >
883             >::type
884         {};
885         typedef cc::SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
886         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
887         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_seqcst >> SplitList_Michael_NOGC_st_less_seqcst;
888         typedef cc::SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
889         typedef cc::SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
890         typedef cc::SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
891 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
892         typedef cc::SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
893         typedef cc::SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
894 #endif
895
896
897         // ***************************************************************************
898         // SplitListMap based on LazyKVList
899
900         struct SplitList_Lazy_dyn_cmp :
901             public cc::split_list::make_traits<
902                 cc::split_list::ordered_list<cc::lazy_list_tag>
903                 ,co::hash< hash >
904                 ,cc::split_list::ordered_list_traits<
905                     typename cc::lazy_list::make_traits<
906                         co::compare< compare >
907                     >::type
908                 >
909             >::type
910         {};
911         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
912         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
913         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp >> SplitList_Lazy_NOGC_dyn_cmp;
914         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
915         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
916         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
917 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
918         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
919         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
920 #endif
921
922         struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
923         {
924             typedef cc::split_list::stat<> stat;
925         };
926         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
927         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
928         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat >> SplitList_Lazy_NOGC_dyn_cmp_stat;
929         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
930         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
931         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
932 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
933         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
934         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
935 #endif
936
937         struct SplitList_Lazy_dyn_cmp_seqcst :
938             public cc::split_list::make_traits<
939                 cc::split_list::ordered_list<cc::lazy_list_tag>
940                 ,co::hash< hash >
941                 ,co::memory_model< co::v::sequential_consistent >
942                 ,cc::split_list::ordered_list_traits<
943                     typename cc::lazy_list::make_traits<
944                         co::compare< compare >
945                         ,co::memory_model< co::v::sequential_consistent >
946                     >::type
947                 >
948             >::type
949         {};
950         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
951         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
952         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst >> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
953         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
954         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
955         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
956 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
957         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
958         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
959 #endif
960
961         struct SplitList_Lazy_st_cmp :
962             public cc::split_list::make_traits<
963                 cc::split_list::ordered_list<cc::lazy_list_tag>
964                 ,cc::split_list::dynamic_bucket_table< false >
965                 ,co::hash< hash >
966                 ,cc::split_list::ordered_list_traits<
967                     typename cc::lazy_list::make_traits<
968                         co::compare< compare >
969                     >::type
970                 >
971             >::type
972         {};
973         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
974         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
975         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp >> SplitList_Lazy_NOGC_st_cmp;
976         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
977         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
978         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
979 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
980         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
981         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
982 #endif
983
984
985         struct SplitList_Lazy_st_cmp_seqcst :
986             public cc::split_list::make_traits<
987                 cc::split_list::ordered_list<cc::lazy_list_tag>
988                 ,co::hash< hash >
989                 ,cc::split_list::dynamic_bucket_table< false >
990                 ,co::memory_model< co::v::sequential_consistent >
991                 ,cc::split_list::ordered_list_traits<
992                     typename cc::lazy_list::make_traits<
993                         co::compare< compare >
994                         ,co::memory_model< co::v::sequential_consistent >
995                     >::type
996                 >
997             >::type
998         {};
999         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_HP_st_cmp_seqcst;
1000         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_DHP_st_cmp_seqcst;
1001         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp_seqcst >> SplitList_Lazy_NOGC_st_cmp_seqcst;
1002         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
1003         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
1004         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
1005 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1006         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
1007         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
1008 #endif
1009
1010
1011         struct SplitList_Lazy_dyn_less :
1012             public cc::split_list::make_traits<
1013                 cc::split_list::ordered_list<cc::lazy_list_tag>
1014                 ,co::hash< hash >
1015                 ,cc::split_list::ordered_list_traits<
1016                     typename cc::lazy_list::make_traits<
1017                         co::less< less >
1018                     >::type
1019                 >
1020             >::type
1021         {};
1022         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
1023         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
1024         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less >> SplitList_Lazy_NOGC_dyn_less;
1025         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
1026         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
1027         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
1028 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1029         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
1030         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
1031 #endif
1032
1033         struct SplitList_Lazy_dyn_less_seqcst:
1034             public cc::split_list::make_traits<
1035                 cc::split_list::ordered_list<cc::lazy_list_tag>
1036                 ,co::hash< hash >
1037                 ,co::memory_model< co::v::sequential_consistent >
1038                 ,cc::split_list::ordered_list_traits<
1039                     typename cc::lazy_list::make_traits<
1040                         co::less< less >
1041                         ,co::memory_model< co::v::sequential_consistent >
1042                     >::type
1043                 >
1044             >::type
1045         {};
1046         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
1047         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
1048         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less_seqcst >> SplitList_Lazy_NOGC_dyn_less_seqcst;
1049         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
1050         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
1051         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
1052 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1053         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
1054         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
1055 #endif
1056
1057         struct SplitList_Lazy_st_less :
1058             public cc::split_list::make_traits<
1059                 cc::split_list::ordered_list<cc::lazy_list_tag>
1060                 ,cc::split_list::dynamic_bucket_table< false >
1061                 ,co::hash< hash >
1062                 ,cc::split_list::ordered_list_traits<
1063                     typename cc::lazy_list::make_traits<
1064                         co::less< less >
1065                     >::type
1066                 >
1067             >::type
1068         {};
1069         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
1070         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
1071         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less >> SplitList_Lazy_NOGC_st_less;
1072         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
1073         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
1074         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
1075 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1076         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
1077         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
1078 #endif
1079
1080         struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
1081         {
1082             typedef cc::split_list::stat<> stat;
1083         };
1084         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
1085         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
1086         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat >> SplitList_Lazy_NOGC_st_less_stat;
1087         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
1088         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
1089         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
1090 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1091         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
1092         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
1093 #endif
1094
1095         struct SplitList_Lazy_st_less_seqcst :
1096             public cc::split_list::make_traits<
1097                 cc::split_list::ordered_list<cc::lazy_list_tag>
1098                 ,co::hash< hash >
1099                 ,cc::split_list::dynamic_bucket_table< false >
1100                 ,co::memory_model< co::v::sequential_consistent >
1101                 ,cc::split_list::ordered_list_traits<
1102                     typename cc::lazy_list::make_traits<
1103                         co::less< less >
1104                         ,co::memory_model< co::v::sequential_consistent >
1105                     >::type
1106                 >
1107             >::type
1108         {};
1109         typedef cc::SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
1110         typedef cc::SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
1111         typedef NogcSplitMapWrapper< cc::SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_seqcst >> SplitList_Lazy_NOGC_st_less_seqcst;
1112         typedef cc::SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
1113         typedef cc::SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
1114         typedef cc::SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
1115 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1116         typedef cc::SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
1117         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
1118 #endif
1119
1120
1121
1122         // ***************************************************************************
1123         // StripedHashMap
1124
1125         // for sequential containers
1126         template <class BucketEntry, typename... Options>
1127         class StripedHashMap_seq:
1128             public cc::StripedMap< BucketEntry,
1129                 co::mutex_policy< cc::striped_set::striping<> >
1130                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1131                 , Options...
1132             >
1133         {
1134             typedef cc::StripedMap< BucketEntry,
1135                 co::mutex_policy< cc::striped_set::striping<> >
1136                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1137                 , Options...
1138             > base_class;
1139             typedef typename base_class::resizing_policy resizing_policy_t;
1140
1141             resizing_policy_t   m_placeHolder;
1142         public:
1143             StripedHashMap_seq( size_t nCapacity, size_t nLoadFactor )
1144                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1145             {}
1146         };
1147
1148         // for non-sequential ordered containers
1149         template <class BucketEntry, typename... Options>
1150         class StripedHashMap_ord:
1151             public cc::StripedMap< BucketEntry,
1152                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1153                 ,co::mutex_policy< cc::striped_set::striping<> >
1154                 , Options...
1155             >
1156         {
1157             typedef cc::StripedMap< BucketEntry,
1158                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1159                 ,co::mutex_policy< cc::striped_set::striping<> >
1160                 , Options...
1161             > base_class;
1162             typedef typename base_class::resizing_policy resizing_policy_t;
1163
1164             resizing_policy_t   m_placeHolder;
1165         public:
1166             StripedHashMap_ord( size_t nCapacity, size_t nLoadFactor )
1167                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1168             {}
1169         };
1170
1171
1172         typedef StripedHashMap_seq<
1173             std::list< std::pair< Key const, Value > >
1174             , co::hash< hash2 >
1175             , co::less< less >
1176         > StripedMap_list;
1177
1178 #if (CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)) && _MSC_VER < 1600
1179         typedef StripedHashMap_ord<
1180             stdext::hash_map< Key, Value, stdext::hash_compare<Key, less > >
1181             , co::hash< hash2 >
1182         > StripedMap_hashmap;
1183 #else
1184         typedef StripedHashMap_ord<
1185             std::unordered_map< Key, Value, hash, equal_to >
1186             , co::hash< hash2 >
1187         > StripedMap_hashmap;
1188 #endif
1189
1190         typedef StripedHashMap_ord<
1191             std::map< Key, Value, less >
1192             , co::hash< hash2 >
1193         > StripedMap_map;
1194
1195         typedef StripedHashMap_ord<
1196             boost::unordered_map< Key, Value, hash, equal_to >
1197             , co::hash< hash2 >
1198         > StripedMap_boost_unordered_map;
1199
1200 #if BOOST_VERSION >= 104800
1201         typedef StripedHashMap_seq<
1202             boost::container::slist< std::pair< Key const, Value > >
1203             , co::hash< hash2 >
1204             , co::less< less >
1205         > StripedMap_slist;
1206
1207         typedef StripedHashMap_seq<
1208             boost::container::list< std::pair< Key const, Value > >
1209             , co::hash< hash2 >
1210             , co::less< less >
1211         > StripedMap_boost_list;
1212
1213         typedef StripedHashMap_ord<
1214             boost::container::map< Key, Value, less >
1215             , co::hash< hash2 >
1216         > StripedMap_boost_map;
1217
1218 //#   ifdef CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS
1219         typedef StripedHashMap_ord<
1220             boost::container::flat_map< Key, Value, less >
1221             , co::hash< hash2 >
1222         > StripedMap_boost_flat_map;
1223 //#   endif
1224 #endif  // BOOST_VERSION >= 104800
1225
1226         // ***************************************************************************
1227         // RefinableHashMap
1228
1229         // for sequential containers
1230         template <class BucketEntry, typename... Options>
1231         class RefinableHashMap_seq:
1232             public cc::StripedMap< BucketEntry,
1233                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1234                 ,co::mutex_policy< cc::striped_set::refinable<> >
1235                 , Options...
1236             >
1237         {
1238             typedef cc::StripedMap< BucketEntry,
1239                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1240                 ,co::mutex_policy< cc::striped_set::refinable<> >
1241                 , Options...
1242             > base_class;
1243             typedef typename base_class::resizing_policy resizing_policy_t;
1244
1245             resizing_policy_t   m_placeHolder;
1246         public:
1247             RefinableHashMap_seq( size_t nCapacity, size_t nLoadFactor )
1248                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1249             {}
1250         };
1251
1252         // for non-sequential ordered containers
1253         template <class BucketEntry, typename... Options>
1254         class RefinableHashMap_ord:
1255             public cc::StripedMap< BucketEntry,
1256                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1257                 ,co::mutex_policy< cc::striped_set::refinable<> >
1258                 , Options...
1259             >
1260         {
1261             typedef cc::StripedMap< BucketEntry,
1262                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1263                 ,co::mutex_policy< cc::striped_set::refinable<> >
1264                 , Options...
1265             > base_class;
1266             typedef typename base_class::resizing_policy resizing_policy_t;
1267
1268             resizing_policy_t   m_placeHolder;
1269         public:
1270             RefinableHashMap_ord( size_t nCapacity, size_t nLoadFactor )
1271                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1272             {}
1273         };
1274
1275
1276         typedef RefinableHashMap_seq<
1277             std::list< std::pair< Key const, Value > >
1278             , co::hash< hash2 >
1279             , co::less< less >
1280         > RefinableMap_list;
1281
1282 #if BOOST_VERSION >= 104800
1283         typedef RefinableHashMap_seq<
1284             boost::container::slist< std::pair< Key const, Value > >
1285             , co::hash< hash2 >
1286             , co::less< less >
1287         > RefinableMap_slist;
1288 #endif
1289
1290         typedef RefinableHashMap_ord<
1291             std::map< Key, Value, less >
1292             , co::hash< hash2 >
1293         > RefinableMap_map;
1294
1295         typedef RefinableHashMap_ord<
1296             std::unordered_map< Key, Value, hash, equal_to >
1297             , co::hash< hash2 >
1298         > RefinableMap_hashmap;
1299
1300         typedef RefinableHashMap_ord<
1301             boost::unordered_map< Key, Value, hash, equal_to >
1302             , co::hash< hash2 >
1303         > RefinableMap_boost_unordered_map;
1304
1305 #if BOOST_VERSION >= 104800
1306         typedef RefinableHashMap_seq<
1307             boost::container::list< std::pair< Key const, Value > >
1308             , co::hash< hash2 >
1309             , co::less< less >
1310         > RefinableMap_boost_list;
1311
1312         typedef RefinableHashMap_ord<
1313             boost::container::map< Key, Value, less >
1314             , co::hash< hash2 >
1315         > RefinableMap_boost_map;
1316
1317         typedef RefinableHashMap_ord<
1318             boost::container::flat_map< Key, Value, less >
1319             , co::hash< hash2 >
1320         > RefinableMap_boost_flat_map;
1321 #endif // #if BOOST_VERSION >= 104800
1322
1323
1324         // ***************************************************************************
1325         // CuckooMap
1326
1327         typedef CuckooStripedMap< Key, Value,
1328             cc::cuckoo::probeset_type< cc::cuckoo::list >
1329             ,co::equal_to< equal_to >
1330             ,co::hash< std::tuple< hash, hash2 > >
1331         > CuckooStripedMap_list_unord;
1332
1333         typedef CuckooStripedMap< Key, Value,
1334             cc::cuckoo::probeset_type< cc::cuckoo::list >
1335             ,co::equal_to< equal_to >
1336             ,co::hash< std::tuple< hash, hash2 > >
1337             ,co::stat< cc::cuckoo::stat >
1338         > CuckooStripedMap_list_unord_stat;
1339
1340         typedef CuckooStripedMap< Key, Value,
1341             cc::cuckoo::probeset_type< cc::cuckoo::list >
1342             ,co::equal_to< equal_to >
1343             ,co::hash< std::tuple< hash, hash2 > >
1344             ,cc::cuckoo::store_hash< true >
1345         > CuckooStripedMap_list_unord_storehash;
1346
1347         typedef CuckooStripedMap< Key, Value,
1348             cc::cuckoo::probeset_type< cc::cuckoo::list >
1349             ,co::compare< compare >
1350             ,co::hash< std::tuple< hash, hash2 > >
1351         > CuckooStripedMap_list_ord;
1352
1353         typedef CuckooStripedMap< Key, Value,
1354             cc::cuckoo::probeset_type< cc::cuckoo::list >
1355             ,co::compare< compare >
1356             ,co::hash< std::tuple< hash, hash2 > >
1357             ,co::stat< cc::cuckoo::stat >
1358         > CuckooStripedMap_list_ord_stat;
1359
1360         typedef CuckooStripedMap< Key, Value,
1361             cc::cuckoo::probeset_type< cc::cuckoo::list >
1362             ,co::compare< compare >
1363             ,co::hash< std::tuple< hash, hash2 > >
1364             ,cc::cuckoo::store_hash< true >
1365         > CuckooStripedMap_list_ord_storehash;
1366
1367         typedef CuckooStripedMap< Key, Value,
1368             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1369             ,co::equal_to< equal_to >
1370             ,co::hash< std::tuple< hash, hash2 > >
1371         > CuckooStripedMap_vector_unord;
1372
1373         typedef CuckooStripedMap< Key, Value,
1374             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1375             ,co::equal_to< equal_to >
1376             ,co::hash< std::tuple< hash, hash2 > >
1377             ,co::stat< cc::cuckoo::stat >
1378         > CuckooStripedMap_vector_unord_stat;
1379
1380         typedef CuckooStripedMap< Key, Value,
1381             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1382             ,co::equal_to< equal_to >
1383             ,co::hash< std::tuple< hash, hash2 > >
1384             ,cc::cuckoo::store_hash< true >
1385         > CuckooStripedMap_vector_unord_storehash;
1386
1387         typedef CuckooStripedMap< Key, Value,
1388             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1389             ,co::compare< compare >
1390             ,co::hash< std::tuple< hash, hash2 > >
1391         > CuckooStripedMap_vector_ord;
1392
1393         typedef CuckooStripedMap< Key, Value,
1394             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1395             ,co::compare< compare >
1396             ,co::hash< std::tuple< hash, hash2 > >
1397             ,co::stat< cc::cuckoo::stat >
1398         > CuckooStripedMap_vector_ord_stat;
1399
1400         typedef CuckooStripedMap< Key, Value,
1401             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1402             ,co::compare< compare >
1403             ,co::hash< std::tuple< hash, hash2 > >
1404             ,cc::cuckoo::store_hash< true >
1405         > CuckooStripedMap_vector_ord_storehash;
1406
1407         typedef CuckooRefinableMap< Key, Value,
1408             cc::cuckoo::probeset_type< cc::cuckoo::list >
1409             ,co::equal_to< equal_to >
1410             ,co::hash< std::tuple< hash, hash2 > >
1411         > CuckooRefinableMap_list_unord;
1412
1413         typedef CuckooRefinableMap< Key, Value,
1414             cc::cuckoo::probeset_type< cc::cuckoo::list >
1415             ,co::equal_to< equal_to >
1416             ,co::hash< std::tuple< hash, hash2 > >
1417             ,co::stat< cc::cuckoo::stat >
1418         > CuckooRefinableMap_list_unord_stat;
1419
1420         typedef CuckooRefinableMap< Key, Value,
1421             cc::cuckoo::probeset_type< cc::cuckoo::list >
1422             ,co::equal_to< equal_to >
1423             ,co::hash< std::tuple< hash, hash2 > >
1424             ,cc::cuckoo::store_hash< true >
1425         > CuckooRefinableMap_list_unord_storehash;
1426
1427         typedef CuckooRefinableMap< Key, Value,
1428             cc::cuckoo::probeset_type< cc::cuckoo::list >
1429             ,co::compare< compare >
1430             ,co::hash< std::tuple< hash, hash2 > >
1431         > CuckooRefinableMap_list_ord;
1432
1433         typedef CuckooRefinableMap< Key, Value,
1434             cc::cuckoo::probeset_type< cc::cuckoo::list >
1435             ,co::compare< compare >
1436             ,co::hash< std::tuple< hash, hash2 > >
1437             ,co::stat< cc::cuckoo::stat >
1438         > CuckooRefinableMap_list_ord_stat;
1439
1440         typedef CuckooRefinableMap< Key, Value,
1441             cc::cuckoo::probeset_type< cc::cuckoo::list >
1442             ,co::compare< compare >
1443             ,co::hash< std::tuple< hash, hash2 > >
1444             ,cc::cuckoo::store_hash< true >
1445         > CuckooRefinableMap_list_ord_storehash;
1446
1447         typedef CuckooRefinableMap< Key, Value,
1448             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1449             ,co::equal_to< equal_to >
1450             ,co::hash< std::tuple< hash, hash2 > >
1451         > CuckooRefinableMap_vector_unord;
1452
1453         typedef CuckooRefinableMap< Key, Value,
1454             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1455             ,co::equal_to< equal_to >
1456             ,co::hash< std::tuple< hash, hash2 > >
1457             ,co::stat< cc::cuckoo::stat >
1458         > CuckooRefinableMap_vector_unord_stat;
1459
1460         typedef CuckooRefinableMap< Key, Value,
1461             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1462             ,co::equal_to< equal_to >
1463             ,co::hash< std::tuple< hash, hash2 > >
1464             ,cc::cuckoo::store_hash< true >
1465         > CuckooRefinableMap_vector_unord_storehash;
1466
1467         typedef CuckooRefinableMap< Key, Value,
1468             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1469             ,co::compare< compare >
1470             ,co::hash< std::tuple< hash, hash2 > >
1471         > CuckooRefinableMap_vector_ord;
1472
1473         typedef CuckooRefinableMap< Key, Value,
1474             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1475             ,co::compare< compare >
1476             ,co::hash< std::tuple< hash, hash2 > >
1477             ,co::stat< cc::cuckoo::stat >
1478         > CuckooRefinableMap_vector_ord_stat;
1479
1480         typedef CuckooRefinableMap< Key, Value,
1481             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1482             ,co::compare< compare >
1483             ,co::hash< std::tuple< hash, hash2 > >
1484             ,cc::cuckoo::store_hash< true >
1485         > CuckooRefinableMap_vector_ord_storehash;
1486
1487         // ***************************************************************************
1488         // SkipListMap
1489
1490         class traits_SkipListMap_less_pascal: public cc::skip_list::make_traits <
1491                 co::less< less >
1492                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1493                 ,co::item_counter< cds::atomicity::item_counter >
1494             >::type
1495         {};
1496         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_hp_less_pascal;
1497         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_dhp_less_pascal;
1498         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_gpi_less_pascal;
1499         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_gpb_less_pascal;
1500         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_gpt_less_pascal;
1501 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1502         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_shb_less_pascal;
1503         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_pascal > SkipListMap_rcu_sht_less_pascal;
1504 #endif
1505
1506         class traits_SkipListMap_less_pascal_seqcst: public cc::skip_list::make_traits <
1507                 co::less< less >
1508                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1509                 ,co::memory_model< co::v::sequential_consistent >
1510                 ,co::item_counter< cds::atomicity::item_counter >
1511             >::type
1512         {};
1513         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_hp_less_pascal_seqcst;
1514         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_dhp_less_pascal_seqcst;
1515         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_gpi_less_pascal_seqcst;
1516         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_gpb_less_pascal_seqcst;
1517         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_gpt_less_pascal_seqcst;
1518 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1519         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_shb_less_pascal_seqcst;
1520         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_pascal_seqcst > SkipListMap_rcu_sht_less_pascal_seqcst;
1521 #endif
1522
1523         class traits_SkipListMap_less_pascal_stat: public cc::skip_list::make_traits <
1524                 co::less< less >
1525                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1526                 ,co::stat< cc::skip_list::stat<> >
1527                 ,co::item_counter< cds::atomicity::item_counter >
1528             >::type
1529         {};
1530         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_hp_less_pascal_stat;
1531         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_dhp_less_pascal_stat;
1532         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_gpi_less_pascal_stat;
1533         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_gpb_less_pascal_stat;
1534         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_gpt_less_pascal_stat;
1535 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1536         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_shb_less_pascal_stat;
1537         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_pascal_stat > SkipListMap_rcu_sht_less_pascal_stat;
1538 #endif
1539
1540         class traits_SkipListMap_cmp_pascal: public cc::skip_list::make_traits <
1541                 co::compare< compare >
1542                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1543                 ,co::item_counter< cds::atomicity::item_counter >
1544             >::type
1545         {};
1546         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_hp_cmp_pascal;
1547         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_dhp_cmp_pascal;
1548         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_gpi_cmp_pascal;
1549         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_gpb_cmp_pascal;
1550         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_gpt_cmp_pascal;
1551 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1552         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_shb_cmp_pascal;
1553         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_pascal > SkipListMap_rcu_sht_cmp_pascal;
1554 #endif
1555
1556         class traits_SkipListMap_cmp_pascal_stat: public cc::skip_list::make_traits <
1557                 co::compare< compare >
1558                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1559                 ,co::stat< cc::skip_list::stat<> >
1560                 ,co::item_counter< cds::atomicity::item_counter >
1561             >::type
1562         {};
1563         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_hp_cmp_pascal_stat;
1564         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_dhp_cmp_pascal_stat;
1565         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_gpi_cmp_pascal_stat;
1566         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_gpb_cmp_pascal_stat;
1567         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_gpt_cmp_pascal_stat;
1568 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1569         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_shb_cmp_pascal_stat;
1570         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_pascal_stat > SkipListMap_rcu_sht_cmp_pascal_stat;
1571 #endif
1572
1573         class traits_SkipListMap_less_xorshift: public cc::skip_list::make_traits <
1574                 co::less< less >
1575                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1576                 ,co::item_counter< cds::atomicity::item_counter >
1577             >::type
1578         {};
1579         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_hp_less_xorshift;
1580         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_dhp_less_xorshift;
1581         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_gpi_less_xorshift;
1582         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_gpb_less_xorshift;
1583         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_gpt_less_xorshift;
1584 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1585         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_shb_less_xorshift;
1586         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_xorshift > SkipListMap_rcu_sht_less_xorshift;
1587 #endif
1588
1589         class traits_SkipListMap_less_xorshift_stat: public cc::skip_list::make_traits <
1590                 co::less< less >
1591                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1592                 ,co::stat< cc::skip_list::stat<> >
1593                 ,co::item_counter< cds::atomicity::item_counter >
1594             >::type
1595         {};
1596         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_hp_less_xorshift_stat;
1597         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_dhp_less_xorshift_stat;
1598         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_gpi_less_xorshift_stat;
1599         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_gpb_less_xorshift_stat;
1600         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_gpt_less_xorshift_stat;
1601 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1602         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_shb_less_xorshift_stat;
1603         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_less_xorshift_stat > SkipListMap_rcu_sht_less_xorshift_stat;
1604 #endif
1605
1606         class traits_SkipListMap_cmp_xorshift: public cc::skip_list::make_traits <
1607                 co::compare< compare >
1608                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1609                 ,co::item_counter< cds::atomicity::item_counter >
1610             >::type
1611         {};
1612         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_hp_cmp_xorshift;
1613         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_dhp_cmp_xorshift;
1614         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_gpi_cmp_xorshift;
1615         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_gpb_cmp_xorshift;
1616         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_gpt_cmp_xorshift;
1617 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1618         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_shb_cmp_xorshift;
1619         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_xorshift > SkipListMap_rcu_sht_cmp_xorshift;
1620 #endif
1621
1622         class traits_SkipListMap_cmp_xorshift_stat: public cc::skip_list::make_traits <
1623                 co::compare< compare >
1624                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1625                 ,co::stat< cc::skip_list::stat<> >
1626                 ,co::item_counter< cds::atomicity::item_counter >
1627             >::type
1628         {};
1629         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_hp_cmp_xorshift_stat;
1630         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_dhp_cmp_xorshift_stat;
1631         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_gpi_cmp_xorshift_stat;
1632         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_gpb_cmp_xorshift_stat;
1633         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_gpt_cmp_xorshift_stat;
1634 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1635         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_shb_cmp_xorshift_stat;
1636         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_cmp_xorshift_stat > SkipListMap_rcu_sht_cmp_xorshift_stat;
1637 #endif
1638
1639
1640         // ***************************************************************************
1641         // EllenBinTreeMap
1642         struct ellen_bintree_props {
1643             struct hp_gc {
1644                 typedef cc::ellen_bintree::map_node<cds::gc::HP, Key, Value>        leaf_node;
1645                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1646                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1647             };
1648             struct dhp_gc {
1649                 typedef cc::ellen_bintree::map_node<cds::gc::DHP, Key, Value>       leaf_node;
1650                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1651                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1652             };
1653             struct gpi {
1654                 typedef cc::ellen_bintree::map_node<rcu_gpi, Key, Value>            leaf_node;
1655                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1656                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1657             };
1658             struct gpb {
1659                 typedef cc::ellen_bintree::map_node<rcu_gpb, Key, Value>            leaf_node;
1660                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1661                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1662             };
1663             struct gpt {
1664                 typedef cc::ellen_bintree::map_node<rcu_gpt, Key, Value>            leaf_node;
1665                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1666                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1667             };
1668 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1669             struct shb {
1670                 typedef cc::ellen_bintree::map_node<rcu_shb, Key, Value>            leaf_node;
1671                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1672                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1673             };
1674             struct sht {
1675                 typedef cc::ellen_bintree::map_node<rcu_sht, Key, Value>            leaf_node;
1676                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
1677                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1678             };
1679 #endif
1680         };
1681
1682         struct traits_EllenBinTreeMap: public cc::ellen_bintree::make_set_traits<
1683                 co::less< less >
1684                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1685                 ,co::item_counter< cds::atomicity::item_counter >
1686             >::type
1687         {};
1688         struct traits_EllenBinTreeMap_hp : traits_EllenBinTreeMap {
1689             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1690         };
1691         typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp >EllenBinTreeMap_hp;
1692
1693         struct traits_EllenBinTreeMap_dhp : traits_EllenBinTreeMap {
1694             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1695         };
1696         typedef cc::EllenBinTreeMap< cds::gc::DHP, Key, Value, traits_EllenBinTreeMap_dhp >EllenBinTreeMap_dhp;
1697
1698         struct traits_EllenBinTreeMap_gpi : traits_EllenBinTreeMap {
1699             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1700         };
1701         typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_gpi >EllenBinTreeMap_rcu_gpi;
1702
1703         struct traits_EllenBinTreeMap_gpb : traits_EllenBinTreeMap {
1704             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1705         };
1706         typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_gpb >EllenBinTreeMap_rcu_gpb;
1707
1708         struct traits_EllenBinTreeMap_gpt : traits_EllenBinTreeMap {
1709             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1710         };
1711         typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_gpt >EllenBinTreeMap_rcu_gpt;
1712
1713 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1714         struct traits_EllenBinTreeMap_shb : traits_EllenBinTreeMap {
1715             typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1716         };
1717         typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_shb >EllenBinTreeMap_rcu_shb;
1718
1719         struct traits_EllenBinTreeMap_sht : traits_EllenBinTreeMap {
1720             typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1721         };
1722         typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_sht >EllenBinTreeMap_rcu_sht;
1723 #endif
1724
1725         struct traits_EllenBinTreeMap_stat: public cc::ellen_bintree::make_set_traits<
1726                 co::less< less >
1727                 ,cc::ellen_bintree::update_desc_allocator<
1728                     cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
1729                 >
1730                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1731                 ,co::stat< cc::ellen_bintree::stat<> >
1732                 ,co::item_counter< cds::atomicity::item_counter >
1733             >::type
1734         {};
1735
1736         struct traits_EllenBinTreeMap_stat_hp : public traits_EllenBinTreeMap_stat
1737         {
1738             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1739         };
1740         typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_stat_hp > EllenBinTreeMap_hp_stat;
1741
1742         struct traits_EllenBinTreeMap_stat_dhp : public traits_EllenBinTreeMap_stat
1743         {
1744             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1745         };
1746         typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_stat_dhp > EllenBinTreeMap_dhp_stat;
1747
1748         struct traits_EllenBinTreeMap_stat_gpi : public traits_EllenBinTreeMap_stat
1749         {
1750             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1751         };
1752         typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_stat_gpi > EllenBinTreeMap_rcu_gpi_stat;
1753
1754         struct traits_EllenBinTreeMap_stat_gpb : public traits_EllenBinTreeMap_stat
1755         {
1756             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1757         };
1758         typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_stat_gpb > EllenBinTreeMap_rcu_gpb_stat;
1759
1760         struct traits_EllenBinTreeMap_stat_gpt : public traits_EllenBinTreeMap_stat
1761         {
1762             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1763         };
1764         typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_stat_gpt > EllenBinTreeMap_rcu_gpt_stat;
1765
1766 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1767         struct traits_EllenBinTreeMap_stat_shb : public traits_EllenBinTreeMap_stat
1768         {
1769             typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1770         };
1771         typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_stat_shb > EllenBinTreeMap_rcu_shb_stat;
1772
1773         struct traits_EllenBinTreeMap_stat_sht : public traits_EllenBinTreeMap_stat
1774         {
1775             typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1776         };
1777         typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_stat_sht > EllenBinTreeMap_rcu_sht_stat;
1778 #endif
1779
1780         // ***************************************************************************
1781         // Standard implementations
1782
1783         typedef StdMap< Key, Value, cds::SpinLock >             StdMap_Spin;
1784         typedef StdMap< Key, Value, lock::NoLock>               StdMap_NoLock;
1785
1786         typedef StdHashMap< Key, Value, cds::SpinLock >         StdHashMap_Spin;
1787         typedef StdHashMap< Key, Value, lock::NoLock >          StdHashMap_NoLock;
1788
1789     };
1790
1791     template <typename Map>
1792     static inline void print_stat( Map const& m )
1793     {}
1794
1795     template <typename Map>
1796     static inline void additional_cleanup( Map& m )
1797     {}
1798
1799     template <typename Map>
1800     static inline void additional_check( Map& m )
1801     {}
1802
1803
1804     template <typename K, typename T, typename Traits >
1805     static inline void print_stat( cc::CuckooMap< K, T, Traits > const& m )
1806     {
1807         CPPUNIT_MSG( m.statistics() << m.mutex_policy_statistics() );
1808     }
1809
1810     template <typename GC, typename K, typename T, typename Traits >
1811     static inline void print_stat( cc::SkipListMap< GC, K, T, Traits > const& m )
1812     {
1813         CPPUNIT_MSG( m.statistics() );
1814     }
1815
1816     template <typename GC, typename K, typename T, typename Traits >
1817     static inline void print_stat( cc::SplitListMap< GC, K, T, Traits > const& m )
1818     {
1819         CPPUNIT_MSG( m.statistics() );
1820     }
1821
1822     // EllenBinTreeMap
1823     template <typename GC, typename Key, typename T, typename Traits>
1824     static inline void print_stat( cc::EllenBinTreeMap<GC, Key, T, Traits> const& s )
1825     {
1826         CPPUNIT_MSG( s.statistics() );
1827     }
1828     template <typename GC, typename Key, typename T, typename Traits>
1829     static inline void additional_cleanup( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
1830     {
1831         ellen_bintree_pool::internal_node_counter::reset();
1832     }
1833     namespace ellen_bintree_check {
1834         static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
1835         {
1836             // This check is not valid for thread-based RCU
1837             /*
1838             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
1839                 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1840                 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
1841                 );
1842             */
1843         }
1844
1845         static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
1846         {
1847             CPPUNIT_CHECK_CURRENT_EX( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted,
1848                 "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated
1849                 << " m_nInternalNodeDeleted=" << stat.m_nInternalNodeDeleted );
1850             CPPUNIT_CHECK_CURRENT_EX( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted,
1851                 "m_nUpdateDescCreated=" << stat.m_nUpdateDescCreated
1852                 << " m_nUpdateDescDeleted=" << stat.m_nUpdateDescDeleted );
1853             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated,
1854                 "allocated=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1855                 << "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated );
1856         }
1857     }   // namespace ellen_bintree_check
1858     template <typename GC, typename Key, typename T, typename Traits>
1859     static inline void additional_check( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
1860     {
1861         GC::force_dispose();
1862         ellen_bintree_check::check_stat( s.statistics() );
1863     }
1864
1865
1866     template <typename K, typename V, typename... Options>
1867     static inline void print_stat( CuckooStripedMap< K, V, Options... > const& m )
1868     {
1869         typedef CuckooStripedMap< K, V, Options... > map_type;
1870         print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
1871     }
1872
1873     template <typename K, typename V, typename... Options>
1874     static inline void print_stat( CuckooRefinableMap< K, V, Options... > const& m )
1875     {
1876         typedef CuckooRefinableMap< K, V, Options... > map_type;
1877         print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
1878     }
1879
1880 }   // namespace map2
1881
1882 #endif // ifndef _CDSUNIT_MAP2_MAP_TYPES_H