340411b3becc9c3e9b26f8f77de10be34903d92e
[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 Traits>
79     class CuckooSet : public cc::CuckooSet< V, Traits >
80     {
81     public:
82         typedef cc::CuckooSet< V, Traits > cuckoo_base_class;
83
84     public:
85         CuckooSet( size_t nCapacity, size_t nLoadFactor )
86             : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int)4 )
87         {}
88
89         template <typename Q, typename Pred>
90         bool erase_with( Q const& key, Pred pred )
91         {
92             return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
93         }
94     };
95
96     template <typename Key>
97     struct cmp {
98         int operator ()(Key const& k1, Key const& k2) const
99         {
100             if ( std::less<Key>( k1, k2 ) )
101                 return -1;
102             return std::less<Key>( k2, k1 ) ? 1 : 0;
103         }
104     };
105
106 #define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
107     CDSUNIT_INT_COMPARE(char);
108     CDSUNIT_INT_COMPARE(unsigned char);
109     CDSUNIT_INT_COMPARE(int);
110     CDSUNIT_INT_COMPARE(unsigned int);
111     CDSUNIT_INT_COMPARE(long);
112     CDSUNIT_INT_COMPARE(unsigned long);
113     CDSUNIT_INT_COMPARE(long long);
114     CDSUNIT_INT_COMPARE(unsigned long long);
115 #undef CDSUNIT_INT_COMPARE
116
117     template <>
118     struct cmp<std::string>
119     {
120         int operator()(std::string const& s1, std::string const& s2)
121         {
122             return s1.compare( s2 );
123         }
124         int operator()(std::string const& s1, char const * s2)
125         {
126             return s1.compare( s2 );
127         }
128         int operator()(char const * s1, std::string const& s2)
129         {
130             return -s2.compare( s1 );
131         }
132     };
133
134     template <typename Key, typename Value>
135     struct SetTypes {
136
137         typedef Key     key_type;
138         typedef Value   value_type;
139
140         struct key_val {
141             key_type    key;
142             value_type  val;
143
144             /*explicit*/ key_val( key_type const& k ): key(k), val() {}
145             key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
146
147             template <typename K>
148             /*explicit*/ key_val( K const& k ): key(k) {}
149
150             template <typename K, typename T>
151             key_val( K const& k, T const& v ): key(k), val(v) {}
152         };
153
154         typedef co::v::hash<key_type>   key_hash;
155         typedef std::less<key_type>     key_less;
156         typedef cmp<key_type>           key_compare;
157
158         struct less {
159             bool operator()( key_val const& k1, key_val const& k2 ) const
160             {
161                 return key_less()( k1.key, k2.key );
162             }
163             bool operator()( key_type const& k1, key_val const& k2 ) const
164             {
165                 return key_less()( k1, k2.key );
166             }
167             bool operator()( key_val const& k1, key_type const& k2 ) const
168             {
169                 return key_less()( k1.key, k2 );
170             }
171         };
172
173         struct compare {
174             int operator()( key_val const& k1, key_val const& k2 ) const
175             {
176                 return key_compare()( k1.key, k2.key );
177             }
178             int operator()( key_type const& k1, key_val const& k2 ) const
179             {
180                 return key_compare()( k1, k2.key );
181             }
182             int operator()( key_val const& k1, key_type const& k2 ) const
183             {
184                 return key_compare()( k1.key, k2 );
185             }
186         };
187
188         struct equal_to {
189             bool operator()( key_val const& k1, key_val const& k2 ) const
190             {
191                 return key_compare()( k1.key, k2.key ) == 0;
192             }
193             bool operator()( key_type const& k1, key_val const& k2 ) const
194             {
195                 return key_compare()( k1, k2.key ) == 0;
196             }
197             bool operator()( key_val const& k1, key_type const& k2 ) const
198             {
199                 return key_compare()( k1.key, k2 ) == 0;
200             }
201         };
202
203
204         struct hash: public key_hash
205         {
206             size_t operator()( key_val const& v ) const
207             {
208                 return key_hash::operator()( v.key );
209             }
210             size_t operator()( key_type const& key ) const
211             {
212                 return key_hash::operator()( key );
213             }
214             template <typename Q>
215             size_t operator()( Q const& k ) const
216             {
217                 return key_hash::operator()( k );
218             }
219         };
220
221         struct hash2: public hash
222         {
223             size_t operator()( key_val const& k ) const
224             {
225                 size_t seed = ~hash::operator ()( k );
226                 boost::hash_combine( seed, k.key );
227                 return seed;
228             }
229             size_t operator()( key_type const& k ) const
230             {
231                 size_t seed = ~hash::operator ()( k );
232                 boost::hash_combine( seed, k );
233                 return seed;
234             }
235             template <typename Q>
236             size_t operator()( Q const& k ) const
237             {
238                 return key_hash::operator()( k );
239             }
240         };
241
242         // ***************************************************************************
243         // MichaelList
244
245         struct traits_MichaelList_cmp_stdAlloc:
246             public cc::michael_list::make_traits<
247                 co::compare< compare >
248             >::type
249         {};
250         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
251         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
252         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
253         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
254         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
255 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
256         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
257         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
258 #endif
259
260         struct traits_MichaelList_cmp_stdAlloc_seqcst : public traits_MichaelList_cmp_stdAlloc
261         {
262             typedef co::v::sequential_consistent memory_model;
263         };
264         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
265         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
266         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
267         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
268         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
269 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
270         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
271         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
272 #endif
273
274         struct traits_MichaelList_less_stdAlloc :
275             public cc::michael_list::make_traits<
276                 co::less< less >
277             >::type
278         {};
279         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
280         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
281         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
282         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
283         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
284 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
285         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
286         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
287 #endif
288
289         struct traits_MichaelList_less_stdAlloc_seqcst :
290             public cc::michael_list::make_traits<
291                 co::less< less >
292                 ,co::memory_model< co::v::sequential_consistent >
293             >::type
294         {};
295         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
296         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
297         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
298         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
299         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
300 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
301         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
302         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
303 #endif
304
305         struct traits_MichaelList_cmp_michaelAlloc :
306             public cc::michael_list::make_traits<
307                 co::compare< compare >,
308                 co::allocator< memory::MichaelAllocator<int> >
309             >::type
310         {};
311         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
312         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
313         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
314         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
315         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
316 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
317         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
318         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
319 #endif
320
321         struct traits_MichaelList_less_michaelAlloc :
322             public cc::michael_list::make_traits<
323                 co::less< less >,
324                 co::allocator< memory::MichaelAllocator<int> >
325             >::type
326         {};
327         typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
328         typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
329         typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
330         typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
331         typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
332 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
333         typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
334         typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
335 #endif
336
337         // ***************************************************************************
338         // MichaelHashSet based on MichaelList
339
340         struct traits_MichaelSet_stdAlloc :
341             public cc::michael_set::make_traits<
342                 co::hash< hash >
343             >::type
344         {};
345         typedef cc::MichaelHashSet< cds::gc::HP,  MichaelList_HP_cmp_stdAlloc,  traits_MichaelSet_stdAlloc > MichaelSet_HP_cmp_stdAlloc;
346         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_cmp_stdAlloc;
347         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_cmp_stdAlloc;
348         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_cmp_stdAlloc;
349         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_cmp_stdAlloc;
350 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
351         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_cmp_stdAlloc;
352         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_cmp_stdAlloc;
353 #endif
354
355         typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc;
356         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc;
357         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc;
358         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc;
359         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc;
360 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
361         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc;
362         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc;
363 #endif
364
365         typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc_seqcst;
366         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc_seqcst;
367         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc_seqcst;
368         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc_seqcst;
369         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc_seqcst;
370 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
371         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc_seqcst;
372         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc_seqcst;
373 #endif
374
375         struct traits_MichaelSet_michaelAlloc :
376             public cc::michael_set::make_traits<
377                 co::hash< hash >,
378                 co::allocator< memory::MichaelAllocator<int> >
379             >::type
380         {};
381         typedef cc::MichaelHashSet< cds::gc::HP,  MichaelList_HP_cmp_michaelAlloc,  traits_MichaelSet_michaelAlloc > MichaelSet_HP_cmp_michaelAlloc;
382         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_cmp_michaelAlloc;
383         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_cmp_michaelAlloc;
384         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_cmp_michaelAlloc;
385         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_cmp_michaelAlloc;
386 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
387         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_cmp_michaelAlloc;
388         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_cmp_michaelAlloc;
389 #endif
390
391         typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_HP_less_michaelAlloc;
392         typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_less_michaelAlloc;
393         typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_less_michaelAlloc;
394         typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_less_michaelAlloc;
395         typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_less_michaelAlloc;
396 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
397         typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_less_michaelAlloc;
398         typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_less_michaelAlloc;
399 #endif
400
401
402         // ***************************************************************************
403         // LazyList
404
405         struct traits_LazyList_cmp_stdAlloc :
406             public cc::lazy_list::make_traits<
407                 co::compare< compare >
408             >::type
409         {};
410         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
411         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
412         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
413         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
414         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
415 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
416         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
417         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
418 #endif
419         struct traits_LazyList_cmp_stdAlloc_seqcst :
420             public cc::lazy_list::make_traits<
421                 co::compare< compare >
422                 ,co::memory_model< co::v::sequential_consistent >
423             >::type
424         {};
425         typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
426         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
427         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
428         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
429         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
430 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
431         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
432         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
433 #endif
434         struct traits_LazyList_cmp_michaelAlloc :
435             public cc::lazy_list::make_traits<
436                 co::compare< compare >,
437                 co::allocator< memory::MichaelAllocator<int> >
438             >::type
439         {};
440         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
441         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
442         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
443         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
444         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
445 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
446         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
447         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
448 #endif
449
450         struct traits_LazyList_less_stdAlloc:
451             public cc::lazy_list::make_traits<
452                 co::less< less >
453             >::type
454         {};
455         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
456         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
457         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
458         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
459         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
460 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
461         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
462         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
463 #endif
464
465         struct traits_LazyList_less_stdAlloc_seqcst :
466             public cc::lazy_list::make_traits<
467                 co::less< less >
468                 ,co::memory_model< co::v::sequential_consistent >
469             >::type
470         {};
471         typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
472         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
473         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
474         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
475         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
476 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
477         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
478         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
479 #endif
480
481         struct traits_LazyList_less_michaelAlloc :
482             public cc::lazy_list::make_traits<
483                 co::less< less >,
484                 co::allocator< memory::MichaelAllocator<int> >
485             >::type
486         {};
487         typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
488         typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
489         typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
490         typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
491         typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
492 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
493         typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
494         typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
495 #endif
496
497         // ***************************************************************************
498         // MichaelHashSet based on LazyList
499
500         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_cmp_stdAlloc;
501         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_cmp_stdAlloc;
502         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc;
503         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc;
504         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc;
505 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
506         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc;
507         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc;
508 #endif
509
510         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc;
511         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc;
512         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc;
513         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc;
514         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc;
515 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
516         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc;
517         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc;
518 #endif
519
520         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc_seqcst;
521         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc_seqcst;
522         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc_seqcst;
523         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc_seqcst;
524         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc_seqcst;
525 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
526         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc_seqcst;
527         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc_seqcst;
528 #endif
529
530         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_cmp_michaelAlloc;
531         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_cmp_michaelAlloc;
532         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_cmp_michaelAlloc;
533         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_cmp_michaelAlloc;
534         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_cmp_michaelAlloc;
535 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
536         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_cmp_michaelAlloc;
537         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_cmp_michaelAlloc;
538 #endif
539
540         typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_less_michaelAlloc;
541         typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_less_michaelAlloc;
542         typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_less_michaelAlloc;
543         typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_less_michaelAlloc;
544         typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_less_michaelAlloc;
545 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
546         typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_less_michaelAlloc;
547         typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_less_michaelAlloc;
548 #endif
549
550         // ***************************************************************************
551         // SplitListSet based on MichaelList
552
553         struct traits_SplitList_Michael_dyn_cmp :
554             public cc::split_list::make_traits<
555                 cc::split_list::ordered_list<cc::michael_list_tag>
556                 ,co::hash< hash >
557                 ,cc::split_list::ordered_list_traits<
558                     typename cc::michael_list::make_traits<
559                         co::compare< compare >
560                     >::type
561                 >
562             >::type
563         {};
564         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
565         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
566         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
567         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
568         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
569 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
570         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
571         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
572 #endif
573
574         struct traits_SplitList_Michael_dyn_cmp_stat :
575             public cc::split_list::make_traits<
576                 cc::split_list::ordered_list<cc::michael_list_tag>
577                 ,co::hash< hash >
578                 ,co::stat< cc::split_list::stat<> >
579                 ,cc::split_list::ordered_list_traits<
580                     typename cc::michael_list::make_traits<
581                         co::compare< compare >
582                     >::type
583                 >
584             >::type
585         {};
586         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
587         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
588         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
589         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
590         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
591 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
592         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
593         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
594 #endif
595
596         struct traits_SplitList_Michael_dyn_cmp_seqcst :
597             public cc::split_list::make_traits<
598                 cc::split_list::ordered_list<cc::michael_list_tag>
599                 ,co::hash< hash >
600                 ,co::memory_model< co::v::sequential_consistent >
601                 ,cc::split_list::ordered_list_traits<
602                     typename cc::michael_list::make_traits<
603                         co::compare< compare >
604                         ,co::memory_model< co::v::sequential_consistent >
605                     >::type
606                 >
607             >::type
608         {};
609         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
610         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
611         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
612         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
613         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
614 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
615         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
616         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
617 #endif
618
619         struct traits_SplitList_Michael_st_cmp :
620             public cc::split_list::make_traits<
621                 cc::split_list::ordered_list<cc::michael_list_tag>
622                 ,cc::split_list::dynamic_bucket_table< false >
623                 ,co::hash< hash >
624                 ,cc::split_list::ordered_list_traits<
625                     typename cc::michael_list::make_traits<
626                         co::compare< compare >
627                     >::type
628                 >
629             >::type
630         {};
631         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
632         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
633         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
634         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
635         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
636 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
637         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
638         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
639 #endif
640
641         struct traits_SplitList_Michael_st_cmp_seqcst :
642             public cc::split_list::make_traits<
643                 cc::split_list::ordered_list<cc::michael_list_tag>
644                 ,co::hash< hash >
645                 ,cc::split_list::dynamic_bucket_table< false >
646                 ,co::memory_model< co::v::sequential_consistent >
647                 ,cc::split_list::ordered_list_traits<
648                     typename cc::michael_list::make_traits<
649                         co::compare< compare >
650                         ,co::memory_model< co::v::sequential_consistent >
651                     >::type
652                 >
653             >::type
654         {};
655         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_HP_st_cmp_seqcst;
656         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_DHP_st_cmp_seqcst;
657         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPI_st_cmp_seqcst;
658         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPB_st_cmp_seqcst;
659         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPT_st_cmp_seqcst;
660 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
661         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHB_st_cmp_seqcst;
662         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHT_st_cmp_seqcst;
663 #endif
664
665         //HP + less
666         struct traits_SplitList_Michael_dyn_less :
667             public cc::split_list::make_traits<
668                 cc::split_list::ordered_list<cc::michael_list_tag>
669                 ,co::hash< hash >
670                 ,cc::split_list::ordered_list_traits<
671                     typename cc::michael_list::make_traits<
672                         co::less< less >
673                     >::type
674                 >
675             >::type
676         {};
677         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
678         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
679         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
680         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
681         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
682 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
683         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
684         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
685 #endif
686
687         struct traits_SplitList_Michael_dyn_less_seqcst :
688             public cc::split_list::make_traits<
689                 cc::split_list::ordered_list<cc::michael_list_tag>
690                 ,co::hash< hash >
691                 ,co::memory_model< co::v::sequential_consistent >
692                 ,cc::split_list::ordered_list_traits<
693                     typename cc::michael_list::make_traits<
694                         co::less< less >
695                         ,co::memory_model< co::v::sequential_consistent >
696                     >::type
697                 >
698             >::type
699         {};
700         typedef cc::SplitListSet< cds::gc::HP, key_val,  traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
701         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
702         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
703         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
704         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
705 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
706         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
707         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
708 #endif
709
710         struct traits_SplitList_Michael_st_less :
711             public cc::split_list::make_traits<
712                 cc::split_list::ordered_list<cc::michael_list_tag>
713                 ,cc::split_list::dynamic_bucket_table< false >
714                 ,co::hash< hash >
715                 ,cc::split_list::ordered_list_traits<
716                     typename cc::michael_list::make_traits<
717                         co::less< less >
718                     >::type
719                 >
720             >::type
721         {};
722         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
723         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
724         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
725         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
726         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
727 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
728         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
729         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
730 #endif
731
732         struct traits_SplitList_Michael_st_less_stat :
733             public cc::split_list::make_traits<
734                 cc::split_list::ordered_list<cc::michael_list_tag>
735                 ,cc::split_list::dynamic_bucket_table< false >
736                 ,co::hash< hash >
737                 ,co::stat< cc::split_list::stat<>>
738                 ,cc::split_list::ordered_list_traits<
739                     typename cc::michael_list::make_traits<
740                         co::less< less >
741                     >::type
742                 >
743             >::type
744         {};
745         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
746         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
747         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
748         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
749         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
750 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
751         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
752         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
753 #endif
754
755         struct traits_SplitList_Michael_st_less_seqcst :
756             public cc::split_list::make_traits<
757                 cc::split_list::ordered_list<cc::michael_list_tag>
758                 ,co::hash< hash >
759                 ,cc::split_list::dynamic_bucket_table< false >
760                 ,co::memory_model< co::v::sequential_consistent >
761                 ,cc::split_list::ordered_list_traits<
762                     typename cc::michael_list::make_traits<
763                         co::less< less >
764                         ,co::memory_model< co::v::sequential_consistent >
765                     >::type
766                 >
767             >::type
768         {};
769         typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
770         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
771         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
772         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
773         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
774 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
775         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
776         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
777 #endif
778
779         // ***************************************************************************
780         // SplitListSet based on LazyList
781
782         struct traits_SplitList_Lazy_dyn_cmp :
783             public cc::split_list::make_traits<
784                 cc::split_list::ordered_list<cc::lazy_list_tag>
785                 ,co::hash< hash >
786                 ,cc::split_list::ordered_list_traits<
787                     typename cc::lazy_list::make_traits<
788                         co::compare< compare >
789                     >::type
790                 >
791             >::type
792         {};
793         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
794         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
795         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
796         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
797         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
798 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
799         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
800         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
801 #endif
802
803         struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
804         {
805             typedef cc::split_list::stat<> stat;
806         };
807         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
808         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
809         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
810         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
811         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
812 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
813         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
814         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
815 #endif
816
817         struct traits_SplitList_Lazy_dyn_cmp_seqcst :
818             public cc::split_list::make_traits<
819                 cc::split_list::ordered_list<cc::lazy_list_tag>
820                 ,co::hash< hash >
821                 ,co::memory_model< co::v::sequential_consistent >
822                 ,cc::split_list::ordered_list_traits<
823                     typename cc::lazy_list::make_traits<
824                         co::compare< compare >
825                         ,co::memory_model< co::v::sequential_consistent >
826                     >::type
827                 >
828             >::type
829         {};
830         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
831         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
832         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
833         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
834         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
835 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
836         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
837         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
838 #endif
839
840         struct traits_SplitList_Lazy_st_cmp :
841             public cc::split_list::make_traits<
842                 cc::split_list::ordered_list<cc::lazy_list_tag>
843                 ,cc::split_list::dynamic_bucket_table< false >
844                 ,co::hash< hash >
845                 ,cc::split_list::ordered_list_traits<
846                     typename cc::lazy_list::make_traits<
847                         co::compare< compare >
848                     >::type
849                 >
850             >::type
851         {};
852         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
853         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
854         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
855         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
856         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
857 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
858         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
859         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
860 #endif
861
862         struct traits_SplitList_Lazy_st_cmp_seqcst :
863             public cc::split_list::make_traits<
864                 cc::split_list::ordered_list<cc::lazy_list_tag>
865                 ,co::hash< hash >
866                 ,cc::split_list::dynamic_bucket_table< false >
867                 ,co::memory_model< co::v::sequential_consistent >
868                 ,cc::split_list::ordered_list_traits<
869                     typename cc::lazy_list::make_traits<
870                         co::compare< compare >
871                         ,co::memory_model< co::v::sequential_consistent >
872                     >::type
873                 >
874             >::type
875         {};
876         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_HP_st_cmp_seqcst;
877         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_DHP_st_cmp_seqcst;
878         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
879         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
880         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
881 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
882         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
883         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
884 #endif
885
886         struct traits_SplitList_Lazy_dyn_less :
887             public cc::split_list::make_traits<
888                 cc::split_list::ordered_list<cc::lazy_list_tag>
889                 ,co::hash< hash >
890                 ,cc::split_list::ordered_list_traits<
891                     typename cc::lazy_list::make_traits<
892                         co::less< less >
893                     >::type
894                 >
895             >::type
896         {};
897         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
898         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
899         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
900         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
901         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
902 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
903         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
904         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
905 #endif
906
907         struct traits_SplitList_Lazy_dyn_less_seqcst :
908             public cc::split_list::make_traits<
909                 cc::split_list::ordered_list<cc::lazy_list_tag>
910                 ,co::hash< hash >
911                 ,co::memory_model< co::v::sequential_consistent >
912                 ,cc::split_list::ordered_list_traits<
913                     typename cc::lazy_list::make_traits<
914                         co::less< less >
915                         ,co::memory_model< co::v::sequential_consistent >
916                     >::type
917                 >
918             >::type
919         {};
920         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
921         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
922         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
923         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
924         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
925 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
926         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
927         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
928 #endif
929
930         struct traits_SplitList_Lazy_st_less :
931             public cc::split_list::make_traits<
932                 cc::split_list::ordered_list<cc::lazy_list_tag>
933                 ,cc::split_list::dynamic_bucket_table< false >
934                 ,co::hash< hash >
935                 ,cc::split_list::ordered_list_traits<
936                     typename cc::lazy_list::make_traits<
937                         co::less< less >
938                     >::type
939                 >
940             >::type
941         {};
942         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
943         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
944         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
945         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
946         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
947 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
948         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
949         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
950 #endif
951
952         struct traits_SplitList_Lazy_st_less_seqcst :
953             public cc::split_list::make_traits<
954                 cc::split_list::ordered_list<cc::lazy_list_tag>
955                 ,co::hash< hash >
956                 ,cc::split_list::dynamic_bucket_table< false >
957                 ,co::memory_model< co::v::sequential_consistent >
958                 ,cc::split_list::ordered_list_traits<
959                     typename cc::lazy_list::make_traits<
960                         co::less< less >
961                         ,co::memory_model< co::v::sequential_consistent >
962                     >::type
963                 >
964             >::type
965         {};
966         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
967         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
968         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
969         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
970         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
971 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
972         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
973         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
974 #endif
975
976         struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
977         {
978             typedef cc::split_list::stat<> stat;
979         };
980         typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
981         typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
982         typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
983         typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
984         typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
985 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
986         typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
987         typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
988 #endif
989
990
991         // ***************************************************************************
992         // StripedSet
993
994         // for sequential containers
995         template <class BucketEntry, typename... Options>
996         class StripedHashSet_seq:
997             public cc::StripedSet< BucketEntry,
998                 co::mutex_policy< cc::striped_set::striping<> >
999                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1000                 , Options...
1001             >
1002         {
1003             typedef cc::StripedSet< BucketEntry,
1004                 co::mutex_policy< cc::striped_set::striping<> >
1005                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1006                 , Options...
1007             > base_class;
1008             typedef typename base_class::resizing_policy resizing_policy_t;
1009
1010             resizing_policy_t   m_placeHolder;
1011         public:
1012             StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1013                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1014             {}
1015
1016             template <typename Q, typename Less>
1017             bool erase_with( Q const& v, Less pred )
1018             {
1019                 return base_class::erase( v );
1020             }
1021         };
1022
1023         // for non-sequential ordered containers
1024         template <class BucketEntry, typename... Options>
1025         class StripedHashSet_ord:
1026             public cc::StripedSet< BucketEntry,
1027                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1028                 ,co::mutex_policy< cc::striped_set::striping<> >
1029                 , Options...
1030             >
1031         {
1032             typedef cc::StripedSet< BucketEntry,
1033                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1034                 ,co::mutex_policy< cc::striped_set::striping<> >
1035                 , Options...
1036             > base_class;
1037             typedef typename base_class::resizing_policy resizing_policy_t;
1038
1039             resizing_policy_t   m_placeHolder;
1040         public:
1041             StripedHashSet_ord( size_t nCapacity, size_t nLoadFactor )
1042                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1043             {}
1044
1045             template <typename Q, typename Less>
1046             bool erase_with( Q const& v, Less pred )
1047             {
1048                 return base_class::erase( v );
1049             }
1050         };
1051
1052         typedef StripedHashSet_seq<
1053             std::list< key_val >
1054             , co::hash< hash2 >
1055             , co::less< less >
1056         > StripedSet_list;
1057
1058         typedef StripedHashSet_seq<
1059             std::vector< key_val >
1060             , co::hash< hash2 >
1061             , co::less< less >
1062         > StripedSet_vector;
1063
1064 #if BOOST_VERSION >= 104800
1065         typedef StripedHashSet_seq<
1066             boost::container::slist< key_val >
1067             , co::hash< hash2 >
1068             , co::less< less >
1069         > StripedSet_boost_slist;
1070
1071         typedef StripedHashSet_seq<
1072             boost::container::list< key_val >
1073             , co::hash< hash2 >
1074             , co::less< less >
1075         > StripedSet_boost_list;
1076
1077         typedef StripedHashSet_seq<
1078             boost::container::vector< key_val >
1079             , co::hash< hash2 >
1080             , co::less< less >
1081         > StripedSet_boost_vector;
1082
1083         typedef StripedHashSet_seq<
1084             boost::container::stable_vector< key_val >
1085             , co::hash< hash2 >
1086             , co::less< less >
1087         > StripedSet_boost_stable_vector;
1088 #endif
1089
1090         typedef StripedHashSet_ord<
1091             std::set< key_val, less >
1092             , co::hash< hash2 >
1093         > StripedSet_set;
1094
1095         typedef StripedHashSet_ord<
1096             std::unordered_set< key_val, hash, equal_to >
1097             , co::hash< hash2 >
1098         > StripedSet_hashset;
1099
1100 #if BOOST_VERSION >= 104800
1101         typedef StripedHashSet_ord<
1102             boost::container::set< key_val, less >
1103             , co::hash< hash2 >
1104         > StripedSet_boost_set;
1105
1106         typedef StripedHashSet_ord<
1107             boost::container::flat_set< key_val, less >
1108             , co::hash< hash2 >
1109         > StripedSet_boost_flat_set;
1110 #endif
1111
1112         typedef StripedHashSet_ord<
1113             boost::unordered_set< key_val, hash, equal_to >
1114             , co::hash< hash2 >
1115         > StripedSet_boost_unordered_set;
1116
1117
1118
1119         // ***************************************************************************
1120         // RefinableSet
1121
1122         // for sequential containers
1123         template <class BucketEntry, typename... Options>
1124         class RefinableHashSet_seq:
1125             public cc::StripedSet< BucketEntry,
1126             co::mutex_policy< cc::striped_set::refinable<> >
1127             ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1128             , Options...
1129             >
1130         {
1131             typedef cc::StripedSet< BucketEntry,
1132                 co::mutex_policy< cc::striped_set::refinable<> >
1133                 ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1134                 , Options...
1135             > base_class;
1136             typedef typename base_class::resizing_policy resizing_policy_t;
1137
1138             resizing_policy_t   m_placeHolder;
1139         public:
1140             RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
1141                 : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
1142             {}
1143
1144             template <typename Q, typename Less>
1145             bool erase_with( Q const& v, Less pred )
1146             {
1147                 return base_class::erase( v );
1148             }
1149         };
1150
1151         // for non-sequential ordered containers
1152         template <class BucketEntry, typename... Options>
1153         class RefinableHashSet_ord:
1154             public cc::StripedSet< BucketEntry,
1155                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1156                 ,co::mutex_policy< cc::striped_set::refinable<> >
1157                 , Options...
1158             >
1159         {
1160             typedef cc::StripedSet< BucketEntry,
1161                 co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
1162                 ,co::mutex_policy< cc::striped_set::refinable<> >
1163                 , Options...
1164             > base_class;
1165             typedef typename base_class::resizing_policy resizing_policy_t;
1166
1167             resizing_policy_t   m_placeHolder;
1168         public:
1169             RefinableHashSet_ord( size_t nCapacity, size_t nLoadFactor )
1170                 : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
1171             {}
1172
1173             template <typename Q, typename Less>
1174             bool erase_with( Q const& v, Less pred )
1175             {
1176                 return base_class::erase( v );
1177             }
1178         };
1179
1180         typedef RefinableHashSet_seq<
1181             std::list< key_val >
1182             , co::hash< hash2 >
1183             , co::less< less >
1184         > RefinableSet_list;
1185
1186         typedef RefinableHashSet_seq<
1187             std::vector< key_val >
1188             , co::hash< hash2 >
1189             , co::less< less >
1190         > RefinableSet_vector;
1191
1192 #if BOOST_VERSION >= 104800
1193         typedef RefinableHashSet_seq<
1194             boost::container::slist< key_val >
1195             , co::hash< hash2 >
1196             , co::less< less >
1197         > RefinableSet_boost_slist;
1198
1199         typedef RefinableHashSet_seq<
1200             boost::container::list< key_val >
1201             , co::hash< hash2 >
1202             , co::less< less >
1203         > RefinableSet_boost_list;
1204
1205         typedef RefinableHashSet_seq<
1206             boost::container::vector< key_val >
1207             , co::hash< hash2 >
1208             , co::less< less >
1209         > RefinableSet_boost_vector;
1210
1211         typedef RefinableHashSet_seq<
1212             boost::container::stable_vector< key_val >
1213             , co::hash< hash2 >
1214             , co::less< less >
1215         > RefinableSet_boost_stable_vector;
1216 #endif
1217
1218         typedef RefinableHashSet_ord<
1219             std::set< key_val, less >
1220             , co::hash< hash2 >
1221         > RefinableSet_set;
1222
1223         typedef RefinableHashSet_ord<
1224             std::unordered_set< key_val, hash, equal_to >
1225             , co::hash< hash2 >
1226         > RefinableSet_hashset;
1227
1228 #if BOOST_VERSION >= 104800
1229         typedef RefinableHashSet_ord<
1230             boost::container::set< key_val, less >
1231             , co::hash< hash2 >
1232         > RefinableSet_boost_set;
1233
1234         typedef RefinableHashSet_ord<
1235             boost::container::flat_set< key_val, less >
1236             , co::hash< hash2 >
1237         > RefinableSet_boost_flat_set;
1238 #endif
1239
1240         typedef RefinableHashSet_ord<
1241             boost::unordered_set< key_val, hash, equal_to >
1242             , co::hash< hash2 >
1243         > RefinableSet_boost_unordered_set;
1244
1245         // ***************************************************************************
1246         // CuckooSet
1247
1248         template <typename Traits>
1249         struct traits_CuckooStripedSet : public Traits
1250         {
1251             typedef cc::cuckoo::striping<> mutex_policy;
1252         };
1253         template <typename Traits>
1254         struct traits_CuckooRefinableSet : public Traits
1255         {
1256             typedef cc::cuckoo::refinable<> mutex_policy;
1257         };
1258
1259         struct traits_CuckooSet_list_unord :
1260             public cc::cuckoo::make_traits <
1261                 cc::cuckoo::probeset_type< cc::cuckoo::list >
1262                 , co::equal_to< equal_to >
1263                 , co::hash< std::tuple< hash, hash2 > >
1264             > ::type
1265         {};
1266         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord>> CuckooStripedSet_list_unord;
1267         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord>> CuckooRefinableSet_list_unord;
1268
1269         struct traits_CuckooSet_list_unord_stat : public traits_CuckooSet_list_unord
1270         {
1271             typedef cc::cuckoo::stat stat;
1272         };
1273         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_stat>> CuckooStripedSet_list_unord_stat;
1274         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_stat>> CuckooRefinableSet_list_unord_stat;
1275
1276         struct traits_CuckooSet_list_unord_storehash : public traits_CuckooSet_list_unord
1277         {
1278             static CDS_CONSTEXPR const bool store_hash = true;
1279         };
1280         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_storehash>> CuckooStripedSet_list_unord_storehash;
1281         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_storehash>> CuckooRefinableSet_list_unord_storehash;
1282
1283         struct traits_CuckooSet_list_ord :
1284             public cc::cuckoo::make_traits <
1285                 cc::cuckoo::probeset_type< cc::cuckoo::list >
1286                 , co::compare< compare >
1287                 , co::hash< std::tuple< hash, hash2 > >
1288             > ::type
1289         {};
1290         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord>> CuckooStripedSet_list_ord;
1291         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord>> CuckooRefinableSet_list_ord;
1292
1293         struct traits_CuckooSet_list_ord_stat : public traits_CuckooSet_list_ord
1294         {
1295             typedef cc::cuckoo::stat stat;
1296         };
1297         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_stat>> CuckooStripedSet_list_ord_stat;
1298         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_stat>> CuckooRefinableSet_list_ord_stat;
1299
1300         struct traits_CuckooSet_list_ord_storehash : public traits_CuckooSet_list_ord
1301         {
1302             static CDS_CONSTEXPR const bool store_hash = true;
1303         };
1304         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_storehash>> CuckooStripedSet_list_ord_storehash;
1305         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_storehash>> CuckooRefinableSet_list_ord_storehash;
1306
1307
1308         struct traits_CuckooSet_vector_unord :
1309             public cc::cuckoo::make_traits <
1310                 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1311                 , co::equal_to< equal_to >
1312                 , co::hash< std::tuple< hash, hash2 > >
1313             > ::type
1314         {};
1315         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord>> CuckooStripedSet_vector_unord;
1316         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord>> CuckooRefinableSet_vector_unord;
1317
1318         struct traits_CuckooSet_vector_unord_stat : public traits_CuckooSet_vector_unord
1319         {
1320             typedef cc::cuckoo::stat stat;
1321         };
1322         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_stat>> CuckooStripedSet_vector_unord_stat;
1323         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_stat>> CuckooRefinableSet_vector_unord_stat;
1324
1325         struct traits_CuckooSet_vector_unord_storehash : public traits_CuckooSet_vector_unord
1326         {
1327             static CDS_CONSTEXPR const bool store_hash = true;
1328         };
1329         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_storehash>> CuckooStripedSet_vector_unord_storehash;
1330         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_storehash>> CuckooRefinableSet_vector_unord_storehash;
1331
1332         struct traits_CuckooSet_vector_ord :
1333             public cc::cuckoo::make_traits <
1334                 cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
1335                 , co::compare< compare >
1336                 , co::hash< std::tuple< hash, hash2 > >
1337             > ::type
1338         {};
1339         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord>> CuckooStripedSet_vector_ord;
1340         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord>> CuckooRefinableSet_vector_ord;
1341
1342         struct traits_CuckooSet_vector_ord_stat : public traits_CuckooSet_vector_ord
1343         {
1344             typedef cc::cuckoo::stat stat;
1345         };
1346         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_stat>> CuckooStripedSet_vector_ord_stat;
1347         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_stat>> CuckooRefinableSet_vector_ord_stat;
1348
1349         struct traits_CuckooSet_vector_ord_storehash : public traits_CuckooSet_vector_ord
1350         {
1351             static CDS_CONSTEXPR const bool store_hash = true;
1352         };
1353         typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_storehash>> CuckooStripedSet_vector_ord_storehash;
1354         typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_storehash>> CuckooRefinableSet_vector_ord_storehash;
1355
1356
1357         // ***************************************************************************
1358         // SkipListSet
1359
1360         class traits_SkipListSet_less_pascal: public cc::skip_list::make_traits <
1361                 co::less< less >
1362                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1363                 ,co::item_counter< cds::atomicity::item_counter >
1364             >::type
1365         {};
1366         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal > SkipListSet_hp_less_pascal;
1367         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal > SkipListSet_dhp_less_pascal;
1368         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpi_less_pascal;
1369         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpb_less_pascal;
1370         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpt_less_pascal;
1371 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1372         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_shb_less_pascal;
1373         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_sht_less_pascal;
1374 #endif
1375
1376         class traits_SkipListSet_less_pascal_seqcst: public cc::skip_list::make_traits <
1377                 co::less< less >
1378                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1379                 ,co::memory_model< co::v::sequential_consistent >
1380                 ,co::item_counter< cds::atomicity::item_counter >
1381             >::type
1382         {};
1383         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
1384         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_dhp_less_pascal_seqcst;
1385         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
1386         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
1387         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
1388 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1389         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
1390         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
1391 #endif
1392
1393         class traits_SkipListSet_less_pascal_stat: public cc::skip_list::make_traits <
1394                 co::less< less >
1395                 ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1396                 ,co::stat< cc::skip_list::stat<> >
1397                 ,co::item_counter< cds::atomicity::item_counter >
1398             >::type
1399         {};
1400         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
1401         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_dhp_less_pascal_stat;
1402         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
1403         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
1404         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
1405 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1406         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
1407         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
1408 #endif
1409
1410         class traits_SkipListSet_cmp_pascal: public cc::skip_list::make_traits <
1411             co::compare< compare >
1412             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1413             ,co::item_counter< cds::atomicity::item_counter >
1414         >::type
1415         {};
1416         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_hp_cmp_pascal;
1417         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_dhp_cmp_pascal;
1418         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
1419         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
1420         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
1421 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1422         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
1423         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
1424 #endif
1425
1426         class traits_SkipListSet_cmp_pascal_stat: public cc::skip_list::make_traits <
1427             co::compare< compare >
1428             ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
1429             ,co::stat< cc::skip_list::stat<> >
1430             ,co::item_counter< cds::atomicity::item_counter >
1431         >::type
1432         {};
1433         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
1434         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_dhp_cmp_pascal_stat;
1435         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
1436         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
1437         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
1438 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1439         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
1440         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
1441 #endif
1442
1443         class traits_SkipListSet_less_xorshift: public cc::skip_list::make_traits <
1444             co::less< less >
1445             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1446             ,co::item_counter< cds::atomicity::item_counter >
1447         >::type
1448         {};
1449         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_hp_less_xorshift;
1450         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_dhp_less_xorshift;
1451         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
1452         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
1453         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
1454 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1455         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
1456         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
1457 #endif
1458
1459         class traits_SkipListSet_less_xorshift_stat: public cc::skip_list::make_traits <
1460             co::less< less >
1461             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1462             ,co::stat< cc::skip_list::stat<> >
1463             ,co::item_counter< cds::atomicity::item_counter >
1464         >::type
1465         {};
1466         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
1467         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_dhp_less_xorshift_stat;
1468         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
1469         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
1470         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
1471 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1472         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
1473         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
1474 #endif
1475
1476         class traits_SkipListSet_cmp_xorshift: public cc::skip_list::make_traits <
1477             co::compare< compare >
1478             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1479             ,co::item_counter< cds::atomicity::item_counter >
1480         >::type
1481         {};
1482         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
1483         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_dhp_cmp_xorshift;
1484         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
1485         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
1486         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
1487 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1488         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
1489         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
1490 #endif
1491
1492         class traits_SkipListSet_cmp_xorshift_stat: public cc::skip_list::make_traits <
1493             co::compare< compare >
1494             ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
1495             ,co::stat< cc::skip_list::stat<> >
1496             ,co::item_counter< cds::atomicity::item_counter >
1497         >::type
1498         {};
1499         typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
1500         typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_dhp_cmp_xorshift_stat;
1501         typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
1502         typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
1503         typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
1504 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1505         typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
1506         typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
1507 #endif
1508
1509
1510         // ***************************************************************************
1511         // EllenBinTreeSet
1512         struct ellen_bintree_props {
1513             struct key_extractor {
1514                 void operator()( key_type& dest, key_val const& src ) const
1515                 {
1516                     dest = src.key;
1517                 }
1518             };
1519
1520             struct less {
1521                 bool operator()( key_val const& v1, key_val const& v2 ) const
1522                 {
1523                     return key_less()( v1.key, v2.key );
1524                 }
1525                 bool operator()( key_type const& k, key_val const& v ) const
1526                 {
1527                     return key_less()( k, v.key );
1528                 }
1529                 bool operator()( key_val const& v, key_type const& k ) const
1530                 {
1531                     return key_less()( v.key, k );
1532                 }
1533                 bool operator()( key_type const& k1, key_type const& k2 ) const
1534                 {
1535                     return key_less()( k1, k2 );
1536                 }
1537             };
1538
1539             struct hp_gc {
1540                 typedef cc::ellen_bintree::node<cds::gc::HP, key_val>               leaf_node;
1541                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1542                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1543             };
1544
1545             struct dhp_gc {
1546                 typedef cc::ellen_bintree::node<cds::gc::DHP, key_val>              leaf_node;
1547                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1548                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1549             };
1550
1551             struct gpi {
1552                 typedef cc::ellen_bintree::node<rcu_gpi, key_val>                   leaf_node;
1553                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1554                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1555             };
1556             struct gpb {
1557                 typedef cc::ellen_bintree::node<rcu_gpb, key_val>                   leaf_node;
1558                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1559                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1560             };
1561             struct gpt {
1562                 typedef cc::ellen_bintree::node<rcu_gpt, key_val>                   leaf_node;
1563                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1564                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1565             };
1566 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1567             struct shb {
1568                 typedef cc::ellen_bintree::node<rcu_shb, key_val>                   leaf_node;
1569                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1570                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1571             };
1572             struct sht {
1573                 typedef cc::ellen_bintree::node<rcu_sht, key_val>                   leaf_node;
1574                 typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
1575                 typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
1576             };
1577 #endif
1578         };
1579
1580         struct traits_EllenBinTreeSet: public cc::ellen_bintree::make_set_traits<
1581             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
1582             ,co::less< typename ellen_bintree_props::less >
1583             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1584         >::type
1585         {};
1586
1587         struct traits_EllenBinTreeSet_hp : public traits_EllenBinTreeSet
1588         {
1589             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1590         };
1591         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
1592
1593         struct traits_EllenBinTreeSet_dhp : public traits_EllenBinTreeSet
1594         {
1595             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1596         };
1597         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_dhp > EllenBinTreeSet_dhp;
1598
1599         struct traits_EllenBinTreeSet_gpi : public traits_EllenBinTreeSet
1600         {
1601             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1602         };
1603         typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_gpi > EllenBinTreeSet_rcu_gpi;
1604
1605         struct traits_EllenBinTreeSet_gpb : public traits_EllenBinTreeSet
1606         {
1607             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1608         };
1609         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_gpb > EllenBinTreeSet_rcu_gpb;
1610
1611         struct traits_EllenBinTreeSet_gpt : public traits_EllenBinTreeSet
1612         {
1613             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1614         };
1615         typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_gpt > EllenBinTreeSet_rcu_gpt;
1616
1617 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1618         struct traits_EllenBinTreeSet_shb : public traits_EllenBinTreeSet
1619         {
1620             typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1621         };
1622         typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_shb > EllenBinTreeSet_rcu_shb;
1623
1624         struct traits_EllenBinTreeSet_sht : public traits_EllenBinTreeSet
1625         {
1626             typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1627         };
1628         typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_sht > EllenBinTreeSet_rcu_sht;
1629 #endif
1630
1631         //
1632         struct traits_EllenBinTreeSet_yield : public traits_EllenBinTreeSet
1633         {
1634             typedef cds::backoff::yield back_off;
1635         };
1636
1637         struct traits_EllenBinTreeSet_yield_hp : public traits_EllenBinTreeSet_yield
1638         {
1639             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1640         };
1641         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_yield_hp > EllenBinTreeSet_yield_hp;
1642
1643         struct traits_EllenBinTreeSet_yield_dhp : public traits_EllenBinTreeSet_yield
1644         {
1645             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1646         };
1647         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_yield_dhp > EllenBinTreeSet_yield_dhp;
1648
1649
1650         struct traits_EllenBinTreeSet_yield_gpb : public traits_EllenBinTreeSet_yield
1651         {
1652             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1653         };
1654         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_yield_gpb > EllenBinTreeSet_yield_rcu_gpb;
1655
1656
1657         struct traits_EllenBinTreeSet_stat: public cc::ellen_bintree::make_set_traits<
1658             cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
1659             ,co::less< typename ellen_bintree_props::less >
1660             ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
1661             ,co::stat< cc::ellen_bintree::stat<> >
1662         >::type
1663         {};
1664
1665         struct traits_EllenBinTreeSet_stat_hp : public traits_EllenBinTreeSet_stat
1666         {
1667             typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1668         };
1669         typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_stat_hp > EllenBinTreeSet_hp_stat;
1670
1671         struct traits_EllenBinTreeSet_stat_dhp : public traits_EllenBinTreeSet_stat
1672         {
1673             typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1674         };
1675         typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_stat_dhp > EllenBinTreeSet_dhp_stat;
1676
1677         struct traits_EllenBinTreeSet_stat_gpi : public traits_EllenBinTreeSet_stat
1678         {
1679             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1680         };
1681         typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_stat_gpi > EllenBinTreeSet_rcu_gpi_stat;
1682
1683         struct traits_EllenBinTreeSet_stat_gpb : public traits_EllenBinTreeSet_stat
1684         {
1685             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1686         };
1687         typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_stat_gpb > EllenBinTreeSet_rcu_gpb_stat;
1688
1689         struct traits_EllenBinTreeSet_stat_gpt : public traits_EllenBinTreeSet_stat
1690         {
1691             typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1692         };
1693         typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_stat_gpt > EllenBinTreeSet_rcu_gpt_stat;
1694
1695 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
1696         struct traits_EllenBinTreeSet_stat_shb : public traits_EllenBinTreeSet_stat
1697         {
1698             typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1699         };
1700         typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_stat_shb > EllenBinTreeSet_rcu_shb_stat;
1701
1702         struct traits_EllenBinTreeSet_stat_sht : public traits_EllenBinTreeSet_stat
1703         {
1704             typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
1705         };
1706         typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_stat_sht > EllenBinTreeSet_rcu_sht_stat;
1707 #endif
1708
1709         // ***************************************************************************
1710         // Standard implementations
1711
1712         typedef StdSet< key_val, less, cds::SpinLock >                  StdSet_Spin;
1713         typedef StdSet< key_val, less, lock::NoLock>                    StdSet_NoLock;
1714
1715         typedef StdHashSet< key_val, hash, less, equal_to, cds::SpinLock >    StdHashSet_Spin;
1716         typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock >     StdHashSet_NoLock;
1717
1718     };
1719
1720
1721     // *************************************************
1722     // print_stat
1723     // *************************************************
1724
1725     template <typename Set>
1726     static inline void print_stat( Set const& s )
1727     {}
1728
1729     template <typename GC, typename T, typename Traits>
1730     static inline void print_stat( cc::SplitListSet<GC, T, Traits> const& s )
1731     {
1732         CPPUNIT_MSG( s.statistics() );
1733     }
1734
1735     template <typename GC, typename T, typename Traits>
1736     static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
1737     {
1738         CPPUNIT_MSG( s.statistics() );
1739     }
1740
1741     template <typename GC, typename Key, typename T, typename Traits>
1742     static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
1743     {
1744         CPPUNIT_MSG( s.statistics() );
1745     }
1746
1747     template <typename T, typename Traits >
1748     static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
1749     {
1750         CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
1751     }
1752
1753     template <typename V, typename Traits>
1754     static inline void print_stat( CuckooSet< V, Traits > const& s )
1755     {
1756         typedef CuckooSet< V, Traits > set_type;
1757         print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
1758     }
1759
1760
1761     //*******************************************************
1762     // additional_check
1763     //*******************************************************
1764
1765     template <typename Set>
1766     static inline void additional_check( Set& set )
1767     {}
1768
1769     template <typename Set>
1770     static inline void additional_cleanup( Set& set )
1771     {}
1772
1773     namespace ellen_bintree_check {
1774         static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& s )
1775         {
1776             // Not true for threaded RCU
1777             /*
1778             CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
1779                 "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
1780                 << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
1781                 );
1782             */
1783         }
1784
1785         static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
1786         {
1787             CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
1788             CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
1789             //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
1790             CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
1791             // true if RCU is not threaded
1792             //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
1793         }
1794     }   // namespace ellen_bintree_check
1795
1796     template <typename GC, typename Key, typename T, typename Traits>
1797     static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
1798     {
1799         GC::force_dispose();
1800         ellen_bintree_check::check_stat( s.statistics() );
1801     }
1802
1803     template <typename GC, typename Key, typename T, typename Traits>
1804     static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
1805     {
1806         ellen_bintree_pool::internal_node_counter::reset();
1807     }
1808
1809 }   // namespace set2
1810
1811 #endif // ifndef _CDSUNIT_SET2_SET_TYPES_H