8c3d09c6f1a499a033fa0e5c9511ab1003d067cb
[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_dhp.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         typedef StripedHashSet_ord<
1136             std::unordered_set< key_val, hash, equal_to >
1137             , co::hash< hash2 >
1138         > StripedSet_hashset;
1139
1140 #if BOOST_VERSION >= 104800
1141         typedef StripedHashSet_ord<
1142             boost::container::set< key_val, less >
1143             , co::hash< hash2 >
1144         > StripedSet_boost_set;
1145
1146         typedef StripedHashSet_ord<
1147             boost::container::flat_set< key_val, less >
1148             , co::hash< hash2 >
1149         > StripedSet_boost_flat_set;
1150 #endif
1151
1152         typedef StripedHashSet_ord<
1153             boost::unordered_set< key_val, hash, equal_to >
1154             , co::hash< hash2 >
1155         > StripedSet_boost_unordered_set;
1156
1157
1158
1159         // ***************************************************************************
1160         // RefinableSet
1161
1162         // for sequential containers
1163         template <class BucketEntry, typename... Options>
1164         class RefinableHashSet_seq:
1165             public cc::StripedSet< BucketEntry,
1166             co::mutex_policy< cc::striped_set::refinable<> >
1167             ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1168             , Options...
1169             >
1170         {
1171             typedef cc::StripedSet< BucketEntry,
1172                 co::mutex_policy< cc::striped_set::refinable<> >
1173                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1174                 , Options...
1175             > base_class;
1176             typedef typename base_class::resizing_policy resizing_policy_t;
1177
1178             resizing_policy_t   m_placeHolder;
1179         public:
1180             RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1181                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1182             {}
1183
1184             template <typename Q, typename Less>
1185             bool erase_with( Q const& v, Less pred )
1186             {
1187                 return base_class::erase( v );
1188             }
1189         };
1190
1191         // for non-sequential ordered containers
1192         template <class BucketEntry, typename... Options>
1193         class RefinableHashSet_ord:
1194             public cc::StripedSet< BucketEntry,
1195                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1196                 ,co::mutex_policy< cc::striped_set::refinable<> >
1197                 , Options...
1198             >
1199         {
1200             typedef cc::StripedSet< BucketEntry,
1201                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1202                 ,co::mutex_policy< cc::striped_set::refinable<> >
1203                 , Options...
1204             > base_class;
1205             typedef typename base_class::resizing_policy resizing_policy_t;
1206
1207             resizing_policy_t   m_placeHolder;
1208         public:
1209             RefinableHashSet_ord( size_t nCapacity, size_t nLoadFactor )
1210                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1211             {}
1212
1213             template <typename Q, typename Less>
1214             bool erase_with( Q const& v, Less pred )
1215             {
1216                 return base_class::erase( v );
1217             }
1218         };
1219
1220         typedef RefinableHashSet_seq<
1221             std::list< key_val >
1222             , co::hash< hash2 >
1223             , co::less< less >
1224         > RefinableSet_list;
1225
1226         typedef RefinableHashSet_seq<
1227             std::vector< key_val >
1228             , co::hash< hash2 >
1229             , co::less< less >
1230         > RefinableSet_vector;
1231
1232 #if BOOST_VERSION >= 104800
1233         typedef RefinableHashSet_seq<
1234             boost::container::slist< key_val >
1235             , co::hash< hash2 >
1236             , co::less< less >
1237         > RefinableSet_boost_slist;
1238
1239         typedef RefinableHashSet_seq<
1240             boost::container::list< key_val >
1241             , co::hash< hash2 >
1242             , co::less< less >
1243         > RefinableSet_boost_list;
1244
1245         typedef RefinableHashSet_seq<
1246             boost::container::vector< key_val >
1247             , co::hash< hash2 >
1248             , co::less< less >
1249         > RefinableSet_boost_vector;
1250
1251         typedef RefinableHashSet_seq<
1252             boost::container::stable_vector< key_val >
1253             , co::hash< hash2 >
1254             , co::less< less >
1255         > RefinableSet_boost_stable_vector;
1256 #endif
1257
1258         typedef RefinableHashSet_ord<
1259             std::set< key_val, less >
1260             , co::hash< hash2 >
1261         > RefinableSet_set;
1262
1263         typedef RefinableHashSet_ord<
1264             std::unordered_set< key_val, hash, equal_to >
1265             , co::hash< hash2 >
1266         > RefinableSet_hashset;
1267
1268 #if BOOST_VERSION >= 104800
1269         typedef RefinableHashSet_ord<
1270             boost::container::set< key_val, less >
1271             , co::hash< hash2 >
1272         > RefinableSet_boost_set;
1273
1274         typedef RefinableHashSet_ord<
1275             boost::container::flat_set< key_val, less >
1276             , co::hash< hash2 >
1277         > RefinableSet_boost_flat_set;
1278 #endif
1279
1280         typedef RefinableHashSet_ord<
1281             boost::unordered_set< key_val, hash, equal_to >
1282             , co::hash< hash2 >
1283         > RefinableSet_boost_unordered_set;
1284
1285         // ***************************************************************************
1286         // CuckooSet
1287
1288         typedef CuckooStripedSet< key_val,
1289             cc::cuckoo::probeset_type< cc::cuckoo::list >
1290             ,co::equal_to< equal_to >
1291             ,co::hash< std::tuple< hash, hash2 > >
1292         > CuckooStripedSet_list_unord;
1293
1294         typedef CuckooStripedSet< key_val,
1295             cc::cuckoo::probeset_type< cc::cuckoo::list >
1296             ,co::equal_to< equal_to >
1297             ,co::hash< std::tuple< hash, hash2 > >
1298             ,co::stat< cc::cuckoo::stat >
1299         > CuckooStripedSet_list_unord_stat;
1300
1301         typedef CuckooStripedSet< key_val,
1302             cc::cuckoo::probeset_type< cc::cuckoo::list >
1303             ,co::equal_to< equal_to >
1304             ,co::hash< std::tuple< hash, hash2 > >
1305             ,cc::cuckoo::store_hash< true >
1306         > CuckooStripedSet_list_unord_storehash;
1307
1308         typedef CuckooStripedSet< key_val,
1309             cc::cuckoo::probeset_type< cc::cuckoo::list >
1310             ,co::compare< compare >
1311             ,co::hash< std::tuple< hash, hash2 > >
1312         > CuckooStripedSet_list_ord;
1313
1314         typedef CuckooStripedSet< key_val,
1315             cc::cuckoo::probeset_type< cc::cuckoo::list >
1316             ,co::compare< compare >
1317             ,co::hash< std::tuple< hash, hash2 > >
1318             ,co::stat< cc::cuckoo::stat >
1319         > CuckooStripedSet_list_ord_stat;
1320
1321         typedef CuckooStripedSet< key_val,
1322             cc::cuckoo::probeset_type< cc::cuckoo::list >
1323             ,co::compare< compare >
1324             ,co::hash< std::tuple< hash, hash2 > >
1325             ,cc::cuckoo::store_hash< true >
1326         > CuckooStripedSet_list_ord_storehash;
1327
1328         typedef CuckooStripedSet< key_val,
1329             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1330             ,co::equal_to< equal_to >
1331             ,co::hash< std::tuple< hash, hash2 > >
1332         > CuckooStripedSet_vector_unord;
1333
1334         typedef CuckooStripedSet< key_val,
1335             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1336             ,co::equal_to< equal_to >
1337             ,co::hash< std::tuple< hash, hash2 > >
1338             ,co::stat< cc::cuckoo::stat >
1339         > CuckooStripedSet_vector_unord_stat;
1340
1341         typedef CuckooStripedSet< key_val,
1342             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1343             ,co::equal_to< equal_to >
1344             ,co::hash< std::tuple< hash, hash2 > >
1345             ,cc::cuckoo::store_hash< true >
1346         > CuckooStripedSet_vector_unord_storehash;
1347
1348         typedef CuckooStripedSet< key_val,
1349             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1350             ,co::compare< compare >
1351             ,co::hash< std::tuple< hash, hash2 > >
1352         > CuckooStripedSet_vector_ord;
1353
1354         typedef CuckooStripedSet< key_val,
1355             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1356             ,co::compare< compare >
1357             ,co::hash< std::tuple< hash, hash2 > >
1358             ,co::stat< cc::cuckoo::stat >
1359         > CuckooStripedSet_vector_ord_stat;
1360
1361         typedef CuckooStripedSet< key_val,
1362             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1363             ,co::compare< compare >
1364             ,co::hash< std::tuple< hash, hash2 > >
1365             ,cc::cuckoo::store_hash< true >
1366         > CuckooStripedSet_vector_ord_storehash;
1367
1368         typedef CuckooRefinableSet< key_val,
1369             cc::cuckoo::probeset_type< cc::cuckoo::list >
1370             ,co::equal_to< equal_to >
1371             ,co::hash< std::tuple< hash, hash2 > >
1372         > CuckooRefinableSet_list_unord;
1373
1374         typedef CuckooRefinableSet< key_val,
1375             cc::cuckoo::probeset_type< cc::cuckoo::list >
1376             ,co::equal_to< equal_to >
1377             ,co::hash< std::tuple< hash, hash2 > >
1378             ,co::stat< cc::cuckoo::stat >
1379         > CuckooRefinableSet_list_unord_stat;
1380
1381         typedef CuckooRefinableSet< key_val,
1382             cc::cuckoo::probeset_type< cc::cuckoo::list >
1383             ,co::equal_to< equal_to >
1384             ,co::hash< std::tuple< hash, hash2 > >
1385             ,cc::cuckoo::store_hash< true >
1386         > CuckooRefinableSet_list_unord_storehash;
1387
1388         typedef CuckooRefinableSet< key_val,
1389             cc::cuckoo::probeset_type< cc::cuckoo::list >
1390             ,co::compare< compare >
1391             ,co::hash< std::tuple< hash, hash2 > >
1392         > CuckooRefinableSet_list_ord;
1393
1394         typedef CuckooRefinableSet< key_val,
1395             cc::cuckoo::probeset_type< cc::cuckoo::list >
1396             ,co::compare< compare >
1397             ,co::hash< std::tuple< hash, hash2 > >
1398             ,co::stat< cc::cuckoo::stat >
1399         > CuckooRefinableSet_list_ord_stat;
1400
1401         typedef CuckooRefinableSet< key_val,
1402             cc::cuckoo::probeset_type< cc::cuckoo::list >
1403             ,co::compare< compare >
1404             ,co::hash< std::tuple< hash, hash2 > >
1405             ,cc::cuckoo::store_hash< true >
1406         > CuckooRefinableSet_list_ord_storehash;
1407
1408         typedef CuckooRefinableSet< key_val,
1409             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1410             ,co::equal_to< equal_to >
1411             ,co::hash< std::tuple< hash, hash2 > >
1412         > CuckooRefinableSet_vector_unord;
1413
1414         typedef CuckooRefinableSet< key_val,
1415             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1416             ,co::equal_to< equal_to >
1417             ,co::hash< std::tuple< hash, hash2 > >
1418             ,co::stat< cc::cuckoo::stat >
1419         > CuckooRefinableSet_vector_unord_stat;
1420
1421         typedef CuckooRefinableSet< key_val,
1422             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1423             ,co::equal_to< equal_to >
1424             ,co::hash< std::tuple< hash, hash2 > >
1425             ,cc::cuckoo::store_hash< true >
1426         > CuckooRefinableSet_vector_unord_storehash;
1427
1428         typedef CuckooRefinableSet< key_val,
1429             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1430             ,co::compare< compare >
1431             ,co::hash< std::tuple< hash, hash2 > >
1432         > CuckooRefinableSet_vector_ord;
1433
1434         typedef CuckooRefinableSet< key_val,
1435             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1436             ,co::compare< compare >
1437             ,co::hash< std::tuple< hash, hash2 > >
1438             ,co::stat< cc::cuckoo::stat >
1439         > CuckooRefinableSet_vector_ord_stat;
1440
1441         typedef CuckooRefinableSet< key_val,
1442             cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1443             ,co::compare< compare >
1444             ,co::hash< std::tuple< hash, hash2 > >
1445             ,cc::cuckoo::store_hash< true >
1446         > CuckooRefinableSet_vector_ord_storehash;
1447
1448
1449         // ***************************************************************************
1450         // SkipListSet
1451
1452         class traits_SkipListSet_less_pascal: public cc::skip_list::make_traits <
1453                 co::less< less >
1454                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1455                 ,co::item_counter< cds::atomicity::item_counter >
1456             >::type
1457         {};
1458         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal > SkipListSet_hp_less_pascal;
1459         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal > SkipListSet_dhp_less_pascal;
1460         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpi_less_pascal;
1461         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpb_less_pascal;
1462         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpt_less_pascal;
1463 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1464         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_shb_less_pascal;
1465         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_sht_less_pascal;
1466 #endif
1467
1468         class traits_SkipListSet_less_pascal_seqcst: public cc::skip_list::make_traits <
1469                 co::less< less >
1470                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1471                 ,co::memory_model< co::v::sequential_consistent >
1472                 ,co::item_counter< cds::atomicity::item_counter >
1473             >::type
1474         {};
1475         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
1476         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_dhp_less_pascal_seqcst;
1477         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
1478         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
1479         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
1480 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1481         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
1482         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
1483 #endif
1484
1485         class traits_SkipListSet_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_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
1493         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_dhp_less_pascal_stat;
1494         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
1495         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
1496         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
1497 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1498         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
1499         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
1500 #endif
1501
1502         class traits_SkipListSet_cmp_pascal: public cc::skip_list::make_traits <
1503             co::compare< compare >
1504             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1505             ,co::item_counter< cds::atomicity::item_counter >
1506         >::type
1507         {};
1508         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_hp_cmp_pascal;
1509         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_dhp_cmp_pascal;
1510         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
1511         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
1512         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
1513 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1514         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
1515         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
1516 #endif
1517
1518         class traits_SkipListSet_cmp_pascal_stat: public cc::skip_list::make_traits <
1519             co::compare< compare >
1520             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1521             ,co::stat< cc::skip_list::stat<> >
1522             ,co::item_counter< cds::atomicity::item_counter >
1523         >::type
1524         {};
1525         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
1526         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_dhp_cmp_pascal_stat;
1527         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
1528         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
1529         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
1530 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1531         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
1532         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
1533 #endif
1534
1535         class traits_SkipListSet_less_xorshift: public cc::skip_list::make_traits <
1536             co::less< less >
1537             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1538             ,co::item_counter< cds::atomicity::item_counter >
1539         >::type
1540         {};
1541         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_hp_less_xorshift;
1542         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_dhp_less_xorshift;
1543         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
1544         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
1545         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
1546 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1547         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
1548         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
1549 #endif
1550
1551         class traits_SkipListSet_less_xorshift_stat: public cc::skip_list::make_traits <
1552             co::less< less >
1553             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1554             ,co::stat< cc::skip_list::stat<> >
1555             ,co::item_counter< cds::atomicity::item_counter >
1556         >::type
1557         {};
1558         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
1559         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_dhp_less_xorshift_stat;
1560         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
1561         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
1562         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
1563 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1564         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
1565         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
1566 #endif
1567
1568         class traits_SkipListSet_cmp_xorshift: public cc::skip_list::make_traits <
1569             co::compare< compare >
1570             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1571             ,co::item_counter< cds::atomicity::item_counter >
1572         >::type
1573         {};
1574         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
1575         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_dhp_cmp_xorshift;
1576         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
1577         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
1578         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
1579 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1580         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
1581         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
1582 #endif
1583
1584         class traits_SkipListSet_cmp_xorshift_stat: public cc::skip_list::make_traits <
1585             co::compare< compare >
1586             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1587             ,co::stat< cc::skip_list::stat<> >
1588             ,co::item_counter< cds::atomicity::item_counter >
1589         >::type
1590         {};
1591         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
1592         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_dhp_cmp_xorshift_stat;
1593         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
1594         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
1595         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
1596 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1597         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
1598         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
1599 #endif
1600
1601
1602         // ***************************************************************************
1603         // EllenBinTreeSet
1604         struct ellen_bintree_props {
1605             struct key_extractor {
1606                 void operator()( key_type& dest, key_val const& src ) const
1607                 {
1608                     dest = src.key;
1609                 }
1610             };
1611
1612             struct less {
1613                 bool operator()( key_val const& v1, key_val const& v2 ) const
1614                 {
1615                     return key_less()( v1.key, v2.key );
1616                 }
1617                 bool operator()( key_type const& k, key_val const& v ) const
1618                 {
1619                     return key_less()( k, v.key );
1620                 }
1621                 bool operator()( key_val const& v, key_type const& k ) const
1622                 {
1623                     return key_less()( v.key, k );
1624                 }
1625                 bool operator()( key_type const& k1, key_type const& k2 ) const
1626                 {
1627                     return key_less()( k1, k2 );
1628                 }
1629             };
1630
1631             struct hp_gc {
1632                 typedef cc::ellen_bintree::node<cds::gc::HP, key_val>               leaf_node;
1633                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1634                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1635             };
1636
1637             struct dhp_gc {
1638                 typedef cc::ellen_bintree::node<cds::gc::DHP, key_val>              leaf_node;
1639                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1640                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1641             };
1642
1643             struct gpi {
1644                 typedef cc::ellen_bintree::node<rcu_gpi, key_val>                   leaf_node;
1645                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1646                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1647             };
1648             struct gpb {
1649                 typedef cc::ellen_bintree::node<rcu_gpb, key_val>                   leaf_node;
1650                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1651                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1652             };
1653             struct gpt {
1654                 typedef cc::ellen_bintree::node<rcu_gpt, key_val>                   leaf_node;
1655                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1656                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1657             };
1658 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1659             struct shb {
1660                 typedef cc::ellen_bintree::node<rcu_shb, key_val>                   leaf_node;
1661                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1662                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1663             };
1664             struct sht {
1665                 typedef cc::ellen_bintree::node<rcu_sht, key_val>                   leaf_node;
1666                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1667                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1668             };
1669 #endif
1670         };
1671
1672         struct traits_EllenBinTreeSet: public cc::ellen_bintree::make_set_traits<
1673             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
1674             ,co::less< typename ellen_bintree_props::less >
1675             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1676         >::type
1677         {};
1678
1679         struct traits_EllenBinTreeSet_hp : public traits_EllenBinTreeSet
1680         {
1681             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1682         };
1683         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
1684
1685         struct traits_EllenBinTreeSet_dhp : public traits_EllenBinTreeSet
1686         {
1687             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1688         };
1689         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_dhp > EllenBinTreeSet_dhp;
1690
1691         struct traits_EllenBinTreeSet_gpi : public traits_EllenBinTreeSet
1692         {
1693             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1694         };
1695         typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_gpi > EllenBinTreeSet_rcu_gpi;
1696
1697         struct traits_EllenBinTreeSet_gpb : public traits_EllenBinTreeSet
1698         {
1699             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1700         };
1701         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_gpb > EllenBinTreeSet_rcu_gpb;
1702
1703         struct traits_EllenBinTreeSet_gpt : public traits_EllenBinTreeSet
1704         {
1705             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1706         };
1707         typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_gpt > EllenBinTreeSet_rcu_gpt;
1708
1709 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1710         struct traits_EllenBinTreeSet_shb : public traits_EllenBinTreeSet
1711         {
1712             typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1713         };
1714         typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_shb > EllenBinTreeSet_rcu_shb;
1715
1716         struct traits_EllenBinTreeSet_sht : public traits_EllenBinTreeSet
1717         {
1718             typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1719         };
1720         typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_sht > EllenBinTreeSet_rcu_sht;
1721 #endif
1722
1723         struct traits_EllenBinTreeSet_stat: public cc::ellen_bintree::make_set_traits<
1724             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
1725             ,co::less< typename ellen_bintree_props::less >
1726             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1727             ,co::stat< cc::ellen_bintree::stat<> >
1728         >::type
1729         {};
1730
1731         struct traits_EllenBinTreeSet_stat_hp : public traits_EllenBinTreeSet_stat
1732         {
1733             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1734         };
1735         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_stat_hp > EllenBinTreeSet_hp_stat;
1736
1737         struct traits_EllenBinTreeSet_stat_dhp : public traits_EllenBinTreeSet_stat
1738         {
1739             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1740         };
1741         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_stat_dhp > EllenBinTreeSet_dhp_stat;
1742
1743         struct traits_EllenBinTreeSet_stat_gpi : public traits_EllenBinTreeSet_stat
1744         {
1745             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1746         };
1747         typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_stat_gpi > EllenBinTreeSet_rcu_gpi_stat;
1748
1749         struct traits_EllenBinTreeSet_stat_gpb : public traits_EllenBinTreeSet_stat
1750         {
1751             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1752         };
1753         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_stat_gpb > EllenBinTreeSet_rcu_gpb_stat;
1754
1755         struct traits_EllenBinTreeSet_stat_gpt : public traits_EllenBinTreeSet_stat
1756         {
1757             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1758         };
1759         typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_stat_gpt > EllenBinTreeSet_rcu_gpt_stat;
1760
1761 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1762         struct traits_EllenBinTreeSet_stat_shb : public traits_EllenBinTreeSet_stat
1763         {
1764             typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1765         };
1766         typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_stat_shb > EllenBinTreeSet_rcu_shb_stat;
1767
1768         struct traits_EllenBinTreeSet_stat_sht : public traits_EllenBinTreeSet_stat
1769         {
1770             typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1771         };
1772         typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_stat_sht > EllenBinTreeSet_rcu_sht_stat;
1773 #endif
1774
1775         // ***************************************************************************
1776         // Standard implementations
1777
1778         typedef StdSet< key_val, less, cds::SpinLock >                  StdSet_Spin;
1779         typedef StdSet< key_val, less, lock::NoLock>                    StdSet_NoLock;
1780
1781         typedef StdHashSet< key_val, hash, less, equal_to, cds::SpinLock >    StdHashSet_Spin;
1782         typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock >     StdHashSet_NoLock;
1783
1784     };
1785
1786
1787     // *************************************************
1788     // print_stat
1789     // *************************************************
1790
1791     template <typename Set>
1792     static inline void print_stat( Set const& s )
1793     {}
1794
1795     template <typename GC, typename T, typename Traits>
1796     static inline void print_stat( cc::SplitListSet<GC, T, Traits> const& s )
1797     {
1798         CPPUNIT_MSG( s.statistics() );
1799     }
1800
1801     template <typename GC, typename T, typename Traits>
1802     static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
1803     {
1804         CPPUNIT_MSG( s.statistics() );
1805     }
1806
1807     template <typename GC, typename Key, typename T, typename Traits>
1808     static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
1809     {
1810         CPPUNIT_MSG( s.statistics() );
1811     }
1812
1813     template <typename T, typename Traits >
1814     static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
1815     {
1816         CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
1817     }
1818
1819     template <typename V, typename... Options>
1820     static inline void print_stat( CuckooStripedSet< V, Options... > const& s )
1821     {
1822         typedef CuckooStripedSet< V, Options... > set_type;
1823         print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
1824     }
1825
1826     template <typename V, typename... Options>
1827     static inline void print_stat( CuckooRefinableSet< V, Options... > const& s )
1828     {
1829         typedef CuckooRefinableSet< V, Options... > set_type;
1830         print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
1831     }
1832
1833
1834
1835     //*******************************************************
1836     // additional_check
1837     //*******************************************************
1838
1839     template <typename Set>
1840     static inline void additional_check( Set& set )
1841     {}
1842
1843     template <typename Set>
1844     static inline void additional_cleanup( Set& set )
1845     {}
1846
1847     namespace ellen_bintree_check {
1848         static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
1849         {
1850             // Not true for threaded RCU
1851             /*
1852             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
1853                 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1854                 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
1855                 );
1856             */
1857         }
1858
1859         static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
1860         {
1861             CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
1862             CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
1863             //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
1864             CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
1865             // true if RCU is not threaded
1866             //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
1867         }
1868     }   // namespace ellen_bintree_check
1869
1870     template <typename GC, typename Key, typename T, typename Traits>
1871     static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
1872     {
1873         GC::force_dispose();
1874         ellen_bintree_check::check_stat( s.statistics() );
1875     }
1876
1877     template <typename GC, typename Key, typename T, typename Traits>
1878     static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
1879     {
1880         ellen_bintree_pool::internal_node_counter::reset();
1881     }
1882
1883 }   // namespace set2
1884
1885 #endif // ifndef _CDSUNIT_SET2_SET_TYPES_H