6d4134c9f31a5a95b24ee0ad028270682514367c
[libcds.git] / tests / unit / set2 / set_type_split_list.h
1 //$$CDS-header$$
2
3 #ifndef CDSUNIT_SET_TYPE_SPLIT_LIST_H
4 #define CDSUNIT_SET_TYPE_SPLIT_LIST_H
5
6 #include "set2/set_type.h"
7
8 #include <cds/container/michael_list_hp.h>
9 #include <cds/container/michael_list_dhp.h>
10 #include <cds/container/michael_list_rcu.h>
11 #include <cds/container/lazy_list_hp.h>
12 #include <cds/container/lazy_list_dhp.h>
13 #include <cds/container/lazy_list_rcu.h>
14
15 #include <cds/container/split_list_set.h>
16 #include <cds/container/split_list_set_rcu.h>
17
18 #include "print_split_list_stat.h"
19
20 namespace set2 {
21
22     template <typename GC, typename T, typename Traits = cc::split_list::traits>
23     class SplitListSet : public cc::SplitListSet< GC, T, Traits >
24     {
25         typedef cc::SplitListSet< GC, T, Traits > base_class;
26     public:
27         template <typename Config>
28         SplitListSet( Config const& cfg )
29             : base_class( cfg.c_nSetSize, cfg.c_nLoadFactor )
30         {}
31
32         // for testing
33         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
34         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
35     };
36
37     struct tag_SplitListSet;
38
39     template <typename Key, typename Val>
40     struct set_type< tag_SplitListSet, Key, Val >: public set_type_base< Key, Val >
41     {
42         typedef set_type_base< Key, Val > base_class;
43         typedef typename base_class::key_val key_val;
44         typedef typename base_class::compare compare;
45         typedef typename base_class::less less;
46         typedef typename base_class::hash hash;
47
48         // ***************************************************************************
49         // SplitListSet based on MichaelList
50
51         struct traits_SplitList_Michael_dyn_cmp :
52             public cc::split_list::make_traits<
53                 cc::split_list::ordered_list<cc::michael_list_tag>
54                 ,co::hash< hash >
55                 ,cc::split_list::ordered_list_traits<
56                     typename cc::michael_list::make_traits<
57                         co::compare< compare >
58                     >::type
59                 >
60             >::type
61         {};
62         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
63         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
64         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
65         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
66         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
67 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
68         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
69         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
70 #endif
71
72         struct traits_SplitList_Michael_dyn_cmp_stat :
73             public cc::split_list::make_traits<
74                 cc::split_list::ordered_list<cc::michael_list_tag>
75                 ,co::hash< hash >
76                 ,co::stat< cc::split_list::stat<> >
77                 ,cc::split_list::ordered_list_traits<
78                     typename cc::michael_list::make_traits<
79                         co::compare< compare >
80                     >::type
81                 >
82             >::type
83         {};
84         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
85         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
86         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
87         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
88         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
89 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
90         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
91         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
92 #endif
93
94         struct traits_SplitList_Michael_dyn_cmp_seqcst :
95             public cc::split_list::make_traits<
96                 cc::split_list::ordered_list<cc::michael_list_tag>
97                 ,co::hash< hash >
98                 ,co::memory_model< co::v::sequential_consistent >
99                 ,cc::split_list::ordered_list_traits<
100                     typename cc::michael_list::make_traits<
101                         co::compare< compare >
102                         ,co::memory_model< co::v::sequential_consistent >
103                     >::type
104                 >
105             >::type
106         {};
107         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
108         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
109         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
110         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
111         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
112 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
113         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
114         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
115 #endif
116
117         struct traits_SplitList_Michael_st_cmp :
118             public cc::split_list::make_traits<
119                 cc::split_list::ordered_list<cc::michael_list_tag>
120                 ,cc::split_list::dynamic_bucket_table< false >
121                 ,co::hash< hash >
122                 ,cc::split_list::ordered_list_traits<
123                     typename cc::michael_list::make_traits<
124                         co::compare< compare >
125                     >::type
126                 >
127             >::type
128         {};
129         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
130         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
131         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
132         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
133         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
134 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
135         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
136         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
137 #endif
138
139         struct traits_SplitList_Michael_st_cmp_seqcst :
140             public cc::split_list::make_traits<
141                 cc::split_list::ordered_list<cc::michael_list_tag>
142                 ,co::hash< hash >
143                 ,cc::split_list::dynamic_bucket_table< false >
144                 ,co::memory_model< co::v::sequential_consistent >
145                 ,cc::split_list::ordered_list_traits<
146                     typename cc::michael_list::make_traits<
147                         co::compare< compare >
148                         ,co::memory_model< co::v::sequential_consistent >
149                     >::type
150                 >
151             >::type
152         {};
153         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_HP_st_cmp_seqcst;
154         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_DHP_st_cmp_seqcst;
155         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPI_st_cmp_seqcst;
156         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPB_st_cmp_seqcst;
157         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPT_st_cmp_seqcst;
158 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
159         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHB_st_cmp_seqcst;
160         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHT_st_cmp_seqcst;
161 #endif
162
163         //HP + less
164         struct traits_SplitList_Michael_dyn_less :
165             public cc::split_list::make_traits<
166                 cc::split_list::ordered_list<cc::michael_list_tag>
167                 ,co::hash< hash >
168                 ,cc::split_list::ordered_list_traits<
169                     typename cc::michael_list::make_traits<
170                         co::less< less >
171                     >::type
172                 >
173             >::type
174         {};
175         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
176         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
177         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
178         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
179         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
180 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
181         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
182         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
183 #endif
184
185         struct traits_SplitList_Michael_dyn_less_seqcst :
186             public cc::split_list::make_traits<
187                 cc::split_list::ordered_list<cc::michael_list_tag>
188                 ,co::hash< hash >
189                 ,co::memory_model< co::v::sequential_consistent >
190                 ,cc::split_list::ordered_list_traits<
191                     typename cc::michael_list::make_traits<
192                         co::less< less >
193                         ,co::memory_model< co::v::sequential_consistent >
194                     >::type
195                 >
196             >::type
197         {};
198         typedef SplitListSet< cds::gc::HP, key_val,  traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
199         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
200         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
201         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
202         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
203 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
204         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
205         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
206 #endif
207
208         struct traits_SplitList_Michael_st_less :
209             public cc::split_list::make_traits<
210                 cc::split_list::ordered_list<cc::michael_list_tag>
211                 ,cc::split_list::dynamic_bucket_table< false >
212                 ,co::hash< hash >
213                 ,cc::split_list::ordered_list_traits<
214                     typename cc::michael_list::make_traits<
215                         co::less< less >
216                     >::type
217                 >
218             >::type
219         {};
220         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
221         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
222         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
223         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
224         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
225 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
226         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
227         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
228 #endif
229
230         struct traits_SplitList_Michael_st_less_stat :
231             public cc::split_list::make_traits<
232                 cc::split_list::ordered_list<cc::michael_list_tag>
233                 ,cc::split_list::dynamic_bucket_table< false >
234                 ,co::hash< hash >
235                 ,co::stat< cc::split_list::stat<>>
236                 ,cc::split_list::ordered_list_traits<
237                     typename cc::michael_list::make_traits<
238                         co::less< less >
239                     >::type
240                 >
241             >::type
242         {};
243         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
244         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
245         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
246         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
247         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
248 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
249         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
250         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
251 #endif
252
253         struct traits_SplitList_Michael_st_less_seqcst :
254             public cc::split_list::make_traits<
255                 cc::split_list::ordered_list<cc::michael_list_tag>
256                 ,co::hash< hash >
257                 ,cc::split_list::dynamic_bucket_table< false >
258                 ,co::memory_model< co::v::sequential_consistent >
259                 ,cc::split_list::ordered_list_traits<
260                     typename cc::michael_list::make_traits<
261                         co::less< less >
262                         ,co::memory_model< co::v::sequential_consistent >
263                     >::type
264                 >
265             >::type
266         {};
267         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
268         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
269         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
270         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
271         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
272 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
273         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
274         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
275 #endif
276
277         // ***************************************************************************
278         // SplitListSet based on LazyList
279
280         struct traits_SplitList_Lazy_dyn_cmp :
281             public cc::split_list::make_traits<
282                 cc::split_list::ordered_list<cc::lazy_list_tag>
283                 ,co::hash< hash >
284                 ,cc::split_list::ordered_list_traits<
285                     typename cc::lazy_list::make_traits<
286                         co::compare< compare >
287                     >::type
288                 >
289             >::type
290         {};
291         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
292         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
293         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
294         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
295         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
296 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
297         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
298         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
299 #endif
300
301         struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
302         {
303             typedef cc::split_list::stat<> stat;
304         };
305         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
306         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
307         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
308         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
309         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
310 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
311         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
312         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
313 #endif
314
315         struct traits_SplitList_Lazy_dyn_cmp_seqcst :
316             public cc::split_list::make_traits<
317                 cc::split_list::ordered_list<cc::lazy_list_tag>
318                 ,co::hash< hash >
319                 ,co::memory_model< co::v::sequential_consistent >
320                 ,cc::split_list::ordered_list_traits<
321                     typename cc::lazy_list::make_traits<
322                         co::compare< compare >
323                         ,co::memory_model< co::v::sequential_consistent >
324                     >::type
325                 >
326             >::type
327         {};
328         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
329         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
330         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
331         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
332         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
333 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
334         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
335         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
336 #endif
337
338         struct traits_SplitList_Lazy_st_cmp :
339             public cc::split_list::make_traits<
340                 cc::split_list::ordered_list<cc::lazy_list_tag>
341                 ,cc::split_list::dynamic_bucket_table< false >
342                 ,co::hash< hash >
343                 ,cc::split_list::ordered_list_traits<
344                     typename cc::lazy_list::make_traits<
345                         co::compare< compare >
346                     >::type
347                 >
348             >::type
349         {};
350         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
351         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
352         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
353         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
354         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
355 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
356         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
357         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
358 #endif
359
360         struct traits_SplitList_Lazy_st_cmp_seqcst :
361             public cc::split_list::make_traits<
362                 cc::split_list::ordered_list<cc::lazy_list_tag>
363                 ,co::hash< hash >
364                 ,cc::split_list::dynamic_bucket_table< false >
365                 ,co::memory_model< co::v::sequential_consistent >
366                 ,cc::split_list::ordered_list_traits<
367                     typename cc::lazy_list::make_traits<
368                         co::compare< compare >
369                         ,co::memory_model< co::v::sequential_consistent >
370                     >::type
371                 >
372             >::type
373         {};
374         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_HP_st_cmp_seqcst;
375         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_DHP_st_cmp_seqcst;
376         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
377         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
378         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
379 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
380         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
381         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
382 #endif
383
384         struct traits_SplitList_Lazy_dyn_less :
385             public cc::split_list::make_traits<
386                 cc::split_list::ordered_list<cc::lazy_list_tag>
387                 ,co::hash< hash >
388                 ,cc::split_list::ordered_list_traits<
389                     typename cc::lazy_list::make_traits<
390                         co::less< less >
391                     >::type
392                 >
393             >::type
394         {};
395         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
396         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
397         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
398         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
399         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
400 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
401         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
402         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
403 #endif
404
405         struct traits_SplitList_Lazy_dyn_less_seqcst :
406             public cc::split_list::make_traits<
407                 cc::split_list::ordered_list<cc::lazy_list_tag>
408                 ,co::hash< hash >
409                 ,co::memory_model< co::v::sequential_consistent >
410                 ,cc::split_list::ordered_list_traits<
411                     typename cc::lazy_list::make_traits<
412                         co::less< less >
413                         ,co::memory_model< co::v::sequential_consistent >
414                     >::type
415                 >
416             >::type
417         {};
418         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
419         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
420         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
421         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
422         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
423 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
424         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
425         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
426 #endif
427
428         struct traits_SplitList_Lazy_st_less :
429             public cc::split_list::make_traits<
430                 cc::split_list::ordered_list<cc::lazy_list_tag>
431                 ,cc::split_list::dynamic_bucket_table< false >
432                 ,co::hash< hash >
433                 ,cc::split_list::ordered_list_traits<
434                     typename cc::lazy_list::make_traits<
435                         co::less< less >
436                     >::type
437                 >
438             >::type
439         {};
440         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
441         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
442         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
443         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
444         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
445 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
446         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
447         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
448 #endif
449
450         struct traits_SplitList_Lazy_st_less_seqcst :
451             public cc::split_list::make_traits<
452                 cc::split_list::ordered_list<cc::lazy_list_tag>
453                 ,co::hash< hash >
454                 ,cc::split_list::dynamic_bucket_table< false >
455                 ,co::memory_model< co::v::sequential_consistent >
456                 ,cc::split_list::ordered_list_traits<
457                     typename cc::lazy_list::make_traits<
458                         co::less< less >
459                         ,co::memory_model< co::v::sequential_consistent >
460                     >::type
461                 >
462             >::type
463         {};
464         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
465         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
466         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
467         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
468         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
469 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
470         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
471         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
472 #endif
473
474         struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
475         {
476             typedef cc::split_list::stat<> stat;
477         };
478         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
479         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
480         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
481         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
482         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
483 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
484         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
485         typedef SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
486 #endif
487     };
488
489     template <typename GC, typename T, typename Traits>
490     static inline void print_stat( SplitListSet<GC, T, Traits> const& s )
491     {
492         CPPUNIT_MSG( s.statistics() );
493     }
494
495 } // namespace set2
496
497 #endif // #ifndef CDSUNIT_SET_TYPE_SPLIT_LIST_H