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