Removed signal_threaded uRCU
[libcds.git] / test / stress / set / set_type_split_list.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef CDSUNIT_SET_TYPE_SPLIT_LIST_H
32 #define CDSUNIT_SET_TYPE_SPLIT_LIST_H
33
34 #include "set_type.h"
35
36 #include <cds/container/michael_list_hp.h>
37 #include <cds/container/michael_list_dhp.h>
38 #include <cds/container/michael_list_rcu.h>
39 #include <cds/container/lazy_list_hp.h>
40 #include <cds/container/lazy_list_dhp.h>
41 #include <cds/container/lazy_list_rcu.h>
42 #include <cds/container/iterable_list_hp.h>
43 #include <cds/container/iterable_list_dhp.h>
44
45 #include <cds/container/split_list_set.h>
46 #include <cds/container/split_list_set_rcu.h>
47
48 #include <cds_test/stat_splitlist_out.h>
49 #include <cds_test/stat_michael_list_out.h>
50 #include <cds_test/stat_lazy_list_out.h>
51 #include <cds_test/stat_iterable_list_out.h>
52
53 namespace set {
54
55     template <typename GC, typename T, typename Traits = cc::split_list::traits>
56     class SplitListSet : public cc::SplitListSet< GC, T, Traits >
57     {
58         typedef cc::SplitListSet< GC, T, Traits > base_class;
59     public:
60         template <typename Config>
61         SplitListSet( Config const& cfg )
62             : base_class( cfg.s_nSetSize, cfg.s_nLoadFactor )
63         {}
64
65         template <typename Iterator>
66         typename std::enable_if< std::is_same< Iterator, typename base_class::iterator>::value, Iterator>::type
67         get_begin()
68         {
69             return base_class::begin();
70         }
71
72         template <typename Iterator>
73         typename std::enable_if< std::is_same< Iterator, typename base_class::iterator>::value, Iterator>::type
74         get_end()
75         {
76             return base_class::end();
77         }
78
79         // for testing
80         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
81         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
82         static CDS_CONSTEXPR bool const c_bEraseExactKey = false;
83     };
84
85     struct tag_SplitListSet;
86
87     template <typename Key, typename Val>
88     struct set_type< tag_SplitListSet, Key, Val >: public set_type_base< Key, Val >
89     {
90         typedef set_type_base< Key, Val > base_class;
91         typedef typename base_class::key_val key_val;
92         typedef typename base_class::compare compare;
93         typedef typename base_class::less less;
94         typedef typename base_class::hash hash;
95
96         // ***************************************************************************
97         // SplitListSet based on MichaelList
98
99         struct traits_SplitList_Michael_dyn_cmp :
100             public cc::split_list::make_traits<
101                 cc::split_list::ordered_list<cc::michael_list_tag>
102                 ,co::hash< hash >
103                 ,cc::split_list::ordered_list_traits<
104                     typename cc::michael_list::make_traits<
105                         co::compare< compare >
106                     >::type
107                 >
108             >::type
109         {};
110         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
111         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
112         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
113         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
114         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
115 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
116         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
117 #endif
118
119         struct traits_SplitList_Michael_dyn_cmp_swar: public traits_SplitList_Michael_dyn_cmp
120         {
121             typedef cds::algo::bit_reversal::swar bit_reversal;
122         };
123         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_HP_dyn_cmp_swar;
124         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_DHP_dyn_cmp_swar;
125         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_GPI_dyn_cmp_swar;
126         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_GPB_dyn_cmp_swar;
127         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_GPT_dyn_cmp_swar;
128 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
129         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_SHB_dyn_cmp_swar;
130 #endif
131
132         struct traits_SplitList_Michael_dyn_cmp_stat :
133             public cc::split_list::make_traits<
134                 cc::split_list::ordered_list<cc::michael_list_tag>
135                 ,co::hash< hash >
136                 ,co::stat< cc::split_list::stat<> >
137                 ,cc::split_list::ordered_list_traits<
138                     typename cc::michael_list::make_traits<
139                         co::compare< compare >
140                         ,co::stat< cc::michael_list::stat<>>
141                     >::type
142                 >
143             >::type
144         {};
145         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
146         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
147         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
148         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
149         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
150 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
151         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
152 #endif
153
154         struct traits_SplitList_Michael_dyn_cmp_seqcst :
155             public cc::split_list::make_traits<
156                 cc::split_list::ordered_list<cc::michael_list_tag>
157                 ,co::hash< hash >
158                 ,co::memory_model< co::v::sequential_consistent >
159                 ,cc::split_list::ordered_list_traits<
160                     typename cc::michael_list::make_traits<
161                         co::compare< compare >
162                         ,co::memory_model< co::v::sequential_consistent >
163                     >::type
164                 >
165             >::type
166         {};
167         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
168         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
169         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
170         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
171         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
172 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
173         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
174 #endif
175
176         struct traits_SplitList_Michael_st_cmp :
177             public cc::split_list::make_traits<
178                 cc::split_list::ordered_list<cc::michael_list_tag>
179                 ,cc::split_list::dynamic_bucket_table< false >
180                 ,co::hash< hash >
181                 ,cc::split_list::ordered_list_traits<
182                     typename cc::michael_list::make_traits<
183                         co::compare< compare >
184                     >::type
185                 >
186             >::type
187         {};
188         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
189         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
190         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
191         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
192         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
193 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
194         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
195 #endif
196
197         //HP + less
198         struct traits_SplitList_Michael_dyn_less :
199             public cc::split_list::make_traits<
200                 cc::split_list::ordered_list<cc::michael_list_tag>
201                 ,co::hash< hash >
202                 ,cc::split_list::ordered_list_traits<
203                     typename cc::michael_list::make_traits<
204                         co::less< less >
205                     >::type
206                 >
207             >::type
208         {};
209         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
210         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
211         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
212         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
213         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
214 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
215         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
216 #endif
217
218         struct traits_SplitList_Michael_st_less :
219             public cc::split_list::make_traits<
220                 cc::split_list::ordered_list<cc::michael_list_tag>
221                 ,cc::split_list::dynamic_bucket_table< false >
222                 ,co::hash< hash >
223                 ,cc::split_list::ordered_list_traits<
224                     typename cc::michael_list::make_traits<
225                         co::less< less >
226                     >::type
227                 >
228             >::type
229         {};
230         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
231         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
232         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
233         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
234         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
235 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
236         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
237 #endif
238
239         struct traits_SplitList_Michael_st_less_stat :
240             public cc::split_list::make_traits<
241                 cc::split_list::ordered_list<cc::michael_list_tag>
242                 ,cc::split_list::dynamic_bucket_table< false >
243                 ,co::hash< hash >
244                 ,co::stat< cc::split_list::stat<>>
245                 ,cc::split_list::ordered_list_traits<
246                     typename cc::michael_list::make_traits<
247                         co::less< less >
248                         ,co::stat< cc::michael_list::stat<>>
249                     >::type
250                 >
251             >::type
252         {};
253         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
254         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
255         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
256         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
257         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
258 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
259         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
260 #endif
261
262         // ***************************************************************************
263         // SplitListSet based on LazyList
264
265         struct traits_SplitList_Lazy_dyn_cmp :
266             public cc::split_list::make_traits<
267                 cc::split_list::ordered_list<cc::lazy_list_tag>
268                 ,co::hash< hash >
269                 ,cc::split_list::ordered_list_traits<
270                     typename cc::lazy_list::make_traits<
271                         co::compare< compare >
272                     >::type
273                 >
274             >::type
275         {};
276         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
277         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
278         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
279         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
280         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
281 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
282         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
283 #endif
284
285         struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
286         {
287             typedef cc::split_list::stat<> stat;
288             typedef typename cc::lazy_list::make_traits<
289                 co::compare< compare >
290                 , co::stat< cc::lazy_list::stat<>>
291             >::type ordered_list_traits;
292         };
293         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
294         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
295         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
296         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
297         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
298 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
299         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
300 #endif
301
302         struct traits_SplitList_Lazy_dyn_cmp_seqcst :
303             public cc::split_list::make_traits<
304                 cc::split_list::ordered_list<cc::lazy_list_tag>
305                 ,co::hash< hash >
306                 ,co::memory_model< co::v::sequential_consistent >
307                 ,cc::split_list::ordered_list_traits<
308                     typename cc::lazy_list::make_traits<
309                         co::compare< compare >
310                         ,co::memory_model< co::v::sequential_consistent >
311                     >::type
312                 >
313             >::type
314         {};
315         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
316         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
317         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
318         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
319         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
320 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
321         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
322 #endif
323
324         struct traits_SplitList_Lazy_st_cmp :
325             public cc::split_list::make_traits<
326                 cc::split_list::ordered_list<cc::lazy_list_tag>
327                 ,cc::split_list::dynamic_bucket_table< false >
328                 ,co::hash< hash >
329                 ,cc::split_list::ordered_list_traits<
330                     typename cc::lazy_list::make_traits<
331                         co::compare< compare >
332                     >::type
333                 >
334             >::type
335         {};
336         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
337         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
338         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
339         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
340         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
341 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
342         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
343 #endif
344
345         struct traits_SplitList_Lazy_dyn_less :
346             public cc::split_list::make_traits<
347                 cc::split_list::ordered_list<cc::lazy_list_tag>
348                 ,co::hash< hash >
349                 ,cc::split_list::ordered_list_traits<
350                     typename cc::lazy_list::make_traits<
351                         co::less< less >
352                     >::type
353                 >
354             >::type
355         {};
356         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
357         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
358         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
359         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
360         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
361 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
362         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
363 #endif
364
365         struct traits_SplitList_Lazy_st_less :
366             public cc::split_list::make_traits<
367                 cc::split_list::ordered_list<cc::lazy_list_tag>
368                 ,cc::split_list::dynamic_bucket_table< false >
369                 ,co::hash< hash >
370                 ,cc::split_list::ordered_list_traits<
371                     typename cc::lazy_list::make_traits<
372                         co::less< less >
373                     >::type
374                 >
375             >::type
376         {};
377         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
378         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
379         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
380         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
381         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
382 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
383         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
384 #endif
385
386         struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
387         {
388             typedef cc::split_list::stat<> stat;
389             typedef typename cc::lazy_list::make_traits<
390                 co::less< less >
391                 , co::stat< cc::lazy_list::stat<>>
392             >::type ordered_list_traits;
393         };
394         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
395         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
396         typedef SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
397         typedef SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
398         typedef SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
399 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
400         typedef SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
401 #endif
402
403         // ***************************************************************************
404         // SplitListSet based on IterableList
405
406         struct traits_SplitList_Iterable_dyn_cmp :
407             public cc::split_list::make_traits<
408                 cc::split_list::ordered_list<cc::iterable_list_tag>
409                 ,co::hash< hash >
410                 ,cc::split_list::ordered_list_traits<
411                     typename cc::iterable_list::make_traits<
412                         co::compare< compare >
413                     >::type
414                 >
415             >::type
416         {};
417         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_HP_dyn_cmp;
418         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_DHP_dyn_cmp;
419
420         struct traits_SplitList_Iterable_dyn_cmp_stat:
421             public cc::split_list::make_traits<
422                 cc::split_list::ordered_list<cc::iterable_list_tag>
423                 ,co::hash< hash >
424                 ,co::stat< cc::split_list::stat<> >
425                 ,cc::split_list::ordered_list_traits<
426                     typename cc::iterable_list::make_traits<
427                         co::compare< compare >
428                         ,co::stat< cc::iterable_list::stat<>>
429                     >::type
430                 >
431             >::type
432         {};
433         typedef SplitListSet< cds::gc::HP, key_val, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_HP_dyn_cmp_stat;
434         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_DHP_dyn_cmp_stat;
435
436         struct traits_SplitList_Iterable_dyn_cmp_seqcst :
437             public cc::split_list::make_traits<
438                 cc::split_list::ordered_list<cc::iterable_list_tag>
439                 ,co::hash< hash >
440                 ,co::memory_model< co::v::sequential_consistent >
441                 ,cc::split_list::ordered_list_traits<
442                     typename cc::iterable_list::make_traits<
443                         co::compare< compare >
444                         ,co::memory_model< co::v::sequential_consistent >
445                     >::type
446                 >
447             >::type
448         {};
449         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_HP_dyn_cmp_seqcst;
450         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_DHP_dyn_cmp_seqcst;
451
452         struct traits_SplitList_Iterable_st_cmp :
453             public cc::split_list::make_traits<
454                 cc::split_list::ordered_list<cc::iterable_list_tag>
455                 ,cc::split_list::dynamic_bucket_table< false >
456                 ,co::hash< hash >
457                 ,cc::split_list::ordered_list_traits<
458                     typename cc::iterable_list::make_traits<
459                         co::compare< compare >
460                     >::type
461                 >
462             >::type
463         {};
464         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_HP_st_cmp;
465         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_DHP_st_cmp;
466
467         //HP + less
468         struct traits_SplitList_Iterable_dyn_less :
469             public cc::split_list::make_traits<
470                 cc::split_list::ordered_list<cc::iterable_list_tag>
471                 ,co::hash< hash >
472                 ,cc::split_list::ordered_list_traits<
473                     typename cc::iterable_list::make_traits<
474                         co::less< less >
475                     >::type
476                 >
477             >::type
478         {};
479         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_HP_dyn_less;
480         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_DHP_dyn_less;
481
482         struct traits_SplitList_Iterable_st_less :
483             public cc::split_list::make_traits<
484                 cc::split_list::ordered_list<cc::iterable_list_tag>
485                 ,cc::split_list::dynamic_bucket_table< false >
486                 ,co::hash< hash >
487                 ,cc::split_list::ordered_list_traits<
488                     typename cc::iterable_list::make_traits<
489                         co::less< less >
490                     >::type
491                 >
492             >::type
493         {};
494         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Iterable_st_less > SplitList_Iterable_HP_st_less;
495         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_st_less > SplitList_Iterable_DHP_st_less;
496
497         struct traits_SplitList_Iterable_st_less_stat :
498             public cc::split_list::make_traits<
499                 cc::split_list::ordered_list<cc::iterable_list_tag>
500                 ,cc::split_list::dynamic_bucket_table< false >
501                 ,co::hash< hash >
502                 ,co::stat< cc::split_list::stat<>>
503                 ,cc::split_list::ordered_list_traits<
504                     typename cc::iterable_list::make_traits<
505                         co::less< less >
506                         ,co::stat< cc::iterable_list::stat<>>
507                     >::type
508                 >
509             >::type
510         {};
511         typedef SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_HP_st_less_stat;
512         typedef SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_DHP_st_less_stat;
513
514     };
515
516     template <typename GC, typename T, typename Traits>
517     static inline void print_stat( cds_test::property_stream& o, SplitListSet<GC, T, Traits> const& s )
518     {
519         o << s.statistics()
520           << cds_test::stat_prefix( "list_stat" )
521           << s.list_statistics()
522           << cds_test::stat_prefix( "" );
523     }
524
525 } // namespace set
526
527
528 #define CDSSTRESS_SplitListSet_case( fixture, test_case, splitlist_set_type, key_type, value_type ) \
529     TEST_P( fixture, splitlist_set_type ) \
530     { \
531         typedef set::set_type< tag_SplitListSet, key_type, value_type >::splitlist_set_type set_type; \
532         test_case<set_type>(); \
533     }
534
535
536 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
537
538 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 1
539 #   define CDSSTRESS_SplitListSet_SHRCU_2( fixture, test_case, key_type, value_type ) \
540         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_seqcst,  key_type, value_type ) \
541         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_seqcst,  key_type, value_type ) \
542
543 #else
544 #   define CDSSTRESS_SplitListSet_SHRCU_2( fixture, test_case, key_type, value_type )
545 #endif
546
547 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL == 1
548 #   define CDSSTRESS_SplitListSet_SHRCU_1( fixture, test_case, key_type, value_type ) \
549         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp,         key_type, value_type ) \
550         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_stat,    key_type, value_type ) \
551         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_cmp,          key_type, value_type ) \
552         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_less,        key_type, value_type ) \
553         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less,         key_type, value_type ) \
554         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less_stat,    key_type, value_type ) \
555         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp,            key_type, value_type ) \
556         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp_stat,       key_type, value_type ) \
557         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_cmp,             key_type, value_type ) \
558         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_less,           key_type, value_type ) \
559         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less,            key_type, value_type ) \
560         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less_stat,       key_type, value_type ) \
561
562 #else
563 #   define CDSSTRESS_SplitListSet_SHRCU_1( fixture, test_case, key_type, value_type )
564 #endif
565
566
567 #   define CDSSTRESS_SplitListSet_SHRCU( fixture, test_case, key_type, value_type ) \
568         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp,         key_type, value_type ) \
569         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_stat,    key_type, value_type ) \
570         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_cmp,          key_type, value_type ) \
571         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_less,        key_type, value_type ) \
572         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less,         key_type, value_type ) \
573         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less_stat,    key_type, value_type ) \
574         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp,            key_type, value_type ) \
575         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp_stat,       key_type, value_type ) \
576         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_cmp,             key_type, value_type ) \
577         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_less,           key_type, value_type ) \
578         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less,            key_type, value_type ) \
579         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less_stat,       key_type, value_type ) \
580         CDSSTRESS_SplitListSet_SHRCU_1( fixture, test_case, key_type, value_type ) \
581         CDSSTRESS_SplitListSet_SHRCU_2( fixture, test_case, key_type, value_type ) \
582
583 #else
584 #   define CDSSTRESS_SplitListSet_SHRCU( fixture, test_case, key_type, value_type )
585 #endif
586
587 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 1
588 #   define CDSSTRESS_SplitListSet_HP_2( fixture, test_case, key_type, value_type ) \
589         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_seqcst,       key_type, value_type ) \
590         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_seqcst,      key_type, value_type ) \
591
592 #   define CDSSTRESS_SplitListSet_RCU_2( fixture, test_case, key_type, value_type ) \
593         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_seqcst,  key_type, value_type ) \
594         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_seqcst,  key_type, value_type ) \
595         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_seqcst,  key_type, value_type ) \
596
597 #else
598 #   define CDSSTRESS_SplitListSet_HP_2( fixture, test_case, key_type, value_type )
599 #   define CDSSTRESS_SplitListSet_RCU_2( fixture, test_case, key_type, value_type )
600 #endif
601
602 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL == 1
603 #   define CDSSTRESS_SplitListSet_HP_1( fixture, test_case, key_type, value_type ) \
604         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp,             key_type, value_type ) \
605         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_swar,        key_type, value_type ) \
606         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_stat,         key_type, value_type ) \
607         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_st_cmp,               key_type, value_type ) \
608         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_dyn_less,            key_type, value_type ) \
609         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_st_less,              key_type, value_type ) \
610         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_st_less_stat,        key_type, value_type ) \
611         \
612         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp,                key_type, value_type ) \
613         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_stat,            key_type, value_type ) \
614         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_DHP_st_cmp,                 key_type, value_type ) \
615         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_HP_dyn_less,                key_type, value_type ) \
616         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_DHP_st_less,                key_type, value_type ) \
617         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_HP_st_less_stat,            key_type, value_type ) \
618
619 #   define CDSSTRESS_SplitListSet_RCU_1( fixture, test_case, key_type, value_type ) \
620         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_swar,    key_type, value_type ) \
621         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_stat,    key_type, value_type ) \
622         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_stat,    key_type, value_type ) \
623         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_cmp,          key_type, value_type ) \
624         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_cmp,          key_type, value_type ) \
625         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_less,        key_type, value_type ) \
626         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less,         key_type, value_type ) \
627         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less,         key_type, value_type ) \
628         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less_stat,    key_type, value_type ) \
629         \
630         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp,            key_type, value_type ) \
631         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_stat,       key_type, value_type ) \
632         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_stat,       key_type, value_type ) \
633         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_cmp,             key_type, value_type ) \
634         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_less,           key_type, value_type ) \
635         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_less,           key_type, value_type ) \
636         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less,            key_type, value_type ) \
637         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less_stat,       key_type, value_type ) \
638         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less_stat,       key_type, value_type ) \
639         \
640         CDSSTRESS_SplitListSet_SHRCU( fixture, test_case, key_type, value_type )
641
642
643 #else
644 #   define CDSSTRESS_SplitListSet_HP_1( fixture, test_case, key_type, value_type )
645 #   define CDSSTRESS_SplitListSet_RCU_1( fixture, test_case, key_type, value_type )
646 #endif
647
648 #define CDSSTRESS_SplitListSet_HP( fixture, test_case, key_type, value_type ) \
649     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp,              key_type, value_type ) \
650     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_swar,         key_type, value_type ) \
651     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_stat,        key_type, value_type ) \
652     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_st_cmp,              key_type, value_type ) \
653     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_dyn_less,             key_type, value_type ) \
654     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_DHP_st_less,             key_type, value_type ) \
655     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_HP_st_less_stat,         key_type, value_type ) \
656     \
657     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp,                 key_type, value_type ) \
658     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_stat,           key_type, value_type ) \
659     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_HP_st_cmp,                  key_type, value_type ) \
660     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_DHP_dyn_less,               key_type, value_type ) \
661     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_HP_st_less,                 key_type, value_type ) \
662     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_DHP_st_less_stat,           key_type, value_type ) \
663     CDSSTRESS_SplitListSet_HP_1( fixture, test_case, key_type, value_type ) \
664     CDSSTRESS_SplitListSet_HP_2( fixture, test_case, key_type, value_type ) \
665
666 #define CDSSTRESS_SplitListSet_RCU( fixture, test_case, key_type, value_type ) \
667     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp,         key_type, value_type ) \
668     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp,         key_type, value_type ) \
669     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_swar,    key_type, value_type ) \
670     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp,         key_type, value_type ) \
671     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_stat,    key_type, value_type ) \
672     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_cmp,          key_type, value_type ) \
673     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_less,        key_type, value_type ) \
674     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_less,        key_type, value_type ) \
675     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less,         key_type, value_type ) \
676     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less_stat,    key_type, value_type ) \
677     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less_stat,    key_type, value_type ) \
678     \
679     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp,            key_type, value_type ) \
680     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp,            key_type, value_type ) \
681     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_stat,       key_type, value_type ) \
682     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_cmp,             key_type, value_type ) \
683     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_cmp,             key_type, value_type ) \
684     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_less,           key_type, value_type ) \
685     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less,            key_type, value_type ) \
686     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less,            key_type, value_type ) \
687     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less_stat,       key_type, value_type ) \
688     CDSSTRESS_SplitListSet_RCU_1( fixture, test_case, key_type, value_type ) \
689     CDSSTRESS_SplitListSet_RCU_2( fixture, test_case, key_type, value_type ) \
690
691 #define CDSSTRESS_SplitListSet( fixture, test_case, key_type, value_type ) \
692     CDSSTRESS_SplitListSet_HP( fixture, test_case, key_type, value_type ) \
693     CDSSTRESS_SplitListSet_RCU( fixture, test_case, key_type, value_type ) \
694
695 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 0
696 #   define CDSSTRESS_SplitListIterableSet_1( fixture, test_case, key_type, value_type ) \
697         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp,             key_type, value_type ) \
698         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_stat,         key_type, value_type ) \
699         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_seqcst,       key_type, value_type ) \
700         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_seqcst,      key_type, value_type ) \
701         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_st_cmp,               key_type, value_type ) \
702         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_dyn_less,            key_type, value_type ) \
703         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_st_less,              key_type, value_type ) \
704         CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_st_less_stat,        key_type, value_type ) \
705
706 #else
707 #   define CDSSTRESS_SplitListIterableSet_1( fixture, test_case, key_type, value_type )
708 #endif
709
710 #define CDSSTRESS_SplitListIterableSet( fixture, test_case, key_type, value_type ) \
711     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp,              key_type, value_type ) \
712     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_stat,        key_type, value_type ) \
713     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_st_cmp,              key_type, value_type ) \
714     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_dyn_less,             key_type, value_type ) \
715     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_DHP_st_less,             key_type, value_type ) \
716     CDSSTRESS_SplitListSet_case( fixture, test_case, SplitList_Iterable_HP_st_less_stat,         key_type, value_type ) \
717     CDSSTRESS_SplitListIterableSet_1( fixture, test_case, key_type, value_type )
718
719 #endif // #ifndef CDSUNIT_SET_TYPE_SPLIT_LIST_H