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