Normalized split-list set types in unit-set tests
[libcds.git] / tests / unit / set2 / set_types.h
1 //$$CDS-header$$
2
3 #ifndef _CDSUNIT_SET2_SET_TYPES_H
4 #define _CDSUNIT_SET2_SET_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_list_hp.h>
13 #include <cds/container/michael_list_dhp.h>
14 #include <cds/container/michael_list_rcu.h>
15 #include <cds/container/lazy_list_hp.h>
16 #include <cds/container/lazy_list_dhp.h>
17 #include <cds/container/lazy_list_rcu.h>
18
19 #include <cds/container/michael_set.h>
20 #include <cds/container/michael_set_rcu.h>
21
22 #include <cds/container/split_list_set.h>
23 #include <cds/container/split_list_set_rcu.h>
24
25 #include <cds/container/cuckoo_set.h>
26
27 #include <cds/container/skip_list_set_hp.h>
28 #include <cds/container/skip_list_set_dhp.h>
29 #include <cds/container/skip_list_set_rcu.h>
30
31 #include <cds/container/ellen_bintree_set_rcu.h>
32 #include <cds/container/ellen_bintree_set_hp.h>
33 #include <cds/container/ellen_bintree_set_ptb.h>
34
35 #include <cds/container/striped_set/std_list.h>
36 #include <cds/container/striped_set/std_vector.h>
37 #include <cds/container/striped_set/std_set.h>
38 #include <cds/container/striped_set/std_hash_set.h>
39 #include <cds/container/striped_set/boost_unordered_set.h>
40
41 #include <boost/version.hpp>
42 #if BOOST_VERSION >= 104800
43 #   include <cds/container/striped_set/boost_slist.h>
44 #   include <cds/container/striped_set/boost_list.h>
45 #   include <cds/container/striped_set/boost_vector.h>
46 #   include <cds/container/striped_set/boost_stable_vector.h>
47 #   include <cds/container/striped_set/boost_set.h>
48 #   include <cds/container/striped_set/boost_flat_set.h>
49 #endif
50 #include <cds/container/striped_set.h>
51
52 #include <cds/lock/spinlock.h>
53 #include <boost/functional/hash/hash.hpp>
54
55 #include "cppunit/cppunit_mini.h"
56 #include "lock/nolock.h"
57 #include "set2/std_set.h"
58 #include "set2/std_hash_set.h"
59 #include "michael_alloc.h"
60 #include "print_cuckoo_stat.h"
61 #include "print_split_list_stat.h"
62 #include "print_skip_list_stat.h"
63 #include "print_ellenbintree_stat.h"
64 #include "ellen_bintree_update_desc_pool.h"
65
66 namespace set2 {
67     namespace cc = cds::container;
68     namespace co = cds::opt;
69
70     typedef cds::urcu::gc< cds::urcu::general_instant<> >   rcu_gpi;
71     typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_gpb;
72     typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_gpt;
73 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
74     typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_shb;
75     typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_sht;
76 #endif
77
78     template <typename V, typename... Options>
79     class CuckooStripedSet:
80         public cc::CuckooSet< V,
81             typename cc::cuckoo::make_traits<
82                 co::mutex_policy< cc::cuckoo::striping<> >
83                 ,Options...
84             >::type
85         >
86     {
87     public:
88         typedef typename cc::cuckoo::make_traits<
89             co::mutex_policy< cc::cuckoo::striping<> >
90             ,Options...
91         >::type cuckoo_traits;
92
93         typedef cc::CuckooSet< V, cuckoo_traits > cuckoo_base_class;
94
95     public:
96         CuckooStripedSet( size_t nCapacity, size_t nLoadFactor )
97             : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int) 4 )
98         {}
99
100         template <typename Q, typename Pred>
101         bool erase_with( Q const& key, Pred pred )
102         {
103             return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
104         }
105     };
106
107     template <typename V, typename... Options>
108     class CuckooRefinableSet:
109         public cc::CuckooSet< V,
110             typename cc::cuckoo::make_traits<
111                 co::mutex_policy< cc::cuckoo::refinable<> >
112                 ,Options...
113             >::type
114         >
115     {
116     public:
117         typedef typename cc::cuckoo::make_traits<
118             co::mutex_policy< cc::cuckoo::refinable<> >
119             ,Options...
120         >::type cuckoo_traits;
121
122         typedef cc::CuckooSet< V, cuckoo_traits > cuckoo_base_class;
123
124     public:
125         CuckooRefinableSet( 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>
137     struct cmp {
138         int operator ()(Key const& k1, Key const& k2) const
139         {
140             if ( std::less<Key>( k1, k2 ) )
141                 return -1;
142             return std::less<Key>( k2, k1 ) ? 1 : 0;
143         }
144     };
145
146 #define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
147     CDSUNIT_INT_COMPARE(char);
148     CDSUNIT_INT_COMPARE(unsigned char);
149     CDSUNIT_INT_COMPARE(int);
150     CDSUNIT_INT_COMPARE(unsigned int);
151     CDSUNIT_INT_COMPARE(long);
152     CDSUNIT_INT_COMPARE(unsigned long);
153     CDSUNIT_INT_COMPARE(long long);
154     CDSUNIT_INT_COMPARE(unsigned long long);
155 #undef CDSUNIT_INT_COMPARE
156
157     template <>
158     struct cmp<std::string>
159     {
160         int operator()(std::string const& s1, std::string const& s2)
161         {
162             return s1.compare( s2 );
163         }
164         int operator()(std::string const& s1, char const * s2)
165         {
166             return s1.compare( s2 );
167         }
168         int operator()(char const * s1, std::string const& s2)
169         {
170             return -s2.compare( s1 );
171         }
172     };
173
174     template <typename Key, typename Value>
175     struct SetTypes {
176
177         typedef Key     key_type;
178         typedef Value   value_type;
179
180         struct key_val {
181             key_type    key;
182             value_type  val;
183
184             /*explicit*/ key_val( key_type const& k ): key(k), val() {}
185             key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
186
187             template <typename K>
188             /*explicit*/ key_val( K const& k ): key(k) {}
189
190             template <typename K, typename T>
191             key_val( K const& k, T const& v ): key(k), val(v) {}
192         };
193
194         typedef co::v::hash<key_type>   key_hash;
195         typedef std::less<key_type>     key_less;
196         typedef cmp<key_type>           key_compare;
197
198         struct less {
199             bool operator()( key_val const& k1, key_val const& k2 ) const
200             {
201                 return key_less()( k1.key, k2.key );
202             }
203             bool operator()( key_type const& k1, key_val const& k2 ) const
204             {
205                 return key_less()( k1, k2.key );
206             }
207             bool operator()( key_val const& k1, key_type const& k2 ) const
208             {
209                 return key_less()( k1.key, k2 );
210             }
211         };
212
213         struct compare {
214             int operator()( key_val const& k1, key_val const& k2 ) const
215             {
216                 return key_compare()( k1.key, k2.key );
217             }
218             int operator()( key_type const& k1, key_val const& k2 ) const
219             {
220                 return key_compare()( k1, k2.key );
221             }
222             int operator()( key_val const& k1, key_type const& k2 ) const
223             {
224                 return key_compare()( k1.key, k2 );
225             }
226         };
227
228         struct equal_to {
229             bool operator()( key_val const& k1, key_val const& k2 ) const
230             {
231                 return key_compare()( k1.key, k2.key ) == 0;
232             }
233             bool operator()( key_type const& k1, key_val const& k2 ) const
234             {
235                 return key_compare()( k1, k2.key ) == 0;
236             }
237             bool operator()( key_val const& k1, key_type const& k2 ) const
238             {
239                 return key_compare()( k1.key, k2 ) == 0;
240             }
241         };
242
243
244         struct hash: public key_hash
245         {
246             size_t operator()( key_val const& v ) const
247             {
248                 return key_hash::operator()( v.key );
249             }
250             size_t operator()( key_type const& key ) const
251             {
252                 return key_hash::operator()( key );
253             }
254             template <typename Q>
255             size_t operator()( Q const& k ) const
256             {
257                 return key_hash::operator()( k );
258             }
259         };
260
261         struct hash2: public hash
262         {
263             size_t operator()( key_val const& k ) const
264             {
265                 size_t seed = ~hash::operator ()( k );
266                 boost::hash_combine( seed, k.key );
267                 return seed;
268             }
269             size_t operator()( key_type const& k ) const
270             {
271                 size_t seed = ~hash::operator ()( k );
272                 boost::hash_combine( seed, k );
273                 return seed;
274             }
275             template <typename Q>
276             size_t operator()( Q const& k ) const
277             {
278                 return key_hash::operator()( k );
279             }
280         };
281
282         // ***************************************************************************
283         // MichaelList
284
285         struct traits_MichaelList_cmp_stdAlloc:
286             public cc::michael_list::make_traits<
287                 co::compare< compare >
288             >::type
289         {};
290         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
291         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
292         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
293         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
294         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
295 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
296         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
297         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
298 #endif
299
300         struct traits_MichaelList_cmp_stdAlloc_seqcst : public traits_MichaelList_cmp_stdAlloc
301         {
302             typedef co::v::sequential_consistent memory_model;
303         };
304         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
305         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
306         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
307         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
308         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
309 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
310         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
311         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
312 #endif
313
314         struct traits_MichaelList_less_stdAlloc :
315             public cc::michael_list::make_traits<
316                 co::less< less >
317             >::type
318         {};
319         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
320         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
321         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
322         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
323         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
324 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
325         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
326         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
327 #endif
328
329         struct traits_MichaelList_less_stdAlloc_seqcst :
330             public cc::michael_list::make_traits<
331                 co::less< less >
332                 ,co::memory_model< co::v::sequential_consistent >
333             >::type
334         {};
335         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
336         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
337         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
338         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
339         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
340 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
341         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
342         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
343 #endif
344
345         struct traits_MichaelList_cmp_michaelAlloc :
346             public cc::michael_list::make_traits<
347                 co::compare< compare >,
348                 co::allocator< memory::MichaelAllocator<int> >
349             >::type
350         {};
351         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
352         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
353         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
354         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
355         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
356 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
357         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
358         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
359 #endif
360
361         struct traits_MichaelList_less_michaelAlloc :
362             public cc::michael_list::make_traits<
363                 co::less< less >,
364                 co::allocator< memory::MichaelAllocator<int> >
365             >::type
366         {};
367         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
368         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
369         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
370         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
371         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
372 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
373         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
374         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
375 #endif
376
377         // ***************************************************************************
378         // MichaelHashSet based on MichaelList
379
380         struct traits_MichaelSet_stdAlloc :
381             public cc::michael_set::make_traits<
382                 co::hash< hash >
383             >::type
384         {};
385         typedef cc::MichaelHashSet< cds::gc::HP,  MichaelList_HP_cmp_stdAlloc,  traits_MichaelSet_stdAlloc > MichaelSet_HP_cmp_stdAlloc;
386         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_cmp_stdAlloc;
387         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_cmp_stdAlloc;
388         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_cmp_stdAlloc;
389         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_cmp_stdAlloc;
390 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
391         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_cmp_stdAlloc;
392         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_cmp_stdAlloc;
393 #endif
394
395         typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc;
396         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc;
397         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc;
398         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc;
399         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc;
400 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
401         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc;
402         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc;
403 #endif
404
405         typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc_seqcst;
406         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc_seqcst;
407         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc_seqcst;
408         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc_seqcst;
409         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc_seqcst;
410 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
411         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc_seqcst;
412         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc_seqcst;
413 #endif
414
415         struct traits_MichaelSet_michaelAlloc : 
416             public cc::michael_set::make_traits<
417                 co::hash< hash >,
418                 co::allocator< memory::MichaelAllocator<int> >
419             >::type
420         {};
421         typedef cc::MichaelHashSet< cds::gc::HP,  MichaelList_HP_cmp_michaelAlloc,  traits_MichaelSet_michaelAlloc > MichaelSet_HP_cmp_michaelAlloc;
422         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_cmp_michaelAlloc;
423         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_cmp_michaelAlloc;
424         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_cmp_michaelAlloc;
425         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_cmp_michaelAlloc;
426 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
427         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_cmp_michaelAlloc;
428         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_cmp_michaelAlloc;
429 #endif
430
431         typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_HP_less_michaelAlloc;
432         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_less_michaelAlloc;
433         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_less_michaelAlloc;
434         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_less_michaelAlloc;
435         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_less_michaelAlloc;
436 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
437         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_less_michaelAlloc;
438         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_less_michaelAlloc;
439 #endif
440
441
442         // ***************************************************************************
443         // LazyList
444
445         struct traits_LazyList_cmp_stdAlloc :
446             public cc::lazy_list::make_traits<
447                 co::compare< compare >
448             >::type
449         {};
450         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
451         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
452         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
453         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
454         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
455 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
456         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
457         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
458 #endif
459         struct traits_LazyList_cmp_stdAlloc_seqcst :
460             public cc::lazy_list::make_traits<
461                 co::compare< compare >
462                 ,co::memory_model< co::v::sequential_consistent >
463             >::type
464         {};
465         typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
466         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
467         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
468         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
469         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
470 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
471         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
472         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
473 #endif
474         struct traits_LazyList_cmp_michaelAlloc :
475             public cc::lazy_list::make_traits<
476                 co::compare< compare >,
477                 co::allocator< memory::MichaelAllocator<int> >
478             >::type
479         {};
480         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
481         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
482         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
483         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
484         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
485 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
486         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
487         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
488 #endif
489
490         struct traits_LazyList_less_stdAlloc:
491             public cc::lazy_list::make_traits<
492                 co::less< less >
493             >::type
494         {};
495         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
496         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
497         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
498         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
499         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
500 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
501         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
502         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
503 #endif
504
505         struct traits_LazyList_less_stdAlloc_seqcst :
506             public cc::lazy_list::make_traits<
507                 co::less< less >
508                 ,co::memory_model< co::v::sequential_consistent >
509             >::type
510         {};
511         typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
512         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
513         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
514         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
515         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
516 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
517         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
518         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
519 #endif
520
521         struct traits_LazyList_less_michaelAlloc :
522             public cc::lazy_list::make_traits<
523                 co::less< less >,
524                 co::allocator< memory::MichaelAllocator<int> >
525             >::type
526         {};
527         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
528         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
529         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
530         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
531         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
532 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
533         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
534         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
535 #endif
536
537         // ***************************************************************************
538         // MichaelHashSet based on LazyList
539
540         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_cmp_stdAlloc;
541         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_cmp_stdAlloc;
542         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc;
543         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc;
544         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc;
545 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
546         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc;
547         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc;
548 #endif
549
550         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc;
551         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc;
552         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc;
553         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc;
554         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc;
555 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
556         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc;
557         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc;
558 #endif
559
560         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc_seqcst;
561         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc_seqcst;
562         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc_seqcst;
563         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc_seqcst;
564         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc_seqcst;
565 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
566         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc_seqcst;
567         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc_seqcst;
568 #endif
569
570         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_cmp_michaelAlloc;
571         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_cmp_michaelAlloc;
572         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_cmp_michaelAlloc;
573         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_cmp_michaelAlloc;
574         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_cmp_michaelAlloc;
575 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
576         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_cmp_michaelAlloc;
577         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_cmp_michaelAlloc;
578 #endif
579
580         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_less_michaelAlloc;
581         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_less_michaelAlloc;
582         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_less_michaelAlloc;
583         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_less_michaelAlloc;
584         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_less_michaelAlloc;
585 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
586         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_less_michaelAlloc;
587         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_less_michaelAlloc;
588 #endif
589
590         // ***************************************************************************
591         // SplitListSet based on MichaelList
592
593         struct traits_SplitList_Michael_dyn_cmp :
594             public cc::split_list::make_traits<
595                 cc::split_list::ordered_list<cc::michael_list_tag>
596                 ,co::hash< hash >
597                 ,cc::split_list::ordered_list_traits<
598                     typename cc::michael_list::make_traits<
599                         co::compare< compare >
600                     >::type
601                 >
602             >::type
603         {};
604         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
605         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
606         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
607         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
608         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
609 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
610         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
611         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
612 #endif
613
614         struct traits_SplitList_Michael_dyn_cmp_stat :
615             public cc::split_list::make_traits<
616                 cc::split_list::ordered_list<cc::michael_list_tag>
617                 ,co::hash< hash >
618                 ,co::stat< cc::split_list::stat<> >
619                 ,cc::split_list::ordered_list_traits<
620                     typename cc::michael_list::make_traits<
621                         co::compare< compare >
622                     >::type
623                 >
624             >::type
625         {};
626         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
627         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
628         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
629         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
630         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
631 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
632         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
633         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
634 #endif
635
636         struct traits_SplitList_Michael_dyn_cmp_seqcst :
637             public cc::split_list::make_traits<
638                 cc::split_list::ordered_list<cc::michael_list_tag>
639                 ,co::hash< hash >
640                 ,co::memory_model< co::v::sequential_consistent >
641                 ,cc::split_list::ordered_list_traits<
642                     typename cc::michael_list::make_traits<
643                         co::compare< compare >
644                         ,co::memory_model< co::v::sequential_consistent >
645                     >::type
646                 >
647             >::type
648         {};
649         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
650         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
651         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
652         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
653         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
654 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
655         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
656         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
657 #endif
658
659         struct traits_SplitList_Michael_st_cmp :
660             public cc::split_list::make_traits<
661                 cc::split_list::ordered_list<cc::michael_list_tag>
662                 ,cc::split_list::dynamic_bucket_table< false >
663                 ,co::hash< hash >
664                 ,cc::split_list::ordered_list_traits<
665                     typename cc::michael_list::make_traits<
666                         co::compare< compare >
667                     >::type
668                 >
669             >::type
670         {};
671         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
672         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
673         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
674         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
675         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
676 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
677         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
678         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
679 #endif
680
681         struct traits_SplitList_Michael_st_cmp_seqcst :
682             public cc::split_list::make_traits<
683                 cc::split_list::ordered_list<cc::michael_list_tag>
684                 ,co::hash< hash >
685                 ,cc::split_list::dynamic_bucket_table< false >
686                 ,co::memory_model< co::v::sequential_consistent >
687                 ,cc::split_list::ordered_list_traits<
688                     typename cc::michael_list::make_traits<
689                         co::compare< compare >
690                         ,co::memory_model< co::v::sequential_consistent >
691                     >::type
692                 >
693             >::type
694         {};
695         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_HP_st_cmp_seqcst;
696         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_DHP_st_cmp_seqcst;
697         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPI_st_cmp_seqcst;
698         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPB_st_cmp_seqcst;
699         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPT_st_cmp_seqcst;
700 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
701         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHB_st_cmp_seqcst;
702         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHT_st_cmp_seqcst;
703 #endif
704
705         //HP + less
706         struct traits_SplitList_Michael_dyn_less :
707             public cc::split_list::make_traits<
708                 cc::split_list::ordered_list<cc::michael_list_tag>
709                 ,co::hash< hash >
710                 ,cc::split_list::ordered_list_traits<
711                     typename cc::michael_list::make_traits<
712                         co::less< less >
713                     >::type
714                 >
715             >::type
716         {};
717         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
718         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
719         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
720         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
721         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
722 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
723         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
724         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
725 #endif
726
727         struct traits_SplitList_Michael_dyn_less_seqcst :
728             public cc::split_list::make_traits<
729                 cc::split_list::ordered_list<cc::michael_list_tag>
730                 ,co::hash< hash >
731                 ,co::memory_model< co::v::sequential_consistent >
732                 ,cc::split_list::ordered_list_traits<
733                     typename cc::michael_list::make_traits<
734                         co::less< less >
735                         ,co::memory_model< co::v::sequential_consistent >
736                     >::type
737                 >
738             >::type
739         {};
740         typedef cc::SplitListSet< cds::gc::HP, key_val,  traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
741         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
742         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
743         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
744         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
745 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
746         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
747         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
748 #endif
749
750         struct traits_SplitList_Michael_st_less :
751             public cc::split_list::make_traits<
752                 cc::split_list::ordered_list<cc::michael_list_tag>
753                 ,cc::split_list::dynamic_bucket_table< false >
754                 ,co::hash< hash >
755                 ,cc::split_list::ordered_list_traits<
756                     typename cc::michael_list::make_traits<
757                         co::less< less >
758                     >::type
759                 >
760             >::type
761         {};
762         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
763         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
764         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
765         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
766         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
767 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
768         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
769         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
770 #endif
771
772         struct traits_SplitList_Michael_st_less_stat :
773             public cc::split_list::make_traits<
774                 cc::split_list::ordered_list<cc::michael_list_tag>
775                 ,cc::split_list::dynamic_bucket_table< false >
776                 ,co::hash< hash >
777                 ,co::stat< cc::split_list::stat<>>
778                 ,cc::split_list::ordered_list_traits<
779                     typename cc::michael_list::make_traits<
780                         co::less< less >
781                     >::type
782                 >
783             >::type
784         {};
785         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
786         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
787         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
788         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
789         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
790 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
791         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
792         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
793 #endif
794
795         struct traits_SplitList_Michael_st_less_seqcst :
796             public cc::split_list::make_traits<
797                 cc::split_list::ordered_list<cc::michael_list_tag>
798                 ,co::hash< hash >
799                 ,cc::split_list::dynamic_bucket_table< false >
800                 ,co::memory_model< co::v::sequential_consistent >
801                 ,cc::split_list::ordered_list_traits<
802                     typename cc::michael_list::make_traits<
803                         co::less< less >
804                         ,co::memory_model< co::v::sequential_consistent >
805                     >::type
806                 >
807             >::type
808         {};
809         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
810         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
811         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
812         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
813         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
814 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
815         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
816         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
817 #endif
818
819         // ***************************************************************************
820         // SplitListSet based on LazyList
821
822         struct traits_SplitList_Lazy_dyn_cmp :
823             public cc::split_list::make_traits<
824                 cc::split_list::ordered_list<cc::lazy_list_tag>
825                 ,co::hash< hash >
826                 ,cc::split_list::ordered_list_traits<
827                     typename cc::lazy_list::make_traits<
828                         co::compare< compare >
829                     >::type
830                 >
831             >::type
832         {};
833         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
834         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
835         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
836         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
837         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
838 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
839         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
840         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
841 #endif
842
843         struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
844         {
845             typedef cc::split_list::stat<> stat;
846         };
847         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
848         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
849         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
850         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
851         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
852 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
853         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
854         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
855 #endif
856
857         struct traits_SplitList_Lazy_dyn_cmp_seqcst :
858             public cc::split_list::make_traits<
859                 cc::split_list::ordered_list<cc::lazy_list_tag>
860                 ,co::hash< hash >
861                 ,co::memory_model< co::v::sequential_consistent >
862                 ,cc::split_list::ordered_list_traits<
863                     typename cc::lazy_list::make_traits<
864                         co::compare< compare >
865                         ,co::memory_model< co::v::sequential_consistent >
866                     >::type
867                 >
868             >::type
869         {};
870         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
871         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
872         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
873         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
874         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
875 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
876         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
877         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
878 #endif
879
880         struct traits_SplitList_Lazy_st_cmp :
881             public cc::split_list::make_traits<
882                 cc::split_list::ordered_list<cc::lazy_list_tag>
883                 ,cc::split_list::dynamic_bucket_table< false >
884                 ,co::hash< hash >
885                 ,cc::split_list::ordered_list_traits<
886                     typename cc::lazy_list::make_traits<
887                         co::compare< compare >
888                     >::type
889                 >
890             >::type
891         {};
892         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
893         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
894         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
895         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
896         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
897 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
898         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
899         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
900 #endif
901
902         struct traits_SplitList_Lazy_st_cmp_seqcst :
903             public cc::split_list::make_traits<
904                 cc::split_list::ordered_list<cc::lazy_list_tag>
905                 ,co::hash< hash >
906                 ,cc::split_list::dynamic_bucket_table< false >
907                 ,co::memory_model< co::v::sequential_consistent >
908                 ,cc::split_list::ordered_list_traits<
909                     typename cc::lazy_list::make_traits<
910                         co::compare< compare >
911                         ,co::memory_model< co::v::sequential_consistent >
912                     >::type
913                 >
914             >::type
915         {};
916         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_HP_st_cmp_seqcst;
917         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_DHP_st_cmp_seqcst;
918         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
919         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
920         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
921 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
922         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
923         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
924 #endif
925
926         struct traits_SplitList_Lazy_dyn_less :
927             public cc::split_list::make_traits<
928                 cc::split_list::ordered_list<cc::lazy_list_tag>
929                 ,co::hash< hash >
930                 ,cc::split_list::ordered_list_traits<
931                     typename cc::lazy_list::make_traits<
932                         co::less< less >
933                     >::type
934                 >
935             >::type
936         {};
937         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
938         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
939         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
940         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
941         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
942 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
943         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
944         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
945 #endif
946
947         struct traits_SplitList_Lazy_dyn_less_seqcst :
948             public cc::split_list::make_traits<
949                 cc::split_list::ordered_list<cc::lazy_list_tag>
950                 ,co::hash< hash >
951                 ,co::memory_model< co::v::sequential_consistent >
952                 ,cc::split_list::ordered_list_traits<
953                     typename cc::lazy_list::make_traits<
954                         co::less< less >
955                         ,co::memory_model< co::v::sequential_consistent >
956                     >::type
957                 >
958             >::type
959         {};
960         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
961         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
962         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
963         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
964         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
965 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
966         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
967         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
968 #endif
969
970         struct traits_SplitList_Lazy_st_less :
971             public cc::split_list::make_traits<
972                 cc::split_list::ordered_list<cc::lazy_list_tag>
973                 ,cc::split_list::dynamic_bucket_table< false >
974                 ,co::hash< hash >
975                 ,cc::split_list::ordered_list_traits<
976                     typename cc::lazy_list::make_traits<
977                         co::less< less >
978                     >::type
979                 >
980             >::type
981         {};
982         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
983         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
984         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
985         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
986         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
987 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
988         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
989         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
990 #endif
991
992         struct traits_SplitList_Lazy_st_less_seqcst :
993             public cc::split_list::make_traits<
994                 cc::split_list::ordered_list<cc::lazy_list_tag>
995                 ,co::hash< hash >
996                 ,cc::split_list::dynamic_bucket_table< false >
997                 ,co::memory_model< co::v::sequential_consistent >
998                 ,cc::split_list::ordered_list_traits<
999                     typename cc::lazy_list::make_traits<
1000                         co::less< less >
1001                         ,co::memory_model< co::v::sequential_consistent >
1002                     >::type
1003                 >
1004             >::type
1005         {};
1006         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
1007         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
1008         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
1009         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
1010         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
1011 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1012         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
1013         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
1014 #endif
1015
1016         struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
1017         {
1018             typedef cc::split_list::stat<> stat;
1019         };
1020         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
1021         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
1022         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
1023         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
1024         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
1025 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1026         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
1027         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
1028 #endif
1029
1030
1031         // ***************************************************************************
1032         // StripedSet
1033
1034         // for sequential containers
1035         template <class BucketEntry, typename... Options>
1036         class StripedHashSet_seq:
1037             public cc::StripedSet< BucketEntry,
1038                 co::mutex_policy< cc::striped_set::striping<> >
1039                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1040                 , Options...
1041             >
1042         {
1043             typedef cc::StripedSet< BucketEntry,
1044                 co::mutex_policy< cc::striped_set::striping<> >
1045                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1046                 , Options...
1047             > base_class;
1048             typedef typename base_class::resizing_policy resizing_policy_t;
1049
1050             resizing_policy_t   m_placeHolder;
1051         public:
1052             StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1053                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1054             {}
1055
1056             template <typename Q, typename Less>
1057             bool erase_with( Q const& v, Less pred )
1058             {
1059                 return base_class::erase( v );
1060             }
1061         };
1062
1063         // for non-sequential ordered containers
1064         template <class BucketEntry, typename... Options>
1065         class StripedHashSet_ord:
1066             public cc::StripedSet< BucketEntry,
1067                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1068                 ,co::mutex_policy< cc::striped_set::striping<> >
1069                 , Options...
1070             >
1071         {
1072             typedef cc::StripedSet< BucketEntry,
1073                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1074                 ,co::mutex_policy< cc::striped_set::striping<> >
1075                 , Options...
1076             > base_class;
1077             typedef typename base_class::resizing_policy resizing_policy_t;
1078
1079             resizing_policy_t   m_placeHolder;
1080         public:
1081             StripedHashSet_ord( size_t nCapacity, size_t nLoadFactor )
1082                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1083             {}
1084
1085             template <typename Q, typename Less>
1086             bool erase_with( Q const& v, Less pred )
1087             {
1088                 return base_class::erase( v );
1089             }
1090         };
1091
1092         typedef StripedHashSet_seq<
1093             std::list< key_val >
1094             , co::hash< hash2 >
1095             , co::less< less >
1096         > StripedSet_list;
1097
1098         typedef StripedHashSet_seq<
1099             std::vector< key_val >
1100             , co::hash< hash2 >
1101             , co::less< less >
1102         > StripedSet_vector;
1103
1104 #if BOOST_VERSION >= 104800
1105         typedef StripedHashSet_seq<
1106             boost::container::slist< key_val >
1107             , co::hash< hash2 >
1108             , co::less< less >
1109         > StripedSet_boost_slist;
1110
1111         typedef StripedHashSet_seq<
1112             boost::container::list< key_val >
1113             , co::hash< hash2 >
1114             , co::less< less >
1115         > StripedSet_boost_list;
1116
1117         typedef StripedHashSet_seq<
1118             boost::container::vector< key_val >
1119             , co::hash< hash2 >
1120             , co::less< less >
1121         > StripedSet_boost_vector;
1122
1123         typedef StripedHashSet_seq<
1124             boost::container::stable_vector< key_val >
1125             , co::hash< hash2 >
1126             , co::less< less >
1127         > StripedSet_boost_stable_vector;
1128 #endif
1129
1130         typedef StripedHashSet_ord<
1131             std::set< key_val, less >
1132             , co::hash< hash2 >
1133         > StripedSet_set;
1134
1135 #if (CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)) && _MSC_VER < 1600
1136         typedef StripedHashSet_ord<
1137             stdext::hash_set< key_val, hash_less >
1138             , co::hash< hash2 >
1139         > StripedSet_hashset;
1140 #else
1141         typedef StripedHashSet_ord<
1142             std::unordered_set< key_val, hash, equal_to >
1143             , co::hash< hash2 >
1144         > StripedSet_hashset;
1145 #endif
1146
1147 #if BOOST_VERSION >= 104800
1148         typedef StripedHashSet_ord<
1149             boost::container::set< key_val, less >
1150             , co::hash< hash2 >
1151         > StripedSet_boost_set;
1152
1153         typedef StripedHashSet_ord<
1154             boost::container::flat_set< key_val, less >
1155             , co::hash< hash2 >
1156         > StripedSet_boost_flat_set;
1157 #endif
1158
1159         typedef StripedHashSet_ord<
1160             boost::unordered_set< key_val, hash, equal_to >
1161             , co::hash< hash2 >
1162         > StripedSet_boost_unordered_set;
1163
1164
1165
1166         // ***************************************************************************
1167         // RefinableSet
1168
1169         // for sequential containers
1170         template <class BucketEntry, typename... Options>
1171         class RefinableHashSet_seq:
1172             public cc::StripedSet< BucketEntry,
1173             co::mutex_policy< cc::striped_set::refinable<> >
1174             ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1175             , Options...
1176             >
1177         {
1178             typedef cc::StripedSet< BucketEntry,
1179                 co::mutex_policy< cc::striped_set::refinable<> >
1180                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1181                 , Options...
1182             > base_class;
1183             typedef typename base_class::resizing_policy resizing_policy_t;
1184
1185             resizing_policy_t   m_placeHolder;
1186         public:
1187             RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1188                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1189             {}
1190
1191             template <typename Q, typename Less>
1192             bool erase_with( Q const& v, Less pred )
1193             {
1194                 return base_class::erase( v );
1195             }
1196         };
1197
1198         // for non-sequential ordered containers
1199         template <class BucketEntry, typename... Options>
1200         class RefinableHashSet_ord:
1201             public cc::StripedSet< BucketEntry,
1202                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1203                 ,co::mutex_policy< cc::striped_set::refinable<> >
1204                 , Options...
1205             >
1206         {
1207             typedef cc::StripedSet< BucketEntry,
1208                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1209                 ,co::mutex_policy< cc::striped_set::refinable<> >
1210                 , Options...
1211             > base_class;
1212             typedef typename base_class::resizing_policy resizing_policy_t;
1213
1214             resizing_policy_t   m_placeHolder;
1215         public:
1216             RefinableHashSet_ord( size_t nCapacity, size_t nLoadFactor )
1217                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1218             {}
1219
1220             template <typename Q, typename Less>
1221             bool erase_with( Q const& v, Less pred )
1222             {
1223                 return base_class::erase( v );
1224             }
1225         };
1226
1227         typedef RefinableHashSet_seq<
1228             std::list< key_val >
1229             , co::hash< hash2 >
1230             , co::less< less >
1231         > RefinableSet_list;
1232
1233         typedef RefinableHashSet_seq<
1234             std::vector< key_val >
1235             , co::hash< hash2 >
1236             , co::less< less >
1237         > RefinableSet_vector;
1238
1239 #if BOOST_VERSION >= 104800
1240         typedef RefinableHashSet_seq<
1241             boost::container::slist< key_val >
1242             , co::hash< hash2 >
1243             , co::less< less >
1244         > RefinableSet_boost_slist;
1245
1246         typedef RefinableHashSet_seq<
1247             boost::container::list< key_val >
1248             , co::hash< hash2 >
1249             , co::less< less >
1250         > RefinableSet_boost_list;
1251
1252         typedef RefinableHashSet_seq<
1253             boost::container::vector< key_val >
1254             , co::hash< hash2 >
1255             , co::less< less >
1256         > RefinableSet_boost_vector;
1257
1258         typedef RefinableHashSet_seq<
1259             boost::container::stable_vector< key_val >
1260             , co::hash< hash2 >
1261             , co::less< less >
1262         > RefinableSet_boost_stable_vector;
1263 #endif
1264
1265         typedef RefinableHashSet_ord<
1266             std::set< key_val, less >
1267             , co::hash< hash2 >
1268         > RefinableSet_set;
1269
1270 #if (CDS_COMPILER == CDS_COMPILER_MSVC || (CDS_COMPILER == CDS_COMPILER_INTEL && CDS_OS_INTERFACE == CDS_OSI_WINDOWS)) && _MSC_VER < 1600
1271         typedef RefinableHashSet_ord<
1272             stdext::hash_set< key_val, hash_less >
1273             , co::hash< hash2 >
1274         > RefinableSet_hashset;
1275 #else
1276         typedef RefinableHashSet_ord<
1277             std::unordered_set< key_val, hash, equal_to >
1278             , co::hash< hash2 >
1279         > RefinableSet_hashset;
1280 #endif
1281
1282 #if BOOST_VERSION >= 104800
1283         typedef RefinableHashSet_ord<
1284             boost::container::set< key_val, less >
1285             , co::hash< hash2 >
1286         > RefinableSet_boost_set;
1287
1288         typedef RefinableHashSet_ord<
1289             boost::container::flat_set< key_val, less >
1290             , co::hash< hash2 >
1291         > RefinableSet_boost_flat_set;
1292 #endif
1293
1294         typedef RefinableHashSet_ord<
1295             boost::unordered_set< key_val, hash, equal_to >
1296             , co::hash< hash2 >
1297         > RefinableSet_boost_unordered_set;
1298
1299
1300
1301         // ***************************************************************************
1302         // CuckooSet
1303
1304         typedef CuckooStripedSet< key_val,
1305             cc::cuckoo::probeset_type< cc::cuckoo::list >
1306             ,co::equal_to< equal_to >
1307             ,co::hash< std::tuple< hash, hash2 > >
1308         > CuckooStripedSet_list_unord;
1309
1310         typedef CuckooStripedSet< key_val,
1311             cc::cuckoo::probeset_type< cc::cuckoo::list >
1312             ,co::equal_to< equal_to >
1313             ,co::hash< std::tuple< hash, hash2 > >
1314             ,co::stat< cc::cuckoo::stat >
1315         > CuckooStripedSet_list_unord_stat;
1316
1317         typedef CuckooStripedSet< key_val,
1318             cc::cuckoo::probeset_type< cc::cuckoo::list >
1319             ,co::equal_to< equal_to >
1320             ,co::hash< std::tuple< hash, hash2 > >
1321             ,cc::cuckoo::store_hash< true >
1322         > CuckooStripedSet_list_unord_storehash;
1323
1324         typedef CuckooStripedSet< key_val,
1325             cc::cuckoo::probeset_type< cc::cuckoo::list >
1326             ,co::compare< compare >
1327             ,co::hash< std::tuple< hash, hash2 > >
1328         > CuckooStripedSet_list_ord;
1329
1330         typedef CuckooStripedSet< key_val,
1331             cc::cuckoo::probeset_type< cc::cuckoo::list >
1332             ,co::compare< compare >
1333             ,co::hash< std::tuple< hash, hash2 > >
1334             ,co::stat< cc::cuckoo::stat >
1335         > CuckooStripedSet_list_ord_stat;
1336
1337         typedef CuckooStripedSet< key_val,
1338             cc::cuckoo::probeset_type< cc::cuckoo::list >
1339             ,co::compare< compare >
1340             ,co::hash< std::tuple< hash, hash2 > >
1341             ,cc::cuckoo::store_hash< true >
1342         > CuckooStripedSet_list_ord_storehash;
1343
1344         typedef CuckooStripedSet< key_val,
1345             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1346             ,co::equal_to< equal_to >
1347             ,co::hash< std::tuple< hash, hash2 > >
1348         > CuckooStripedSet_vector_unord;
1349
1350         typedef CuckooStripedSet< key_val,
1351             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1352             ,co::equal_to< equal_to >
1353             ,co::hash< std::tuple< hash, hash2 > >
1354             ,co::stat< cc::cuckoo::stat >
1355         > CuckooStripedSet_vector_unord_stat;
1356
1357         typedef CuckooStripedSet< key_val,
1358             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1359             ,co::equal_to< equal_to >
1360             ,co::hash< std::tuple< hash, hash2 > >
1361             ,cc::cuckoo::store_hash< true >
1362         > CuckooStripedSet_vector_unord_storehash;
1363
1364         typedef CuckooStripedSet< key_val,
1365             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1366             ,co::compare< compare >
1367             ,co::hash< std::tuple< hash, hash2 > >
1368         > CuckooStripedSet_vector_ord;
1369
1370         typedef CuckooStripedSet< key_val,
1371             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1372             ,co::compare< compare >
1373             ,co::hash< std::tuple< hash, hash2 > >
1374             ,co::stat< cc::cuckoo::stat >
1375         > CuckooStripedSet_vector_ord_stat;
1376
1377         typedef CuckooStripedSet< key_val,
1378             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1379             ,co::compare< compare >
1380             ,co::hash< std::tuple< hash, hash2 > >
1381             ,cc::cuckoo::store_hash< true >
1382         > CuckooStripedSet_vector_ord_storehash;
1383
1384         typedef CuckooRefinableSet< key_val,
1385             cc::cuckoo::probeset_type< cc::cuckoo::list >
1386             ,co::equal_to< equal_to >
1387             ,co::hash< std::tuple< hash, hash2 > >
1388         > CuckooRefinableSet_list_unord;
1389
1390         typedef CuckooRefinableSet< key_val,
1391             cc::cuckoo::probeset_type< cc::cuckoo::list >
1392             ,co::equal_to< equal_to >
1393             ,co::hash< std::tuple< hash, hash2 > >
1394             ,co::stat< cc::cuckoo::stat >
1395         > CuckooRefinableSet_list_unord_stat;
1396
1397         typedef CuckooRefinableSet< key_val,
1398             cc::cuckoo::probeset_type< cc::cuckoo::list >
1399             ,co::equal_to< equal_to >
1400             ,co::hash< std::tuple< hash, hash2 > >
1401             ,cc::cuckoo::store_hash< true >
1402         > CuckooRefinableSet_list_unord_storehash;
1403
1404         typedef CuckooRefinableSet< key_val,
1405             cc::cuckoo::probeset_type< cc::cuckoo::list >
1406             ,co::compare< compare >
1407             ,co::hash< std::tuple< hash, hash2 > >
1408         > CuckooRefinableSet_list_ord;
1409
1410         typedef CuckooRefinableSet< key_val,
1411             cc::cuckoo::probeset_type< cc::cuckoo::list >
1412             ,co::compare< compare >
1413             ,co::hash< std::tuple< hash, hash2 > >
1414             ,co::stat< cc::cuckoo::stat >
1415         > CuckooRefinableSet_list_ord_stat;
1416
1417         typedef CuckooRefinableSet< key_val,
1418             cc::cuckoo::probeset_type< cc::cuckoo::list >
1419             ,co::compare< compare >
1420             ,co::hash< std::tuple< hash, hash2 > >
1421             ,cc::cuckoo::store_hash< true >
1422         > CuckooRefinableSet_list_ord_storehash;
1423
1424         typedef CuckooRefinableSet< key_val,
1425             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1426             ,co::equal_to< equal_to >
1427             ,co::hash< std::tuple< hash, hash2 > >
1428         > CuckooRefinableSet_vector_unord;
1429
1430         typedef CuckooRefinableSet< key_val,
1431             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1432             ,co::equal_to< equal_to >
1433             ,co::hash< std::tuple< hash, hash2 > >
1434             ,co::stat< cc::cuckoo::stat >
1435         > CuckooRefinableSet_vector_unord_stat;
1436
1437         typedef CuckooRefinableSet< key_val,
1438             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1439             ,co::equal_to< equal_to >
1440             ,co::hash< std::tuple< hash, hash2 > >
1441             ,cc::cuckoo::store_hash< true >
1442         > CuckooRefinableSet_vector_unord_storehash;
1443
1444         typedef CuckooRefinableSet< key_val,
1445             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1446             ,co::compare< compare >
1447             ,co::hash< std::tuple< hash, hash2 > >
1448         > CuckooRefinableSet_vector_ord;
1449
1450         typedef CuckooRefinableSet< key_val,
1451             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1452             ,co::compare< compare >
1453             ,co::hash< std::tuple< hash, hash2 > >
1454             ,co::stat< cc::cuckoo::stat >
1455         > CuckooRefinableSet_vector_ord_stat;
1456
1457         typedef CuckooRefinableSet< key_val,
1458             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1459             ,co::compare< compare >
1460             ,co::hash< std::tuple< hash, hash2 > >
1461             ,cc::cuckoo::store_hash< true >
1462         > CuckooRefinableSet_vector_ord_storehash;
1463
1464
1465         // ***************************************************************************
1466         // SkipListSet - HP
1467
1468         class traits_SkipListSet_hp_less_pascal: public cc::skip_list::make_traits <
1469                 co::less< less >
1470                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1471                 ,co::item_counter< cds::atomicity::item_counter >
1472             >::type
1473         {};
1474         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_pascal > SkipListSet_hp_less_pascal;
1475
1476         class traits_SkipListSet_hp_less_pascal_seqcst: public cc::skip_list::make_traits <
1477                 co::less< less >
1478                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1479                 ,co::memory_model< co::v::sequential_consistent >
1480                 ,co::item_counter< cds::atomicity::item_counter >
1481             >::type
1482         {};
1483         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
1484
1485         class traits_SkipListSet_hp_less_pascal_stat: public cc::skip_list::make_traits <
1486                 co::less< less >
1487                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1488                 ,co::stat< cc::skip_list::stat<> >
1489                 ,co::item_counter< cds::atomicity::item_counter >
1490             >::type
1491         {};
1492         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
1493
1494         class traits_SkipListSet_hp_cmp_pascal: public cc::skip_list::make_traits <
1495             co::compare< compare >
1496             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1497             ,co::item_counter< cds::atomicity::item_counter >
1498         >::type
1499         {};
1500         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_pascal > SkipListSet_hp_cmp_pascal;
1501
1502         class traits_SkipListSet_hp_cmp_pascal_stat: public cc::skip_list::make_traits <
1503             co::compare< compare >
1504             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1505             ,co::stat< cc::skip_list::stat<> >
1506             ,co::item_counter< cds::atomicity::item_counter >
1507         >::type
1508         {};
1509         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
1510
1511         class traits_SkipListSet_hp_less_xorshift: public cc::skip_list::make_traits <
1512             co::less< less >
1513             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1514             ,co::item_counter< cds::atomicity::item_counter >
1515         >::type
1516         {};
1517         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_xorshift > SkipListSet_hp_less_xorshift;
1518
1519         class traits_SkipListSet_hp_less_xorshift_stat: public cc::skip_list::make_traits <
1520             co::less< less >
1521             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1522             ,co::stat< cc::skip_list::stat<> >
1523             ,co::item_counter< cds::atomicity::item_counter >
1524         >::type
1525         {};
1526         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
1527
1528         class traits_SkipListSet_hp_cmp_xorshift: public cc::skip_list::make_traits <
1529             co::compare< compare >
1530             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1531             ,co::item_counter< cds::atomicity::item_counter >
1532         >::type
1533         {};
1534         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
1535
1536         class traits_SkipListSet_hp_cmp_xorshift_stat: public cc::skip_list::make_traits <
1537             co::compare< compare >
1538             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1539             ,co::stat< cc::skip_list::stat<> >
1540             ,co::item_counter< cds::atomicity::item_counter >
1541         >::type
1542         {};
1543         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_hp_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
1544
1545         // ***************************************************************************
1546         // SkipListSet - DHP
1547
1548         class traits_SkipListSet_ptb_less_pascal: public cc::skip_list::make_traits <
1549             co::less< less >
1550             ,co::item_counter< cds::atomicity::item_counter >
1551             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1552         >::type
1553         {};
1554         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_less_pascal > SkipListSet_ptb_less_pascal;
1555
1556         class traits_SkipListSet_ptb_less_pascal_seqcst: public cc::skip_list::make_traits <
1557             co::less< less >
1558             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1559             ,co::memory_model< co::v::sequential_consistent >
1560             ,co::item_counter< cds::atomicity::item_counter >
1561         >::type
1562         {};
1563         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_less_pascal_seqcst > SkipListSet_ptb_less_pascal_seqcst;
1564
1565         class traits_SkipListSet_ptb_less_pascal_stat: public cc::skip_list::make_traits <
1566             co::less< less >
1567             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1568             ,co::stat< cc::skip_list::stat<> >
1569             ,co::item_counter< cds::atomicity::item_counter >
1570         >::type
1571         {};
1572         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_less_pascal_stat > SkipListSet_ptb_less_pascal_stat;
1573
1574         class traits_SkipListSet_ptb_cmp_pascal: public cc::skip_list::make_traits <
1575             co::compare< compare >
1576             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1577             ,co::item_counter< cds::atomicity::item_counter >
1578         >::type
1579         {};
1580         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_cmp_pascal > SkipListSet_ptb_cmp_pascal;
1581
1582         class traits_SkipListSet_ptb_cmp_pascal_stat: public cc::skip_list::make_traits <
1583             co::compare< compare >
1584             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1585             ,co::stat< cc::skip_list::stat<> >
1586             ,co::item_counter< cds::atomicity::item_counter >
1587         >::type
1588         {};
1589         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_cmp_pascal_stat > SkipListSet_ptb_cmp_pascal_stat;
1590
1591         class traits_SkipListSet_ptb_less_xorshift: public cc::skip_list::make_traits <
1592             co::less< less >
1593             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1594             ,co::item_counter< cds::atomicity::item_counter >
1595         >::type
1596         {};
1597         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_less_xorshift > SkipListSet_ptb_less_xorshift;
1598
1599         class traits_SkipListSet_ptb_less_xorshift_stat: public cc::skip_list::make_traits <
1600             co::less< less >
1601             ,co::item_counter< cds::atomicity::item_counter >
1602             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1603             ,co::stat< cc::skip_list::stat<> >
1604         >::type
1605         {};
1606         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_less_xorshift_stat > SkipListSet_ptb_less_xorshift_stat;
1607
1608         class traits_SkipListSet_ptb_cmp_xorshift: public cc::skip_list::make_traits <
1609             co::compare< compare >
1610             ,co::item_counter< cds::atomicity::item_counter >
1611             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1612         >::type
1613         {};
1614         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_cmp_xorshift> SkipListSet_ptb_cmp_xorshift;
1615
1616         class traits_SkipListSet_ptb_cmp_xorshift_stat: public cc::skip_list::make_traits <
1617             co::compare< compare >
1618             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1619             ,co::stat< cc::skip_list::stat<> >
1620             ,co::item_counter< cds::atomicity::item_counter >
1621         >::type
1622         {};
1623         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_ptb_cmp_xorshift_stat > SkipListSet_ptb_cmp_xorshift_stat;
1624
1625
1626         // ***************************************************************************
1627         // SkipListSet - RCU general_instant
1628
1629         class traits_SkipListSet_rcu_gpi_less_pascal: public cc::skip_list::make_traits <
1630             co::less< less >
1631             ,co::item_counter< cds::atomicity::item_counter >
1632             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1633         >::type
1634         {};
1635         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_pascal > SkipListSet_rcu_gpi_less_pascal;
1636
1637         class traits_SkipListSet_rcu_gpi_less_pascal_seqcst: public cc::skip_list::make_traits <
1638             co::less< less >
1639             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1640             ,co::memory_model< co::v::sequential_consistent >
1641             ,co::item_counter< cds::atomicity::item_counter >
1642         >::type
1643         {};
1644         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
1645
1646         class traits_SkipListSet_rcu_gpi_less_pascal_stat: public cc::skip_list::make_traits <
1647             co::less< less >
1648             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1649             ,co::stat< cc::skip_list::stat<> >
1650             ,co::item_counter< cds::atomicity::item_counter >
1651         >::type
1652         {};
1653         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
1654
1655         class traits_SkipListSet_rcu_gpi_cmp_pascal: public cc::skip_list::make_traits <
1656             co::compare< compare >
1657             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1658             ,co::item_counter< cds::atomicity::item_counter >
1659         >::type
1660         {};
1661         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
1662
1663         class traits_SkipListSet_rcu_gpi_cmp_pascal_stat: public cc::skip_list::make_traits <
1664             co::compare< compare >
1665             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1666             ,co::stat< cc::skip_list::stat<> >
1667             ,co::item_counter< cds::atomicity::item_counter >
1668         >::type
1669         {};
1670         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
1671
1672         class traits_SkipListSet_rcu_gpi_less_xorshift: public cc::skip_list::make_traits <
1673             co::less< less >
1674             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1675             ,co::item_counter< cds::atomicity::item_counter >
1676         >::type
1677         {};
1678         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
1679
1680         class traits_SkipListSet_rcu_gpi_less_xorshift_stat: public cc::skip_list::make_traits <
1681             co::less< less >
1682             ,co::item_counter< cds::atomicity::item_counter >
1683             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1684             ,co::stat< cc::skip_list::stat<> >
1685         >::type
1686         {};
1687         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
1688
1689         class traits_SkipListSet_rcu_gpi_cmp_xorshift: public cc::skip_list::make_traits <
1690             co::compare< compare >
1691             ,co::item_counter< cds::atomicity::item_counter >
1692             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1693         >::type
1694         {};
1695         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
1696
1697         class traits_SkipListSet_rcu_gpi_cmp_xorshift_stat: public cc::skip_list::make_traits <
1698             co::compare< compare >
1699             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1700             ,co::stat< cc::skip_list::stat<> >
1701             ,co::item_counter< cds::atomicity::item_counter >
1702         >::type
1703         {};
1704         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_rcu_gpi_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
1705
1706
1707         // ***************************************************************************
1708         // SkipListSet - RCU general_buffered
1709
1710         class traits_SkipListSet_rcu_gpb_less_pascal: public cc::skip_list::make_traits <
1711             co::less< less >
1712             ,co::item_counter< cds::atomicity::item_counter >
1713             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1714         >::type
1715         {};
1716         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_pascal > SkipListSet_rcu_gpb_less_pascal;
1717
1718         class traits_SkipListSet_rcu_gpb_less_pascal_seqcst: public cc::skip_list::make_traits <
1719             co::less< less >
1720             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1721             ,co::memory_model< co::v::sequential_consistent >
1722             ,co::item_counter< cds::atomicity::item_counter >
1723         >::type
1724         {};
1725         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
1726
1727         class traits_SkipListSet_rcu_gpb_less_pascal_stat: public cc::skip_list::make_traits <
1728             co::less< less >
1729             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1730             ,co::stat< cc::skip_list::stat<> >
1731             ,co::item_counter< cds::atomicity::item_counter >
1732         >::type
1733         {};
1734         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
1735
1736         class traits_SkipListSet_rcu_gpb_cmp_pascal: public cc::skip_list::make_traits <
1737             co::compare< compare >
1738             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1739             ,co::item_counter< cds::atomicity::item_counter >
1740         >::type
1741         {};
1742         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
1743
1744         class traits_SkipListSet_rcu_gpb_cmp_pascal_stat: public cc::skip_list::make_traits <
1745             co::compare< compare >
1746             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1747             ,co::stat< cc::skip_list::stat<> >
1748             ,co::item_counter< cds::atomicity::item_counter >
1749         >::type
1750         {};
1751         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
1752
1753         class traits_SkipListSet_rcu_gpb_less_xorshift: public cc::skip_list::make_traits <
1754             co::less< less >
1755             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1756             ,co::item_counter< cds::atomicity::item_counter >
1757         >::type
1758         {};
1759         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
1760
1761         class traits_SkipListSet_rcu_gpb_less_xorshift_stat: public cc::skip_list::make_traits <
1762             co::less< less >
1763             ,co::item_counter< cds::atomicity::item_counter >
1764             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1765             ,co::stat< cc::skip_list::stat<> >
1766         >::type
1767         {};
1768         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
1769
1770         class traits_SkipListSet_rcu_gpb_cmp_xorshift: public cc::skip_list::make_traits <
1771             co::compare< compare >
1772             ,co::item_counter< cds::atomicity::item_counter >
1773             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1774         >::type
1775         {};
1776         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
1777
1778         class traits_SkipListSet_rcu_gpb_cmp_xorshift_stat: public cc::skip_list::make_traits <
1779             co::compare< compare >
1780             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1781             ,co::stat< cc::skip_list::stat<> >
1782             ,co::item_counter< cds::atomicity::item_counter >
1783         >::type
1784         {};
1785         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_rcu_gpb_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
1786
1787         // ***************************************************************************
1788         // SkipListSet - RCU general_threaded
1789
1790         class traits_SkipListSet_rcu_gpt_less_pascal: public cc::skip_list::make_traits <
1791             co::less< less >
1792             ,co::item_counter< cds::atomicity::item_counter >
1793             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1794         >::type
1795         {};
1796         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_pascal > SkipListSet_rcu_gpt_less_pascal;
1797
1798         class traits_SkipListSet_rcu_gpt_less_pascal_seqcst: public cc::skip_list::make_traits <
1799             co::less< less >
1800             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1801             ,co::memory_model< co::v::sequential_consistent >
1802             ,co::item_counter< cds::atomicity::item_counter >
1803         >::type
1804         {};
1805         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
1806
1807         class traits_SkipListSet_rcu_gpt_less_pascal_stat: public cc::skip_list::make_traits <
1808             co::less< less >
1809             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1810             ,co::stat< cc::skip_list::stat<> >
1811             ,co::item_counter< cds::atomicity::item_counter >
1812         >::type
1813         {};
1814         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
1815
1816         class traits_SkipListSet_rcu_gpt_cmp_pascal: public cc::skip_list::make_traits <
1817             co::compare< compare >
1818             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1819             ,co::item_counter< cds::atomicity::item_counter >
1820         >::type
1821         {};
1822         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
1823
1824         class traits_SkipListSet_rcu_gpt_cmp_pascal_stat: public cc::skip_list::make_traits <
1825             co::compare< compare >
1826             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1827             ,co::stat< cc::skip_list::stat<> >
1828             ,co::item_counter< cds::atomicity::item_counter >
1829         >::type
1830         {};
1831         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
1832
1833         class traits_SkipListSet_rcu_gpt_less_xorshift: public cc::skip_list::make_traits <
1834             co::less< less >
1835             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1836             ,co::item_counter< cds::atomicity::item_counter >
1837         >::type
1838         {};
1839         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
1840
1841         class traits_SkipListSet_rcu_gpt_less_xorshift_stat: public cc::skip_list::make_traits <
1842             co::less< less >
1843             ,co::item_counter< cds::atomicity::item_counter >
1844             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1845             ,co::stat< cc::skip_list::stat<> >
1846         >::type
1847         {};
1848         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
1849
1850         class traits_SkipListSet_rcu_gpt_cmp_xorshift: public cc::skip_list::make_traits <
1851             co::compare< compare >
1852             ,co::item_counter< cds::atomicity::item_counter >
1853             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1854         >::type
1855         {};
1856         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
1857
1858         class traits_SkipListSet_rcu_gpt_cmp_xorshift_stat: public cc::skip_list::make_traits <
1859             co::compare< compare >
1860             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1861             ,co::stat< cc::skip_list::stat<> >
1862             ,co::item_counter< cds::atomicity::item_counter >
1863         >::type
1864         {};
1865         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_rcu_gpt_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
1866
1867 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1868         // ***************************************************************************
1869         // SkipListSet - RCU signal_buffered
1870
1871         class traits_SkipListSet_rcu_shb_less_pascal: public cc::skip_list::make_traits <
1872             co::less< less >
1873             ,co::item_counter< cds::atomicity::item_counter >
1874             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1875         >::type
1876         {};
1877         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_pascal > SkipListSet_rcu_shb_less_pascal;
1878
1879         class traits_SkipListSet_rcu_shb_less_pascal_seqcst: public cc::skip_list::make_traits <
1880             co::less< less >
1881             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1882             ,co::memory_model< co::v::sequential_consistent >
1883             ,co::item_counter< cds::atomicity::item_counter >
1884         >::type
1885         {};
1886         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
1887
1888         class traits_SkipListSet_rcu_shb_less_pascal_stat: public cc::skip_list::make_traits <
1889             co::less< less >
1890             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1891             ,co::stat< cc::skip_list::stat<> >
1892             ,co::item_counter< cds::atomicity::item_counter >
1893         >::type
1894         {};
1895         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
1896
1897         class traits_SkipListSet_rcu_shb_cmp_pascal: public cc::skip_list::make_traits <
1898             co::compare< compare >
1899             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1900             ,co::item_counter< cds::atomicity::item_counter >
1901         >::type
1902         {};
1903         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
1904
1905         class traits_SkipListSet_rcu_shb_cmp_pascal_stat: public cc::skip_list::make_traits <
1906             co::compare< compare >
1907             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1908             ,co::stat< cc::skip_list::stat<> >
1909             ,co::item_counter< cds::atomicity::item_counter >
1910         >::type
1911         {};
1912         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
1913
1914         class traits_SkipListSet_rcu_shb_less_xorshift: public cc::skip_list::make_traits <
1915             co::less< less >
1916             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1917             ,co::item_counter< cds::atomicity::item_counter >
1918         >::type
1919         {};
1920         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
1921
1922         class traits_SkipListSet_rcu_shb_less_xorshift_stat: public cc::skip_list::make_traits <
1923             co::less< less >
1924             ,co::item_counter< cds::atomicity::item_counter >
1925             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1926             ,co::stat< cc::skip_list::stat<> >
1927         >::type
1928         {};
1929         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
1930
1931         class traits_SkipListSet_rcu_shb_cmp_xorshift: public cc::skip_list::make_traits <
1932             co::compare< compare >
1933             ,co::item_counter< cds::atomicity::item_counter >
1934             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1935         >::type
1936         {};
1937         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
1938
1939         class traits_SkipListSet_rcu_shb_cmp_xorshift_stat: public cc::skip_list::make_traits <
1940             co::compare< compare >
1941             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1942             ,co::stat< cc::skip_list::stat<> >
1943             ,co::item_counter< cds::atomicity::item_counter >
1944         >::type
1945         {};
1946         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_rcu_shb_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
1947
1948         // ***************************************************************************
1949         // SkipListSet - RCU signal_threaded
1950
1951         class traits_SkipListSet_rcu_sht_less_pascal: public cc::skip_list::make_traits <
1952             co::less< less >
1953             ,co::item_counter< cds::atomicity::item_counter >
1954             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1955         >::type
1956         {};
1957         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_pascal > SkipListSet_rcu_sht_less_pascal;
1958
1959         class traits_SkipListSet_rcu_sht_less_pascal_seqcst: public cc::skip_list::make_traits <
1960             co::less< less >
1961             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1962             ,co::memory_model< co::v::sequential_consistent >
1963             ,co::item_counter< cds::atomicity::item_counter >
1964         >::type
1965         {};
1966         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
1967
1968         class traits_SkipListSet_rcu_sht_less_pascal_stat: public cc::skip_list::make_traits <
1969             co::less< less >
1970             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1971             ,co::stat< cc::skip_list::stat<> >
1972             ,co::item_counter< cds::atomicity::item_counter >
1973         >::type
1974         {};
1975         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
1976
1977         class traits_SkipListSet_rcu_sht_cmp_pascal: public cc::skip_list::make_traits <
1978             co::compare< compare >
1979             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1980             ,co::item_counter< cds::atomicity::item_counter >
1981         >::type
1982         {};
1983         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
1984
1985         class traits_SkipListSet_rcu_sht_cmp_pascal_stat: public cc::skip_list::make_traits <
1986             co::compare< compare >
1987             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1988             ,co::stat< cc::skip_list::stat<> >
1989             ,co::item_counter< cds::atomicity::item_counter >
1990         >::type
1991         {};
1992         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
1993
1994         class traits_SkipListSet_rcu_sht_less_xorshift: public cc::skip_list::make_traits <
1995             co::less< less >
1996             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1997             ,co::item_counter< cds::atomicity::item_counter >
1998         >::type
1999         {};
2000         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
2001
2002         class traits_SkipListSet_rcu_sht_less_xorshift_stat: public cc::skip_list::make_traits <
2003             co::less< less >
2004             ,co::item_counter< cds::atomicity::item_counter >
2005             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2006             ,co::stat< cc::skip_list::stat<> >
2007         >::type
2008         {};
2009         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
2010
2011         class traits_SkipListSet_rcu_sht_cmp_xorshift: public cc::skip_list::make_traits <
2012             co::compare< compare >
2013             ,co::item_counter< cds::atomicity::item_counter >
2014             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2015         >::type
2016         {};
2017         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
2018
2019         class traits_SkipListSet_rcu_sht_cmp_xorshift_stat: public cc::skip_list::make_traits <
2020             co::compare< compare >
2021             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
2022             ,co::stat< cc::skip_list::stat<> >
2023             ,co::item_counter< cds::atomicity::item_counter >
2024         >::type
2025         {};
2026         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_rcu_sht_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
2027 #endif
2028
2029         // ***************************************************************************
2030         // EllenBinTreeSet
2031         struct ellen_bintree_props {
2032             struct key_extractor {
2033                 void operator()( key_type& dest, key_val const& src ) const
2034                 {
2035                     dest = src.key;
2036                 }
2037             };
2038
2039             struct less {
2040                 bool operator()( key_val const& v1, key_val const& v2 ) const
2041                 {
2042                     return key_less()( v1.key, v2.key );
2043                 }
2044                 bool operator()( key_type const& k, key_val const& v ) const
2045                 {
2046                     return key_less()( k, v.key );
2047                 }
2048                 bool operator()( key_val const& v, key_type const& k ) const
2049                 {
2050                     return key_less()( v.key, k );
2051                 }
2052                 bool operator()( key_type const& k1, key_type const& k2 ) const
2053                 {
2054                     return key_less()( k1, k2 );
2055                 }
2056             };
2057
2058             struct hp_gc {
2059                 typedef cc::ellen_bintree::node<cds::gc::HP, key_val>               leaf_node;
2060                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2061                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2062             };
2063
2064             struct ptb_gc {
2065                 typedef cc::ellen_bintree::node<cds::gc::DHP, key_val>              leaf_node;
2066                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2067                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2068             };
2069
2070             struct gpi {
2071                 typedef cc::ellen_bintree::node<rcu_gpi, key_val>                   leaf_node;
2072                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2073                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2074             };
2075             struct gpb {
2076                 typedef cc::ellen_bintree::node<rcu_gpb, key_val>                   leaf_node;
2077                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2078                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2079             };
2080             struct gpt {
2081                 typedef cc::ellen_bintree::node<rcu_gpt, key_val>                   leaf_node;
2082                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2083                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2084             };
2085 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
2086             struct shb {
2087                 typedef cc::ellen_bintree::node<rcu_shb, key_val>                   leaf_node;
2088                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2089                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2090             };
2091             struct sht {
2092                 typedef cc::ellen_bintree::node<rcu_sht, key_val>                   leaf_node;
2093                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
2094                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
2095             };
2096 #endif
2097         };
2098
2099
2100         // ***************************************************************************
2101         // EllenBinTreeSet - HP
2102
2103         class traits_EllenBinTreeSet_hp: public cc::ellen_bintree::make_set_traits<
2104             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2105             ,co::less< typename ellen_bintree_props::less >
2106             ,cc::ellen_bintree::update_desc_allocator<
2107                 cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2108             >
2109             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2110         >::type
2111         {};
2112         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
2113
2114         class traits_EllenBinTreeSet_hp_stat: public cc::ellen_bintree::make_set_traits<
2115             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2116             ,co::less< typename ellen_bintree_props::less >
2117             ,cc::ellen_bintree::update_desc_allocator<
2118                 cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2119             >
2120             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2121             ,co::stat< cc::ellen_bintree::stat<> >
2122         >::type
2123         {};
2124         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp_stat > EllenBinTreeSet_hp_stat;
2125
2126         // ***************************************************************************
2127         // EllenBinTreeSet - DHP
2128
2129         class traits_EllenBinTreeSet_ptb: public cc::ellen_bintree::make_set_traits<
2130             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2131             ,co::less< typename ellen_bintree_props::less >
2132             ,cc::ellen_bintree::update_desc_allocator<
2133                 cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2134             >
2135             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2136         >::type
2137         {};
2138         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_ptb > EllenBinTreeSet_ptb;
2139
2140         class traits_EllenBinTreeSet_ptb_stat: public cc::ellen_bintree::make_set_traits<
2141             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2142             ,co::less< typename ellen_bintree_props::less >
2143             ,cc::ellen_bintree::update_desc_allocator<
2144                 cds::memory::pool_allocator< typename ellen_bintree_props::ptb_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2145             >
2146             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2147             ,co::stat< cc::ellen_bintree::stat<> >
2148         >::type
2149         {};
2150         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_ptb_stat > EllenBinTreeSet_ptb_stat;
2151
2152
2153         // ***************************************************************************
2154         // EllenBinTreeSet - RCU
2155
2156         class traits_EllenBinTreeSet_rcu_gpi: public cc::ellen_bintree::make_set_traits<
2157             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2158             ,co::less< typename ellen_bintree_props::less >
2159             ,cc::ellen_bintree::update_desc_allocator<
2160                 cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
2161             >
2162             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2163         >::type
2164         {};
2165         typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_rcu_gpi > EllenBinTreeSet_rcu_gpi;
2166
2167         class traits_EllenBinTreeSet_rcu_gpi_stat: public cc::ellen_bintree::make_set_traits<
2168             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2169             ,co::less< typename ellen_bintree_props::less >
2170             ,cc::ellen_bintree::update_desc_allocator<
2171                 cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::bounded_update_desc_pool_accessor >
2172             >
2173             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2174             ,co::stat< cc::ellen_bintree::stat<> >
2175         >::type
2176         {};
2177         typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_rcu_gpi_stat > EllenBinTreeSet_rcu_gpi_stat;
2178
2179         class traits_EllenBinTreeSet_rcu_gpb: public cc::ellen_bintree::make_set_traits<
2180             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2181             ,co::less< typename ellen_bintree_props::less >
2182             ,cc::ellen_bintree::update_desc_allocator<
2183                 cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2184             >
2185             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2186         >::type
2187         {};
2188         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_rcu_gpb > EllenBinTreeSet_rcu_gpb;
2189
2190         class traits_EllenBinTreeSet_rcu_gpb_stat: public cc::ellen_bintree::make_set_traits<
2191             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2192             ,co::less< typename ellen_bintree_props::less >
2193             ,cc::ellen_bintree::update_desc_allocator<
2194                 cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2195             >
2196             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2197             ,co::stat< cc::ellen_bintree::stat<> >
2198         >::type
2199         {};
2200         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_rcu_gpb_stat > EllenBinTreeSet_rcu_gpb_stat;
2201
2202         class traits_EllenBinTreeSet_rcu_gpt: public cc::ellen_bintree::make_set_traits<
2203             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2204             ,co::less< typename ellen_bintree_props::less >
2205             ,cc::ellen_bintree::update_desc_allocator<
2206                 cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2207             >
2208             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2209         >::type
2210         {};
2211         typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_rcu_gpt > EllenBinTreeSet_rcu_gpt;
2212
2213         class traits_EllenBinTreeSet_rcu_gpt_stat: public cc::ellen_bintree::make_set_traits<
2214             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2215             ,co::less< typename ellen_bintree_props::less >
2216             ,cc::ellen_bintree::update_desc_allocator<
2217                 cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2218             >
2219             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2220             ,co::stat< cc::ellen_bintree::stat<> >
2221         >::type
2222         {};
2223         typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_rcu_gpt_stat > EllenBinTreeSet_rcu_gpt_stat;
2224
2225 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
2226         class traits_EllenBinTreeSet_rcu_shb: public cc::ellen_bintree::make_set_traits<
2227             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2228             ,co::less< typename ellen_bintree_props::less >
2229             ,cc::ellen_bintree::update_desc_allocator<
2230                 cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2231             >
2232             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2233         >::type
2234         {};
2235         typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_rcu_shb > EllenBinTreeSet_rcu_shb;
2236
2237         class traits_EllenBinTreeSet_rcu_shb_stat: public cc::ellen_bintree::make_set_traits<
2238             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2239             ,co::less< typename ellen_bintree_props::less >
2240             ,cc::ellen_bintree::update_desc_allocator<
2241                 cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2242             >
2243             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2244             ,co::stat< cc::ellen_bintree::stat<> >
2245         >::type
2246         {};
2247         typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_rcu_shb_stat > EllenBinTreeSet_rcu_shb_stat;
2248
2249         class traits_EllenBinTreeSet_rcu_sht: public cc::ellen_bintree::make_set_traits<
2250             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2251             ,co::less< typename ellen_bintree_props::less >
2252             ,cc::ellen_bintree::update_desc_allocator<
2253                 cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2254             >
2255             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2256         >::type
2257         {};
2258         typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_rcu_sht > EllenBinTreeSet_rcu_sht;
2259
2260         class traits_EllenBinTreeSet_rcu_sht_stat: public cc::ellen_bintree::make_set_traits<
2261             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
2262             ,co::less< typename ellen_bintree_props::less >
2263             ,cc::ellen_bintree::update_desc_allocator<
2264                 cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor >
2265             >
2266             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
2267             ,co::stat< cc::ellen_bintree::stat<> >
2268         >::type
2269         {};
2270         typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_rcu_sht_stat > EllenBinTreeSet_rcu_sht_stat;
2271
2272 #endif
2273
2274         // ***************************************************************************
2275         // Standard implementations
2276
2277         typedef StdSet< key_val, less, cds::SpinLock >                  StdSet_Spin;
2278         typedef StdSet< key_val, less, lock::NoLock>                    StdSet_NoLock;
2279
2280         typedef StdHashSet< key_val, hash, less, equal_to, cds::SpinLock >    StdHashSet_Spin;
2281         typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock >     StdHashSet_NoLock;
2282
2283     };
2284
2285
2286     // *************************************************
2287     // print_stat
2288     // *************************************************
2289
2290     template <typename Set>
2291     static inline void print_stat( Set const& s )
2292     {}
2293
2294     template <typename GC, typename T, typename Traits>
2295     static inline void print_stat( cc::SplitListSet<GC, T, Traits> const& s )
2296     {
2297         CPPUNIT_MSG( s.statistics() );
2298     }
2299
2300     template <typename GC, typename T, typename Traits>
2301     static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
2302     {
2303         CPPUNIT_MSG( s.statistics() );
2304     }
2305
2306     template <typename GC, typename Key, typename T, typename Traits>
2307     static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
2308     {
2309         CPPUNIT_MSG( s.statistics() );
2310     }
2311
2312     template <typename T, typename Traits >
2313     static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
2314     {
2315         CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
2316     }
2317
2318     template <typename V, typename... Options>
2319     static inline void print_stat( CuckooStripedSet< V, Options... > const& s )
2320     {
2321         typedef CuckooStripedSet< V, Options... > set_type;
2322         print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
2323     }
2324
2325     template <typename V, typename... Options>
2326     static inline void print_stat( CuckooRefinableSet< V, Options... > const& s )
2327     {
2328         typedef CuckooRefinableSet< V, Options... > set_type;
2329         print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
2330     }
2331
2332
2333
2334     //*******************************************************
2335     // additional_check
2336     //*******************************************************
2337
2338     template <typename Set>
2339     static inline void additional_check( Set& set )
2340     {}
2341
2342     template <typename Set>
2343     static inline void additional_cleanup( Set& set )
2344     {}
2345
2346     namespace ellen_bintree_check {
2347         static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
2348         {
2349             // Not true for threaded RCU
2350             /*
2351             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
2352                 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
2353                 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
2354                 );
2355             */
2356         }
2357
2358         static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
2359         {
2360             CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
2361             CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
2362             //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
2363             CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
2364             // true if RCU is not threaded
2365             //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
2366         }
2367     }   // namespace ellen_bintree_check
2368
2369     template <typename GC, typename Key, typename T, typename Traits>
2370     static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
2371     {
2372         GC::force_dispose();
2373         ellen_bintree_check::check_stat( s.statistics() );
2374     }
2375
2376     template <typename GC, typename Key, typename T, typename Traits>
2377     static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
2378     {
2379         ellen_bintree_pool::internal_node_counter::reset();
2380     }
2381
2382 }   // namespace set2
2383
2384 #endif // ifndef _CDSUNIT_SET2_SET_TYPES_H