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