add SplitListMap print stat
[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_ptb.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;
934         typedef cc::SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp;
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 #if (CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)) && _MSC_VER < 1600
1296         typedef RefinableHashMap_ord<
1297             stdext::hash_map< Key, Value, stdext::hash_compare<Key, less > >
1298             , co::hash< hash2 >
1299         > RefinableMap_hashmap;
1300 #else
1301         typedef RefinableHashMap_ord<
1302             std::unordered_map< Key, Value, hash, equal_to >
1303             , co::hash< hash2 >
1304         > RefinableMap_hashmap;
1305 #endif
1306         typedef RefinableHashMap_ord<
1307             boost::unordered_map< Key, Value, hash, equal_to >
1308             , co::hash< hash2 >
1309         > RefinableMap_boost_unordered_map;
1310
1311 #if BOOST_VERSION >= 104800
1312         typedef RefinableHashMap_seq<
1313             boost::container::list< std::pair< Key const, Value > >
1314             , co::hash< hash2 >
1315             , co::less< less >
1316         > RefinableMap_boost_list;
1317
1318         typedef RefinableHashMap_ord<
1319             boost::container::map< Key, Value, less >
1320             , co::hash< hash2 >
1321         > RefinableMap_boost_map;
1322
1323 //#   ifdef CDS_UNIT_MAP_TYPES_ENABLE_BOOST_FLAT_CONTAINERS
1324         typedef RefinableHashMap_ord<
1325             boost::container::flat_map< Key, Value, less >
1326             , co::hash< hash2 >
1327         > RefinableMap_boost_flat_map;
1328 //#   endif
1329 #endif // #if BOOST_VERSION >= 104800
1330
1331
1332         // ***************************************************************************
1333         // CuckooMap
1334
1335         typedef CuckooStripedMap< Key, Value,
1336             cc::cuckoo::probeset_type< cc::cuckoo::list >
1337             ,co::equal_to< equal_to >
1338             ,co::hash< std::tuple< hash, hash2 > >
1339         > CuckooStripedMap_list_unord;
1340
1341         typedef CuckooStripedMap< Key, Value,
1342             cc::cuckoo::probeset_type< cc::cuckoo::list >
1343             ,co::equal_to< equal_to >
1344             ,co::hash< std::tuple< hash, hash2 > >
1345             ,co::stat< cc::cuckoo::stat >
1346         > CuckooStripedMap_list_unord_stat;
1347
1348         typedef CuckooStripedMap< Key, Value,
1349             cc::cuckoo::probeset_type< cc::cuckoo::list >
1350             ,co::equal_to< equal_to >
1351             ,co::hash< std::tuple< hash, hash2 > >
1352             ,cc::cuckoo::store_hash< true >
1353         > CuckooStripedMap_list_unord_storehash;
1354
1355         typedef CuckooStripedMap< Key, Value,
1356             cc::cuckoo::probeset_type< cc::cuckoo::list >
1357             ,co::compare< compare >
1358             ,co::hash< std::tuple< hash, hash2 > >
1359         > CuckooStripedMap_list_ord;
1360
1361         typedef CuckooStripedMap< Key, Value,
1362             cc::cuckoo::probeset_type< cc::cuckoo::list >
1363             ,co::compare< compare >
1364             ,co::hash< std::tuple< hash, hash2 > >
1365             ,co::stat< cc::cuckoo::stat >
1366         > CuckooStripedMap_list_ord_stat;
1367
1368         typedef CuckooStripedMap< Key, Value,
1369             cc::cuckoo::probeset_type< cc::cuckoo::list >
1370             ,co::compare< compare >
1371             ,co::hash< std::tuple< hash, hash2 > >
1372             ,cc::cuckoo::store_hash< true >
1373         > CuckooStripedMap_list_ord_storehash;
1374
1375         typedef CuckooStripedMap< Key, Value,
1376             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1377             ,co::equal_to< equal_to >
1378             ,co::hash< std::tuple< hash, hash2 > >
1379         > CuckooStripedMap_vector_unord;
1380
1381         typedef CuckooStripedMap< Key, Value,
1382             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1383             ,co::equal_to< equal_to >
1384             ,co::hash< std::tuple< hash, hash2 > >
1385             ,co::stat< cc::cuckoo::stat >
1386         > CuckooStripedMap_vector_unord_stat;
1387
1388         typedef CuckooStripedMap< Key, Value,
1389             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1390             ,co::equal_to< equal_to >
1391             ,co::hash< std::tuple< hash, hash2 > >
1392             ,cc::cuckoo::store_hash< true >
1393         > CuckooStripedMap_vector_unord_storehash;
1394
1395         typedef CuckooStripedMap< Key, Value,
1396             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1397             ,co::compare< compare >
1398             ,co::hash< std::tuple< hash, hash2 > >
1399         > CuckooStripedMap_vector_ord;
1400
1401         typedef CuckooStripedMap< Key, Value,
1402             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1403             ,co::compare< compare >
1404             ,co::hash< std::tuple< hash, hash2 > >
1405             ,co::stat< cc::cuckoo::stat >
1406         > CuckooStripedMap_vector_ord_stat;
1407
1408         typedef CuckooStripedMap< Key, Value,
1409             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1410             ,co::compare< compare >
1411             ,co::hash< std::tuple< hash, hash2 > >
1412             ,cc::cuckoo::store_hash< true >
1413         > CuckooStripedMap_vector_ord_storehash;
1414
1415         typedef CuckooRefinableMap< Key, Value,
1416             cc::cuckoo::probeset_type< cc::cuckoo::list >
1417             ,co::equal_to< equal_to >
1418             ,co::hash< std::tuple< hash, hash2 > >
1419         > CuckooRefinableMap_list_unord;
1420
1421         typedef CuckooRefinableMap< Key, Value,
1422             cc::cuckoo::probeset_type< cc::cuckoo::list >
1423             ,co::equal_to< equal_to >
1424             ,co::hash< std::tuple< hash, hash2 > >
1425             ,co::stat< cc::cuckoo::stat >
1426         > CuckooRefinableMap_list_unord_stat;
1427
1428         typedef CuckooRefinableMap< Key, Value,
1429             cc::cuckoo::probeset_type< cc::cuckoo::list >
1430             ,co::equal_to< equal_to >
1431             ,co::hash< std::tuple< hash, hash2 > >
1432             ,cc::cuckoo::store_hash< true >
1433         > CuckooRefinableMap_list_unord_storehash;
1434
1435         typedef CuckooRefinableMap< Key, Value,
1436             cc::cuckoo::probeset_type< cc::cuckoo::list >
1437             ,co::compare< compare >
1438             ,co::hash< std::tuple< hash, hash2 > >
1439         > CuckooRefinableMap_list_ord;
1440
1441         typedef CuckooRefinableMap< Key, Value,
1442             cc::cuckoo::probeset_type< cc::cuckoo::list >
1443             ,co::compare< compare >
1444             ,co::hash< std::tuple< hash, hash2 > >
1445             ,co::stat< cc::cuckoo::stat >
1446         > CuckooRefinableMap_list_ord_stat;
1447
1448         typedef CuckooRefinableMap< Key, Value,
1449             cc::cuckoo::probeset_type< cc::cuckoo::list >
1450             ,co::compare< compare >
1451             ,co::hash< std::tuple< hash, hash2 > >
1452             ,cc::cuckoo::store_hash< true >
1453         > CuckooRefinableMap_list_ord_storehash;
1454
1455         typedef CuckooRefinableMap< Key, Value,
1456             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1457             ,co::equal_to< equal_to >
1458             ,co::hash< std::tuple< hash, hash2 > >
1459         > CuckooRefinableMap_vector_unord;
1460
1461         typedef CuckooRefinableMap< Key, Value,
1462             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1463             ,co::equal_to< equal_to >
1464             ,co::hash< std::tuple< hash, hash2 > >
1465             ,co::stat< cc::cuckoo::stat >
1466         > CuckooRefinableMap_vector_unord_stat;
1467
1468         typedef CuckooRefinableMap< Key, Value,
1469             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1470             ,co::equal_to< equal_to >
1471             ,co::hash< std::tuple< hash, hash2 > >
1472             ,cc::cuckoo::store_hash< true >
1473         > CuckooRefinableMap_vector_unord_storehash;
1474
1475         typedef CuckooRefinableMap< Key, Value,
1476             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1477             ,co::compare< compare >
1478             ,co::hash< std::tuple< hash, hash2 > >
1479         > CuckooRefinableMap_vector_ord;
1480
1481         typedef CuckooRefinableMap< Key, Value,
1482             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1483             ,co::compare< compare >
1484             ,co::hash< std::tuple< hash, hash2 > >
1485             ,co::stat< cc::cuckoo::stat >
1486         > CuckooRefinableMap_vector_ord_stat;
1487
1488         typedef CuckooRefinableMap< Key, Value,
1489             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1490             ,co::compare< compare >
1491             ,co::hash< std::tuple< hash, hash2 > >
1492             ,cc::cuckoo::store_hash< true >
1493         > CuckooRefinableMap_vector_ord_storehash;
1494
1495         // ***************************************************************************
1496         // SkipListMap - HP
1497
1498         class traits_SkipListMap_hp_less_pascal: public cc::skip_list::make_traits <
1499                 co::less< less >
1500                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1501                 ,co::item_counter< cds::atomicity::item_counter >
1502             >::type
1503         {};
1504         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_pascal > SkipListMap_hp_less_pascal;
1505
1506         class traits_SkipListMap_hp_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_hp_less_pascal_seqcst > SkipListMap_hp_less_pascal_seqcst;
1514
1515         class traits_SkipListMap_hp_less_pascal_stat: public cc::skip_list::make_traits <
1516                 co::less< less >
1517                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1518                 ,co::stat< cc::skip_list::stat<> >
1519                 ,co::item_counter< cds::atomicity::item_counter >
1520             >::type
1521         {};
1522         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_pascal_stat > SkipListMap_hp_less_pascal_stat;
1523
1524         class traits_SkipListMap_hp_cmp_pascal: public cc::skip_list::make_traits <
1525                 co::compare< compare >
1526                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1527                 ,co::item_counter< cds::atomicity::item_counter >
1528             >::type
1529         {};
1530         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_pascal > SkipListMap_hp_cmp_pascal;
1531
1532         class traits_SkipListMap_hp_cmp_pascal_stat: public cc::skip_list::make_traits <
1533                 co::compare< compare >
1534                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1535                 ,co::stat< cc::skip_list::stat<> >
1536                 ,co::item_counter< cds::atomicity::item_counter >
1537             >::type
1538         {};
1539         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_pascal_stat > SkipListMap_hp_cmp_pascal_stat;
1540
1541         class traits_SkipListMap_hp_less_xorshift: public cc::skip_list::make_traits <
1542                 co::less< less >
1543                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1544                 ,co::item_counter< cds::atomicity::item_counter >
1545             >::type
1546         {};
1547         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_xorshift > SkipListMap_hp_less_xorshift;
1548
1549         class traits_SkipListMap_hp_less_xorshift_stat: public cc::skip_list::make_traits <
1550                 co::less< less >
1551                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1552                 ,co::stat< cc::skip_list::stat<> >
1553                 ,co::item_counter< cds::atomicity::item_counter >
1554             >::type
1555         {};
1556         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_less_xorshift_stat > SkipListMap_hp_less_xorshift_stat;
1557
1558         class traits_SkipListMap_hp_cmp_xorshift: public cc::skip_list::make_traits <
1559                 co::compare< compare >
1560                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1561                 ,co::item_counter< cds::atomicity::item_counter >
1562             >::type
1563         {};
1564         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_xorshift > SkipListMap_hp_cmp_xorshift;
1565
1566         class traits_SkipListMap_hp_cmp_xorshift_stat: public cc::skip_list::make_traits <
1567                 co::compare< compare >
1568                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1569                 ,co::stat< cc::skip_list::stat<> >
1570                 ,co::item_counter< cds::atomicity::item_counter >
1571             >::type
1572         {};
1573         typedef cc::SkipListMap< cds::gc::HP, Key, Value, traits_SkipListMap_hp_cmp_xorshift_stat > SkipListMap_hp_cmp_xorshift_stat;
1574
1575         // ***************************************************************************
1576         // SkipListMap - DHP
1577
1578         class traits_SkipListMap_ptb_less_pascal: public cc::skip_list::make_traits <
1579                 co::less< less >
1580                 ,co::item_counter< cds::atomicity::item_counter >
1581                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1582             >::type
1583         {};
1584         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_less_pascal > SkipListMap_ptb_less_pascal;
1585
1586         class traits_SkipListMap_ptb_less_pascal_seqcst: public cc::skip_list::make_traits <
1587                 co::less< less >
1588                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1589                 ,co::memory_model< co::v::sequential_consistent >
1590                 ,co::item_counter< cds::atomicity::item_counter >
1591             >::type
1592         {};
1593         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_less_pascal_seqcst > SkipListMap_ptb_less_pascal_seqcst;
1594
1595         class traits_SkipListMap_ptb_less_pascal_stat: public cc::skip_list::make_traits <
1596                 co::less< less >
1597                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1598                 ,co::stat< cc::skip_list::stat<> >
1599                 ,co::item_counter< cds::atomicity::item_counter >
1600             >::type
1601         {};
1602         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_less_pascal_stat > SkipListMap_ptb_less_pascal_stat;
1603
1604         class traits_SkipListMap_ptb_cmp_pascal: public cc::skip_list::make_traits <
1605                 co::compare< compare >
1606                 ,co::item_counter< cds::atomicity::item_counter >
1607                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1608             >::type
1609         {};
1610         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_cmp_pascal > SkipListMap_ptb_cmp_pascal;
1611
1612         class traits_SkipListMap_ptb_cmp_pascal_stat: public cc::skip_list::make_traits <
1613                 co::compare< compare >
1614                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1615                 ,co::item_counter< cds::atomicity::item_counter >
1616                 ,co::stat< cc::skip_list::stat<> >
1617             >::type
1618         {};
1619         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_cmp_pascal_stat > SkipListMap_ptb_cmp_pascal_stat;
1620
1621         class traits_SkipListMap_ptb_less_xorshift: public cc::skip_list::make_traits <
1622                 co::less< less >
1623                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1624                 ,co::item_counter< cds::atomicity::item_counter >
1625             >::type
1626         {};
1627         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_less_xorshift > SkipListMap_ptb_less_xorshift;
1628
1629         class traits_SkipListMap_ptb_less_xorshift_stat: public cc::skip_list::make_traits <
1630                 co::less< less >
1631                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1632                 ,co::stat< cc::skip_list::stat<> >
1633                 ,co::item_counter< cds::atomicity::item_counter >
1634             >::type
1635         {};
1636         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_less_xorshift_stat > SkipListMap_ptb_less_xorshift_stat;
1637
1638         class traits_SkipListMap_ptb_cmp_xorshift: public cc::skip_list::make_traits <
1639                 co::compare< compare >
1640                 ,co::item_counter< cds::atomicity::item_counter >
1641                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1642             >::type
1643         {};
1644         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_cmp_xorshift > SkipListMap_ptb_cmp_xorshift;
1645
1646         class traits_SkipListMap_ptb_cmp_xorshift_stat: public cc::skip_list::make_traits <
1647                 co::compare< compare >
1648                 ,co::item_counter< cds::atomicity::item_counter >
1649                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1650                 ,co::stat< cc::skip_list::stat<> >
1651             >::type
1652         {};
1653         typedef cc::SkipListMap< cds::gc::DHP, Key, Value, traits_SkipListMap_ptb_cmp_xorshift_stat > SkipListMap_ptb_cmp_xorshift_stat;
1654
1655         // ***************************************************************************
1656         // SkipListMap< gc::nogc >
1657
1658         class traits_SkipListMap_nogc_less_pascal: public cc::skip_list::make_traits <
1659                 co::less< less >
1660                 ,co::item_counter< cds::atomicity::item_counter >
1661                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1662             >::type
1663         {};
1664         typedef NogcMapWrapper_dctor<
1665             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_pascal >
1666         > SkipListMap_nogc_less_pascal;
1667
1668         class traits_SkipListMap_nogc_less_pascal_seqcst: public cc::skip_list::make_traits <
1669                 co::less< less >
1670                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1671                 ,co::memory_model< co::v::sequential_consistent >
1672                 ,co::item_counter< cds::atomicity::item_counter >
1673             >::type
1674         {};
1675         typedef NogcMapWrapper_dctor<
1676             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_pascal_seqcst >
1677         > SkipListMap_nogc_less_pascal_seqcst;
1678
1679         class traits_SkipListMap_nogc_less_pascal_stat: public cc::skip_list::make_traits <
1680                 co::less< less >
1681                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1682                 ,co::stat< cc::skip_list::stat<> >
1683                 ,co::item_counter< cds::atomicity::item_counter >
1684             >::type
1685         {};
1686         typedef NogcMapWrapper_dctor<
1687             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_pascal_stat >
1688         > SkipListMap_nogc_less_pascal_stat;
1689
1690         class traits_SkipListMap_nogc_cmp_pascal: public cc::skip_list::make_traits <
1691                 co::compare< compare >
1692                 ,co::item_counter< cds::atomicity::item_counter >
1693                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1694             >::type
1695         {};
1696         typedef NogcMapWrapper_dctor<
1697             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_pascal >
1698         > SkipListMap_nogc_cmp_pascal;
1699
1700         class traits_SkipListMap_nogc_cmp_pascal_stat: public cc::skip_list::make_traits <
1701                 co::compare< compare >
1702                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1703                 ,co::item_counter< cds::atomicity::item_counter >
1704                 ,co::stat< cc::skip_list::stat<> >
1705             >::type
1706         {};
1707         typedef NogcMapWrapper_dctor<
1708             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_pascal_stat >
1709         > SkipListMap_nogc_cmp_pascal_stat;
1710
1711         class traits_SkipListMap_nogc_less_xorshift: public cc::skip_list::make_traits <
1712                 co::less< less >
1713                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1714                 ,co::item_counter< cds::atomicity::item_counter >
1715             >::type
1716         {};
1717         typedef NogcMapWrapper_dctor<
1718             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_xorshift >
1719         > SkipListMap_nogc_less_xorshift;
1720
1721         class traits_SkipListMap_nogc_less_xorshift_stat: public cc::skip_list::make_traits <
1722                 co::less< less >
1723                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1724                 ,co::stat< cc::skip_list::stat<> >
1725                 ,co::item_counter< cds::atomicity::item_counter >
1726             >::type
1727         {};
1728         typedef NogcMapWrapper_dctor<
1729             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_less_xorshift_stat >
1730         > SkipListMap_nogc_less_xorshift_stat;
1731
1732         class traits_SkipListMap_nogc_cmp_xorshift: public cc::skip_list::make_traits <
1733                 co::compare< compare >
1734                 ,co::item_counter< cds::atomicity::item_counter >
1735                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1736             >::type
1737         {};
1738         typedef NogcMapWrapper_dctor< cc::SkipListMap<
1739             cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_xorshift >
1740         > SkipListMap_nogc_cmp_xorshift;
1741
1742         class traits_SkipListMap_nogc_cmp_xorshift_stat: public cc::skip_list::make_traits <
1743                 co::compare< compare >
1744                 ,co::item_counter< cds::atomicity::item_counter >
1745                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1746                 ,co::stat< cc::skip_list::stat<> >
1747             >::type
1748         {};
1749         typedef NogcMapWrapper_dctor<
1750             cc::SkipListMap< cds::gc::nogc, Key, Value, traits_SkipListMap_nogc_cmp_xorshift_stat >
1751         > SkipListMap_nogc_cmp_xorshift_stat;
1752
1753         // ***************************************************************************
1754         // SkipListMap - RCU general_instant
1755
1756         class traits_SkipListMap_rcu_gpi_less_pascal: public cc::skip_list::make_traits <
1757                 co::less< less >
1758                 ,co::item_counter< cds::atomicity::item_counter >
1759                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1760             >::type
1761         {};
1762         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_pascal > SkipListMap_rcu_gpi_less_pascal;
1763
1764         class traits_SkipListMap_rcu_gpi_less_pascal_seqcst: public cc::skip_list::make_traits <
1765                 co::less< less >
1766                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1767                 ,co::memory_model< co::v::sequential_consistent >
1768                 ,co::item_counter< cds::atomicity::item_counter >
1769             >::type
1770         {};
1771         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_pascal_seqcst > SkipListMap_rcu_gpi_less_pascal_seqcst;
1772
1773         class traits_SkipListMap_rcu_gpi_less_pascal_stat: public cc::skip_list::make_traits <
1774                 co::less< less >
1775                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1776                 ,co::stat< cc::skip_list::stat<> >
1777                 ,co::item_counter< cds::atomicity::item_counter >
1778             >::type
1779         {};
1780         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_pascal_stat > SkipListMap_rcu_gpi_less_pascal_stat;
1781
1782         class traits_SkipListMap_rcu_gpi_cmp_pascal: public cc::skip_list::make_traits <
1783                 co::compare< compare >
1784                 ,co::item_counter< cds::atomicity::item_counter >
1785                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1786             >::type
1787         {};
1788         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_pascal > SkipListMap_rcu_gpi_cmp_pascal;
1789
1790         class traits_SkipListMap_rcu_gpi_cmp_pascal_stat: public cc::skip_list::make_traits <
1791                 co::compare< compare >
1792                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1793                 ,co::item_counter< cds::atomicity::item_counter >
1794                 ,co::stat< cc::skip_list::stat<> >
1795             >::type
1796         {};
1797         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_pascal_stat > SkipListMap_rcu_gpi_cmp_pascal_stat;
1798
1799         class traits_SkipListMap_rcu_gpi_less_xorshift: public cc::skip_list::make_traits <
1800                 co::less< less >
1801                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1802                 ,co::item_counter< cds::atomicity::item_counter >
1803             >::type
1804         {};
1805         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_xorshift > SkipListMap_rcu_gpi_less_xorshift;
1806
1807         class traits_SkipListMap_rcu_gpi_less_xorshift_stat: public cc::skip_list::make_traits <
1808                 co::less< less >
1809                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1810                 ,co::stat< cc::skip_list::stat<> >
1811                 ,co::item_counter< cds::atomicity::item_counter >
1812             >::type
1813         {};
1814         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_less_xorshift_stat > SkipListMap_rcu_gpi_less_xorshift_stat;
1815
1816         class traits_SkipListMap_rcu_gpi_cmp_xorshift: public cc::skip_list::make_traits <
1817                 co::compare< compare >
1818                 ,co::item_counter< cds::atomicity::item_counter >
1819                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1820             >::type
1821         {};
1822         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_xorshift > SkipListMap_rcu_gpi_cmp_xorshift;
1823
1824         class traits_SkipListMap_rcu_gpi_cmp_xorshift_stat: public cc::skip_list::make_traits <
1825                 co::compare< compare >
1826                 ,co::item_counter< cds::atomicity::item_counter >
1827                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1828                 ,co::stat< cc::skip_list::stat<> >
1829             >::type
1830         {};
1831         typedef cc::SkipListMap< rcu_gpi, Key, Value, traits_SkipListMap_rcu_gpi_cmp_xorshift_stat > SkipListMap_rcu_gpi_cmp_xorshift_stat;
1832
1833         // ***************************************************************************
1834         // SkipListMap - RCU general_buffered
1835
1836         class traits_SkipListMap_rcu_gpb_less_pascal: public cc::skip_list::make_traits <
1837                 co::less< less >
1838                 ,co::item_counter< cds::atomicity::item_counter >
1839                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1840             >::type
1841         {};
1842         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_pascal > SkipListMap_rcu_gpb_less_pascal;
1843
1844         class traits_SkipListMap_rcu_gpb_less_pascal_seqcst: public cc::skip_list::make_traits <
1845                 co::less< less >
1846                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1847                 ,co::memory_model< co::v::sequential_consistent >
1848                 ,co::item_counter< cds::atomicity::item_counter >
1849             >::type
1850         {};
1851         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_pascal_seqcst > SkipListMap_rcu_gpb_less_pascal_seqcst;
1852
1853         class traits_SkipListMap_rcu_gpb_less_pascal_stat: public cc::skip_list::make_traits <
1854                 co::less< less >
1855                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1856                 ,co::stat< cc::skip_list::stat<> >
1857                 ,co::item_counter< cds::atomicity::item_counter >
1858             >::type
1859         {};
1860         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_pascal_stat > SkipListMap_rcu_gpb_less_pascal_stat;
1861
1862         class traits_SkipListMap_rcu_gpb_cmp_pascal: public cc::skip_list::make_traits <
1863                 co::compare< compare >
1864                 ,co::item_counter< cds::atomicity::item_counter >
1865                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1866             >::type
1867         {};
1868         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_pascal > SkipListMap_rcu_gpb_cmp_pascal;
1869
1870         class traits_SkipListMap_rcu_gpb_cmp_pascal_stat: public cc::skip_list::make_traits <
1871                 co::compare< compare >
1872                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1873                 ,co::item_counter< cds::atomicity::item_counter >
1874                 ,co::stat< cc::skip_list::stat<> >
1875             >::type
1876         {};
1877         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_pascal_stat > SkipListMap_rcu_gpb_cmp_pascal_stat;
1878
1879         class traits_SkipListMap_rcu_gpb_less_xorshift: public cc::skip_list::make_traits <
1880                 co::less< less >
1881                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1882                 ,co::item_counter< cds::atomicity::item_counter >
1883             >::type
1884         {};
1885         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_xorshift > SkipListMap_rcu_gpb_less_xorshift;
1886
1887         class traits_SkipListMap_rcu_gpb_less_xorshift_stat: public cc::skip_list::make_traits <
1888                 co::less< less >
1889                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1890                 ,co::stat< cc::skip_list::stat<> >
1891                 ,co::item_counter< cds::atomicity::item_counter >
1892             >::type
1893         {};
1894         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_less_xorshift_stat > SkipListMap_rcu_gpb_less_xorshift_stat;
1895
1896         class traits_SkipListMap_rcu_gpb_cmp_xorshift: public cc::skip_list::make_traits <
1897                 co::compare< compare >
1898                 ,co::item_counter< cds::atomicity::item_counter >
1899                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1900             >::type
1901         {};
1902         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_xorshift > SkipListMap_rcu_gpb_cmp_xorshift;
1903
1904         class traits_SkipListMap_rcu_gpb_cmp_xorshift_stat: public cc::skip_list::make_traits <
1905                 co::compare< compare >
1906                 ,co::item_counter< cds::atomicity::item_counter >
1907                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1908                 ,co::stat< cc::skip_list::stat<> >
1909             >::type
1910         {};
1911         typedef cc::SkipListMap< rcu_gpb, Key, Value, traits_SkipListMap_rcu_gpb_cmp_xorshift_stat > SkipListMap_rcu_gpb_cmp_xorshift_stat;
1912
1913         // ***************************************************************************
1914         // SkipListMap - RCU general_threaded
1915
1916         class traits_SkipListMap_rcu_gpt_less_pascal: public cc::skip_list::make_traits <
1917                 co::less< less >
1918                 ,co::item_counter< cds::atomicity::item_counter >
1919                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1920             >::type
1921         {};
1922         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_pascal > SkipListMap_rcu_gpt_less_pascal;
1923
1924         class traits_SkipListMap_rcu_gpt_less_pascal_seqcst: public cc::skip_list::make_traits <
1925                 co::less< less >
1926                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1927                 ,co::memory_model< co::v::sequential_consistent >
1928                 ,co::item_counter< cds::atomicity::item_counter >
1929             >::type
1930         {};
1931         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_pascal_seqcst > SkipListMap_rcu_gpt_less_pascal_seqcst;
1932
1933         class traits_SkipListMap_rcu_gpt_less_pascal_stat: public cc::skip_list::make_traits <
1934                 co::less< less >
1935                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1936                 ,co::stat< cc::skip_list::stat<> >
1937                 ,co::item_counter< cds::atomicity::item_counter >
1938             >::type
1939         {};
1940         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_pascal_stat > SkipListMap_rcu_gpt_less_pascal_stat;
1941
1942         class traits_SkipListMap_rcu_gpt_cmp_pascal: public cc::skip_list::make_traits <
1943                 co::compare< compare >
1944                 ,co::item_counter< cds::atomicity::item_counter >
1945                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1946             >::type
1947         {};
1948         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_pascal > SkipListMap_rcu_gpt_cmp_pascal;
1949
1950         class traits_SkipListMap_rcu_gpt_cmp_pascal_stat: public cc::skip_list::make_traits <
1951                 co::compare< compare >
1952                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1953                 ,co::item_counter< cds::atomicity::item_counter >
1954                 ,co::stat< cc::skip_list::stat<> >
1955             >::type
1956         {};
1957         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_pascal_stat > SkipListMap_rcu_gpt_cmp_pascal_stat;
1958
1959         class traits_SkipListMap_rcu_gpt_less_xorshift: public cc::skip_list::make_traits <
1960                 co::less< less >
1961                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1962                 ,co::item_counter< cds::atomicity::item_counter >
1963             >::type
1964         {};
1965         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_xorshift > SkipListMap_rcu_gpt_less_xorshift;
1966
1967         class traits_SkipListMap_rcu_gpt_less_xorshift_stat: public cc::skip_list::make_traits <
1968                 co::less< less >
1969                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1970                 ,co::stat< cc::skip_list::stat<> >
1971                 ,co::item_counter< cds::atomicity::item_counter >
1972             >::type
1973         {};
1974         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_less_xorshift_stat > SkipListMap_rcu_gpt_less_xorshift_stat;
1975
1976         class traits_SkipListMap_rcu_gpt_cmp_xorshift: public cc::skip_list::make_traits <
1977                 co::compare< compare >
1978                 ,co::item_counter< cds::atomicity::item_counter >
1979                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1980             >::type
1981         {};
1982         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_xorshift > SkipListMap_rcu_gpt_cmp_xorshift;
1983
1984         class traits_SkipListMap_rcu_gpt_cmp_xorshift_stat: public cc::skip_list::make_traits <
1985                 co::compare< compare >
1986                 ,co::item_counter< cds::atomicity::item_counter >
1987                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1988                 ,co::stat< cc::skip_list::stat<> >
1989             >::type
1990         {};
1991         typedef cc::SkipListMap< rcu_gpt, Key, Value, traits_SkipListMap_rcu_gpt_cmp_xorshift_stat > SkipListMap_rcu_gpt_cmp_xorshift_stat;
1992
1993 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1994         // ***************************************************************************
1995         // SkipListMap - RCU signal_buffered
1996
1997         class traits_SkipListMap_rcu_shb_less_pascal: public cc::skip_list::make_traits <
1998                 co::less< less >
1999                 ,co::item_counter< cds::atomicity::item_counter >
2000                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2001             >::type
2002         {};
2003         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_pascal > SkipListMap_rcu_shb_less_pascal;
2004
2005         class traits_SkipListMap_rcu_shb_less_pascal_seqcst: public cc::skip_list::make_traits <
2006                 co::less< less >
2007                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2008                 ,co::memory_model< co::v::sequential_consistent >
2009                 ,co::item_counter< cds::atomicity::item_counter >
2010             >::type
2011         {};
2012         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_pascal_seqcst > SkipListMap_rcu_shb_less_pascal_seqcst;
2013
2014         class traits_SkipListMap_rcu_shb_less_pascal_stat: public cc::skip_list::make_traits <
2015                 co::less< less >
2016                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2017                 ,co::stat< cc::skip_list::stat<> >
2018                 ,co::item_counter< cds::atomicity::item_counter >
2019             >::type
2020         {};
2021         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_pascal_stat > SkipListMap_rcu_shb_less_pascal_stat;
2022
2023         class traits_SkipListMap_rcu_shb_cmp_pascal: public cc::skip_list::make_traits <
2024                 co::compare< compare >
2025                 ,co::item_counter< cds::atomicity::item_counter >
2026                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2027             >::type
2028         {};
2029         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_pascal > SkipListMap_rcu_shb_cmp_pascal;
2030
2031         class traits_SkipListMap_rcu_shb_cmp_pascal_stat: public cc::skip_list::make_traits <
2032                 co::compare< compare >
2033                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2034                 ,co::item_counter< cds::atomicity::item_counter >
2035                 ,co::stat< cc::skip_list::stat<> >
2036             >::type
2037         {};
2038         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_pascal_stat > SkipListMap_rcu_shb_cmp_pascal_stat;
2039
2040         class traits_SkipListMap_rcu_shb_less_xorshift: public cc::skip_list::make_traits <
2041                 co::less< less >
2042                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2043                 ,co::item_counter< cds::atomicity::item_counter >
2044             >::type
2045         {};
2046         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_xorshift > SkipListMap_rcu_shb_less_xorshift;
2047
2048         class traits_SkipListMap_rcu_shb_less_xorshift_stat: public cc::skip_list::make_traits <
2049                 co::less< less >
2050                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2051                 ,co::stat< cc::skip_list::stat<> >
2052                 ,co::item_counter< cds::atomicity::item_counter >
2053             >::type
2054         {};
2055         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_less_xorshift_stat > SkipListMap_rcu_shb_less_xorshift_stat;
2056
2057         class traits_SkipListMap_rcu_shb_cmp_xorshift: public cc::skip_list::make_traits <
2058                 co::compare< compare >
2059                 ,co::item_counter< cds::atomicity::item_counter >
2060                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2061             >::type
2062         {};
2063         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_xorshift > SkipListMap_rcu_shb_cmp_xorshift;
2064
2065         class traits_SkipListMap_rcu_shb_cmp_xorshift_stat: public cc::skip_list::make_traits <
2066                 co::compare< compare >
2067                 ,co::item_counter< cds::atomicity::item_counter >
2068                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2069                 ,co::stat< cc::skip_list::stat<> >
2070             >::type
2071         {};
2072         typedef cc::SkipListMap< rcu_shb, Key, Value, traits_SkipListMap_rcu_shb_cmp_xorshift_stat > SkipListMap_rcu_shb_cmp_xorshift_stat;
2073
2074         // ***************************************************************************
2075         // SkipListMap - RCU signal_threaded
2076
2077         class traits_SkipListMap_rcu_sht_less_pascal: public cc::skip_list::make_traits <
2078                 co::less< less >
2079                 ,co::item_counter< cds::atomicity::item_counter >
2080                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2081             >::type
2082         {};
2083         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_pascal > SkipListMap_rcu_sht_less_pascal;
2084
2085         class traits_SkipListMap_rcu_sht_less_pascal_seqcst: public cc::skip_list::make_traits <
2086                 co::less< less >
2087                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2088                 ,co::memory_model< co::v::sequential_consistent >
2089                 ,co::item_counter< cds::atomicity::item_counter >
2090             >::type
2091         {};
2092         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_pascal_seqcst > SkipListMap_rcu_sht_less_pascal_seqcst;
2093
2094         class traits_SkipListMap_rcu_sht_less_pascal_stat: public cc::skip_list::make_traits <
2095                 co::less< less >
2096                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2097                 ,co::stat< cc::skip_list::stat<> >
2098                 ,co::item_counter< cds::atomicity::item_counter >
2099             >::type
2100         {};
2101         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_pascal_stat > SkipListMap_rcu_sht_less_pascal_stat;
2102
2103         class traits_SkipListMap_rcu_sht_cmp_pascal: public cc::skip_list::make_traits <
2104                 co::compare< compare >
2105                 ,co::item_counter< cds::atomicity::item_counter >
2106                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2107             >::type
2108         {};
2109         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_pascal > SkipListMap_rcu_sht_cmp_pascal;
2110
2111         class traits_SkipListMap_rcu_sht_cmp_pascal_stat: public cc::skip_list::make_traits <
2112                 co::compare< compare >
2113                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
2114                 ,co::item_counter< cds::atomicity::item_counter >
2115                 ,co::stat< cc::skip_list::stat<> >
2116             >::type
2117         {};
2118         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_pascal_stat > SkipListMap_rcu_sht_cmp_pascal_stat;
2119
2120         class traits_SkipListMap_rcu_sht_less_xorshift: public cc::skip_list::make_traits <
2121                 co::less< less >
2122                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2123                 ,co::item_counter< cds::atomicity::item_counter >
2124             >::type
2125         {};
2126         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_xorshift > SkipListMap_rcu_sht_less_xorshift;
2127
2128         class traits_SkipListMap_rcu_sht_less_xorshift_stat: public cc::skip_list::make_traits <
2129                 co::less< less >
2130                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2131                 ,co::stat< cc::skip_list::stat<> >
2132                 ,co::item_counter< cds::atomicity::item_counter >
2133             >::type
2134         {};
2135         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_less_xorshift_stat > SkipListMap_rcu_sht_less_xorshift_stat;
2136
2137         class traits_SkipListMap_rcu_sht_cmp_xorshift: public cc::skip_list::make_traits <
2138                 co::compare< compare >
2139                 ,co::item_counter< cds::atomicity::item_counter >
2140                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2141             >::type
2142         {};
2143         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_xorshift > SkipListMap_rcu_sht_cmp_xorshift;
2144
2145         class traits_SkipListMap_rcu_sht_cmp_xorshift_stat: public cc::skip_list::make_traits <
2146                 co::compare< compare >
2147                 ,co::item_counter< cds::atomicity::item_counter >
2148                 ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2149                 ,co::stat< cc::skip_list::stat<> >
2150             >::type
2151         {};
2152         typedef cc::SkipListMap< rcu_sht, Key, Value, traits_SkipListMap_rcu_sht_cmp_xorshift_stat > SkipListMap_rcu_sht_cmp_xorshift_stat;
2153 #endif
2154
2155
2156         // ***************************************************************************
2157         // EllenBinTreeMap
2158         struct ellen_bintree_props {
2159             struct hp_gc {
2160                 typedef cc::ellen_bintree::map_node<cds::gc::HP, Key, Value>        leaf_node;
2161                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2162                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2163             };
2164             struct ptb_gc {
2165                 typedef cc::ellen_bintree::map_node<cds::gc::DHP, Key, Value>       leaf_node;
2166                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2167                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2168             };
2169             struct gpi {
2170                 typedef cc::ellen_bintree::map_node<rcu_gpi, Key, Value>            leaf_node;
2171                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2172                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2173             };
2174             struct gpb {
2175                 typedef cc::ellen_bintree::map_node<rcu_gpb, Key, Value>            leaf_node;
2176                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2177                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2178             };
2179             struct gpt {
2180                 typedef cc::ellen_bintree::map_node<rcu_gpt, Key, Value>            leaf_node;
2181                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2182                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2183             };
2184 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
2185             struct shb {
2186                 typedef cc::ellen_bintree::map_node<rcu_shb, Key, Value>            leaf_node;
2187                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2188                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2189             };
2190             struct sht {
2191                 typedef cc::ellen_bintree::map_node<rcu_sht, Key, Value>            leaf_node;
2192                 typedef cc::ellen_bintree::internal_node< Key, leaf_node >          internal_node;
2193                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2194             };
2195 #endif
2196         };
2197
2198
2199         // ***************************************************************************
2200         // EllenBinTreeMap - HP
2201
2202         struct traits_EllenBinTreeMap_hp: public cc::ellen_bintree::make_set_traits<
2203                 co::less< less >
2204                 ,cc::ellen_bintree::update_desc_allocator<
2205                     cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2206                 >
2207                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2208                 ,co::item_counter< cds::atomicity::item_counter >
2209             >::type
2210         {};
2211         typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp >EllenBinTreeMap_hp;
2212
2213         struct traits_EllenBinTreeMap_hp_stat: public cc::ellen_bintree::make_set_traits<
2214                 co::less< less >
2215                 ,cc::ellen_bintree::update_desc_allocator<
2216                     cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2217                 >
2218                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2219                 ,co::stat< cc::ellen_bintree::stat<> >
2220                 ,co::item_counter< cds::atomicity::item_counter >
2221             >::type
2222         {};
2223         typedef cc::EllenBinTreeMap< cds::gc::HP, Key, Value, traits_EllenBinTreeMap_hp_stat > EllenBinTreeMap_hp_stat;
2224
2225         // ***************************************************************************
2226         // EllenBinTreeMap - DHP
2227
2228         struct traits_EllenBinTreeMap_ptb: public cc::ellen_bintree::make_set_traits<
2229                 co::less< less >
2230                 ,cc::ellen_bintree::update_desc_allocator<
2231                     cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2232                 >
2233                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2234                 ,co::item_counter< cds::atomicity::item_counter >
2235             >::type
2236         {};
2237         typedef cc::EllenBinTreeMap< cds::gc::DHP, Key, Value, traits_EllenBinTreeMap_ptb> EllenBinTreeMap_ptb;
2238
2239         struct traits_EllenBinTreeMap_ptb_stat: public cc::ellen_bintree::make_set_traits<
2240                 co::less< less >
2241                 ,cc::ellen_bintree::update_desc_allocator<
2242                     cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2243                 >
2244                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2245                 ,co::stat< cc::ellen_bintree::stat<> >
2246                 ,co::item_counter< cds::atomicity::item_counter >
2247             >::type
2248         {};
2249         typedef cc::EllenBinTreeMap< cds::gc::DHP, Key, Value, traits_EllenBinTreeMap_ptb_stat > EllenBinTreeMap_ptb_stat;
2250
2251         // ***************************************************************************
2252         // EllenBinTreeMap - RCU
2253
2254         struct traits_EllenBinTreeMap_rcu_gpi: public cc::ellen_bintree::make_set_traits<
2255                 co::less< less >
2256                 ,cc::ellen_bintree::update_desc_allocator<
2257                     cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
2258                 >
2259                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2260                 ,co::item_counter< cds::atomicity::item_counter >
2261             >::type
2262         {};
2263         typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_rcu_gpi > EllenBinTreeMap_rcu_gpi;
2264
2265         struct traits_EllenBinTreeMap_rcu_gpi_stat: public cc::ellen_bintree::make_set_traits<
2266                 co::less< less >
2267                 ,cc::ellen_bintree::update_desc_allocator<
2268                     cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
2269                 >
2270                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2271                 ,co::stat< cc::ellen_bintree::stat<> >
2272                 ,co::item_counter< cds::atomicity::item_counter >
2273             >::type
2274         {};
2275         typedef cc::EllenBinTreeMap< rcu_gpi, Key, Value, traits_EllenBinTreeMap_rcu_gpi_stat > EllenBinTreeMap_rcu_gpi_stat;
2276
2277         struct traits_EllenBinTreeMap_rcu_gpb: public cc::ellen_bintree::make_set_traits<
2278                 co::less< less >
2279                 ,cc::ellen_bintree::update_desc_allocator<
2280                     cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2281                 >
2282                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2283                 ,co::item_counter< cds::atomicity::item_counter >
2284             >::type
2285         {};
2286         typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_rcu_gpb > EllenBinTreeMap_rcu_gpb;
2287
2288         struct traits_EllenBinTreeMap_rcu_gpb_stat: public cc::ellen_bintree::make_set_traits<
2289                 co::less< less >
2290                 ,cc::ellen_bintree::update_desc_allocator<
2291                     cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2292                 >
2293                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2294                 ,co::stat< cc::ellen_bintree::stat<> >
2295                 ,co::item_counter< cds::atomicity::item_counter >
2296             >::type
2297         {};
2298         typedef cc::EllenBinTreeMap< rcu_gpb, Key, Value, traits_EllenBinTreeMap_rcu_gpb_stat > EllenBinTreeMap_rcu_gpb_stat;
2299
2300         struct traits_EllenBinTreeMap_rcu_gpt: public cc::ellen_bintree::make_set_traits<
2301             co::less< less >
2302             ,cc::ellen_bintree::update_desc_allocator<
2303             cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2304             >
2305             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2306             ,co::item_counter< cds::atomicity::item_counter >
2307         >::type
2308         {};
2309         typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_rcu_gpt > EllenBinTreeMap_rcu_gpt;
2310
2311         struct traits_EllenBinTreeMap_rcu_gpt_stat: public cc::ellen_bintree::make_set_traits<
2312                 co::less< less >
2313                 ,cc::ellen_bintree::update_desc_allocator<
2314                     cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2315                 >
2316                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2317                 ,co::stat< cc::ellen_bintree::stat<> >
2318                 ,co::item_counter< cds::atomicity::item_counter >
2319             >::type
2320         {};
2321         typedef cc::EllenBinTreeMap< rcu_gpt, Key, Value, traits_EllenBinTreeMap_rcu_gpt_stat > EllenBinTreeMap_rcu_gpt_stat;
2322
2323 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
2324         struct traits_EllenBinTreeMap_rcu_shb: public cc::ellen_bintree::make_set_traits<
2325             co::less< less >
2326             ,cc::ellen_bintree::update_desc_allocator<
2327                 cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2328             >
2329             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2330             ,co::item_counter< cds::atomicity::item_counter >
2331         >::type
2332         {};
2333         typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_rcu_shb > EllenBinTreeMap_rcu_shb;
2334
2335         struct traits_EllenBinTreeMap_rcu_shb_stat: public cc::ellen_bintree::make_set_traits<
2336                 co::less< less >
2337                 ,cc::ellen_bintree::update_desc_allocator<
2338                     cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2339                 >
2340                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2341                 ,co::item_counter< cds::atomicity::item_counter >
2342                 ,co::stat< cc::ellen_bintree::stat<> >
2343             >::type
2344         {};
2345         typedef cc::EllenBinTreeMap< rcu_shb, Key, Value, traits_EllenBinTreeMap_rcu_shb_stat > EllenBinTreeMap_rcu_shb_stat;
2346
2347         struct traits_EllenBinTreeMap_rcu_sht: public cc::ellen_bintree::make_set_traits<
2348                 co::less< less >
2349                 ,cc::ellen_bintree::update_desc_allocator<
2350                     cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2351                 >
2352                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2353                 ,co::item_counter< cds::atomicity::item_counter >
2354             >::type
2355         {};
2356         typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_rcu_sht > EllenBinTreeMap_rcu_sht;
2357
2358         struct traits_EllenBinTreeMap_rcu_sht_stat: public cc::ellen_bintree::make_set_traits<
2359                 co::less< less >
2360                 ,cc::ellen_bintree::update_desc_allocator<
2361                     cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2362                 >
2363                 ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2364                 ,co::item_counter< cds::atomicity::item_counter >
2365                 ,co::stat< cc::ellen_bintree::stat<> >
2366             >::type
2367         {};
2368         typedef cc::EllenBinTreeMap< rcu_sht, Key, Value, traits_EllenBinTreeMap_rcu_sht_stat > EllenBinTreeMap_rcu_sht_stat;
2369
2370 #endif
2371
2372
2373         // ***************************************************************************
2374         // Standard implementations
2375
2376         typedef StdMap< Key, Value, cds::SpinLock >             StdMap_Spin;
2377         typedef StdMap< Key, Value, lock::NoLock>               StdMap_NoLock;
2378
2379         typedef StdHashMap< Key, Value, cds::SpinLock >         StdHashMap_Spin;
2380         typedef StdHashMap< Key, Value, lock::NoLock >          StdHashMap_NoLock;
2381
2382     };
2383
2384     template <typename Map>
2385     static inline void print_stat( Map const& m )
2386     {}
2387
2388     template <typename Map>
2389     static inline void additional_cleanup( Map& m )
2390     {}
2391
2392     template <typename Map>
2393     static inline void additional_check( Map& m )
2394     {}
2395
2396
2397     template <typename K, typename T, typename Traits >
2398     static inline void print_stat( cc::CuckooMap< K, T, Traits > const& m )
2399     {
2400         CPPUNIT_MSG( m.statistics() << m.mutex_policy_statistics() );
2401     }
2402
2403     template <typename GC, typename K, typename T, typename Traits >
2404     static inline void print_stat( cc::SkipListMap< GC, K, T, Traits > const& m )
2405     {
2406         CPPUNIT_MSG( m.statistics() );
2407     }
2408
2409     template <typename GC, typename K, typename T, typename Traits >
2410     static inline void print_stat( cc::SplitListMap< GC, K, T, Traits > const& m )
2411     {
2412         CPPUNIT_MSG( m.statistics() );
2413     }
2414
2415     // EllenBinTreeMap
2416     template <typename GC, typename Key, typename T, typename Traits>
2417     static inline void print_stat( cc::EllenBinTreeMap<GC, Key, T, Traits> const& s )
2418     {
2419         CPPUNIT_MSG( s.statistics() );
2420     }
2421     template <typename GC, typename Key, typename T, typename Traits>
2422     static inline void additional_cleanup( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
2423     {
2424         ellen_bintree_pool::internal_node_counter::reset();
2425     }
2426     namespace ellen_bintree_check {
2427         static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
2428         {
2429             // This check is not valid for thread-based RCU
2430             /*
2431             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
2432                 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
2433                 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
2434                 );
2435             */
2436         }
2437
2438         static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
2439         {
2440             CPPUNIT_CHECK_CURRENT_EX( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted,
2441                 "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated
2442                 << " m_nInternalNodeDeleted=" << stat.m_nInternalNodeDeleted );
2443             CPPUNIT_CHECK_CURRENT_EX( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted,
2444                 "m_nUpdateDescCreated=" << stat.m_nUpdateDescCreated
2445                 << " m_nUpdateDescDeleted=" << stat.m_nUpdateDescDeleted );
2446             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated,
2447                 "allocated=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
2448                 << "m_nInternalNodeCreated=" << stat.m_nInternalNodeCreated );
2449         }
2450     }   // namespace ellen_bintree_check
2451     template <typename GC, typename Key, typename T, typename Traits>
2452     static inline void additional_check( cc::EllenBinTreeMap<GC, Key, T, Traits>& s )
2453     {
2454         GC::force_dispose();
2455         ellen_bintree_check::check_stat( s.statistics() );
2456     }
2457
2458
2459     template <typename K, typename V, typename... Options>
2460     static inline void print_stat( CuckooStripedMap< K, V, Options... > const& m )
2461     {
2462         typedef CuckooStripedMap< K, V, Options... > map_type;
2463         print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
2464     }
2465
2466     template <typename K, typename V, typename... Options>
2467     static inline void print_stat( CuckooRefinableMap< K, V, Options... > const& m )
2468     {
2469         typedef CuckooRefinableMap< K, V, Options... > map_type;
2470         print_stat( static_cast<typename map_type::cuckoo_base_class const&>(m) );
2471     }
2472
2473 }   // namespace map2
2474
2475 #endif // ifndef _CDSUNIT_MAP2_MAP_TYPES_H