1efd127f4323e5b92c6086e02dfa183499aff3f3
[libcds.git] / test / stress / map / map_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_MAP_TYPE_SPLIT_LIST_H
32 #define CDSUNIT_MAP_TYPE_SPLIT_LIST_H
33
34 #include "map_type.h"
35
36 #include <cds/container/michael_kvlist_hp.h>
37 #include <cds/container/michael_kvlist_dhp.h>
38 #include <cds/container/michael_kvlist_rcu.h>
39 #include <cds/container/michael_kvlist_nogc.h>
40
41 #include <cds/container/lazy_kvlist_hp.h>
42 #include <cds/container/lazy_kvlist_dhp.h>
43 #include <cds/container/lazy_kvlist_rcu.h>
44 #include <cds/container/lazy_kvlist_nogc.h>
45
46 #include <cds/container/iterable_kvlist_hp.h>
47 #include <cds/container/iterable_kvlist_dhp.h>
48
49 #include <cds/container/split_list_map.h>
50 #include <cds/container/split_list_map_rcu.h>
51 #include <cds/container/split_list_map_nogc.h>
52
53 #include <cds_test/stat_splitlist_out.h>
54 #include <cds_test/stat_michael_list_out.h>
55 #include <cds_test/stat_lazy_list_out.h>
56 #include <cds_test/stat_iterable_list_out.h>
57
58 namespace map {
59
60     template <class GC, typename Key, typename T, typename Traits = cc::split_list::traits >
61     class SplitListMap : public cc::SplitListMap< GC, Key, T, Traits >
62     {
63         typedef cc::SplitListMap< GC, Key, T, Traits > base_class;
64     public:
65         template <typename Config>
66         SplitListMap( Config const& cfg)
67             : base_class( cfg.s_nMapSize, cfg.s_nLoadFactor )
68         {}
69
70         template <typename Iterator>
71         typename std::enable_if< std::is_same< Iterator, typename base_class::iterator>::value, Iterator>::type
72         get_begin()
73         {
74             return base_class::begin();
75         }
76
77         template <typename Iterator>
78         typename std::enable_if< std::is_same< Iterator, typename base_class::iterator>::value, Iterator>::type
79         get_end()
80         {
81             return base_class::end();
82         }
83
84         // for testing
85         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
86         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
87         static CDS_CONSTEXPR bool const c_bEraseExactKey = false;
88     };
89
90     template <typename Key, typename T, typename Traits >
91     class SplitListMap< cds::gc::nogc, Key, T, Traits> : public cc::SplitListMap< cds::gc::nogc, Key, T, Traits >
92     {
93         typedef cc::SplitListMap< cds::gc::nogc, Key, T, Traits > base_class;
94     public:
95         template <typename Config>
96         SplitListMap( Config const& cfg)
97             : base_class( cfg.s_nMapSize, cfg.s_nLoadFactor )
98         {}
99
100         template <typename K>
101         bool insert( K const& key )
102         {
103             return base_class::insert( key ) != base_class::end();
104         }
105
106         template <typename K, typename V>
107         bool insert( K const& key, V const& val )
108         {
109             return base_class::insert( key, val ) != base_class::end();
110         }
111
112         template <typename K, typename Func>
113         bool insert_with( K const& key, Func func )
114         {
115             return base_class::insert_with( key, func ) != base_class::end();
116         }
117
118         template <typename K>
119         bool find( K const& key )
120         {
121             return base_class::find( key ) != base_class::end();
122         }
123
124         void clear()
125         {}
126
127         // for testing
128         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
129         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
130     };
131
132     struct tag_SplitListMap;
133
134     template <typename Key, typename Value>
135     struct map_type< tag_SplitListMap, Key, Value >: public map_type_base< Key, Value >
136     {
137         typedef map_type_base< Key, Value >      base_class;
138         typedef typename base_class::key_compare compare;
139         typedef typename base_class::key_less    less;
140         typedef typename base_class::equal_to    equal_to;
141         typedef typename base_class::key_hash    hash;
142
143
144         // ***************************************************************************
145         // SplitListMap based on MichaelList
146         struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
147                 cc::split_list::ordered_list<cc::michael_list_tag>
148                 ,co::hash< hash >
149                 ,co::item_counter< cds::atomicity::cache_friendly_item_counter >
150                 ,cc::split_list::ordered_list_traits<
151                     typename cc::michael_list::make_traits<
152                         co::compare< compare >
153                     >::type
154                 >
155             >::type
156         {};
157         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
158         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
159         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_NOGC_dyn_cmp;
160         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
161         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
162         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
163 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
164         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
165 #endif
166
167         struct traits_SplitList_Michael_dyn_cmp_swar: public traits_SplitList_Michael_dyn_cmp
168         {
169             typedef cds::algo::bit_reversal::swar bit_reversal;
170         };
171         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_HP_dyn_cmp_swar;
172         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_DHP_dyn_cmp_swar;
173         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_NOGC_dyn_cmp_swar;
174         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_GPI_dyn_cmp_swar;
175         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_GPB_dyn_cmp_swar;
176         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_GPT_dyn_cmp_swar;
177 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
178         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_swar > SplitList_Michael_RCU_SHB_dyn_cmp_swar;
179 #endif
180
181         struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
182         {
183             typedef cc::split_list::stat<> stat;
184             typedef typename cc::michael_list::make_traits<
185                 co::compare< compare >
186                 ,co::stat< cc::michael_list::stat<> >
187             >::type ordered_list_traits;
188         };
189         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
190         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
191         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat> SplitList_Michael_NOGC_dyn_cmp_stat;
192         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
193         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
194         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
195 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
196         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
197 #endif
198
199         struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
200                 cc::split_list::ordered_list<cc::michael_list_tag>
201                 ,co::hash< hash >
202                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
203                 ,co::memory_model< co::v::sequential_consistent >
204                 ,cc::split_list::ordered_list_traits<
205                     typename cc::michael_list::make_traits<
206                         co::compare< compare >
207                         ,co::memory_model< co::v::sequential_consistent >
208                     >::type
209                 >
210             >::type
211         {};
212         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
213         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
214         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst> SplitList_Michael_NOGC_dyn_cmp_seqcst;
215         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
216         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
217         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
218 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
219         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
220 #endif
221
222         struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
223                 cc::split_list::ordered_list<cc::michael_list_tag>
224                 ,cc::split_list::dynamic_bucket_table< false >
225                 ,co::hash< hash >
226                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
227                 ,cc::split_list::ordered_list_traits<
228                     typename cc::michael_list::make_traits<
229                         co::compare< compare >
230                     >::type
231                 >
232             >::type
233         {};
234         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
235         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
236         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp> SplitList_Michael_NOGC_st_cmp;
237         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
238         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
239         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
240 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
241         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
242 #endif
243
244         //HP + less
245         struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
246                 cc::split_list::ordered_list<cc::michael_list_tag>
247                 ,co::hash< hash >
248                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
249                 ,cc::split_list::ordered_list_traits<
250                     typename cc::michael_list::make_traits<
251                         co::less< less >
252                     >::type
253                 >
254             >::type
255         {};
256         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
257         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
258         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less> SplitList_Michael_NOGC_dyn_less;
259         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
260         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
261         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
262 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
263         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
264 #endif
265
266
267         struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
268                 cc::split_list::ordered_list<cc::michael_list_tag>
269                 ,cc::split_list::dynamic_bucket_table< false >
270                 ,co::hash< hash >
271                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
272                 ,cc::split_list::ordered_list_traits<
273                     typename cc::michael_list::make_traits<
274                         co::less< less >
275                     >::type
276                 >
277             >::type
278         {};
279         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
280         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
281         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less> SplitList_Michael_NOGC_st_less;
282         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
283         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
284         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
285 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
286         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
287 #endif
288
289         struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
290         {
291             typedef cc::split_list::stat<> stat;
292             typedef typename cc::michael_list::make_traits<
293                 co::less< less >
294                 , co::stat< cc::michael_list::stat<> >
295             >::type ordered_list_traits;
296
297         };
298         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
299         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
300         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat> SplitList_Michael_NOGC_st_less_stat;
301         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
302         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
303         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
304 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
305         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
306 #endif
307
308
309         // ***************************************************************************
310         // SplitListMap based on LazyKVList
311
312         struct SplitList_Lazy_dyn_cmp :
313             public cc::split_list::make_traits<
314                 cc::split_list::ordered_list<cc::lazy_list_tag>
315                 ,co::hash< hash >
316                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
317                 ,cc::split_list::ordered_list_traits<
318                     typename cc::lazy_list::make_traits<
319                         co::compare< compare >
320                     >::type
321                 >
322             >::type
323         {};
324         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
325         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
326         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp> SplitList_Lazy_NOGC_dyn_cmp;
327         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
328         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
329         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
330 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
331         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
332 #endif
333
334         struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
335         {
336             typedef cc::split_list::stat<> stat;
337             typedef typename cc::lazy_list::make_traits<
338                 co::compare< compare >
339                 , co::stat< cc::lazy_list::stat<>>
340             >::type ordered_list_traits;
341         };
342         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
343         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
344         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat> SplitList_Lazy_NOGC_dyn_cmp_stat;
345         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
346         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
347         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
348 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
349         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
350 #endif
351
352         struct SplitList_Lazy_dyn_cmp_seqcst :
353             public cc::split_list::make_traits<
354                 cc::split_list::ordered_list<cc::lazy_list_tag>
355                 ,co::hash< hash >
356                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
357                 ,co::memory_model< co::v::sequential_consistent >
358                 ,cc::split_list::ordered_list_traits<
359                     typename cc::lazy_list::make_traits<
360                         co::compare< compare >
361                         ,co::memory_model< co::v::sequential_consistent >
362                     >::type
363                 >
364             >::type
365         {};
366         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
367         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
368         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
369         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
370         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
371         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
372 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
373         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
374 #endif
375
376         struct SplitList_Lazy_st_cmp :
377             public cc::split_list::make_traits<
378                 cc::split_list::ordered_list<cc::lazy_list_tag>
379                 ,cc::split_list::dynamic_bucket_table< false >
380                 ,co::hash< hash >
381                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
382                 ,cc::split_list::ordered_list_traits<
383                     typename cc::lazy_list::make_traits<
384                         co::compare< compare >
385                     >::type
386                 >
387             >::type
388         {};
389         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
390         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
391         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp> SplitList_Lazy_NOGC_st_cmp;
392         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
393         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
394         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
395 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
396         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
397 #endif
398
399
400         struct SplitList_Lazy_dyn_less :
401             public cc::split_list::make_traits<
402                 cc::split_list::ordered_list<cc::lazy_list_tag>
403                 ,co::hash< hash >
404                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
405                 ,cc::split_list::ordered_list_traits<
406                     typename cc::lazy_list::make_traits<
407                         co::less< less >
408                     >::type
409                 >
410             >::type
411         {};
412         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
413         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
414         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less> SplitList_Lazy_NOGC_dyn_less;
415         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
416         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
417         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
418 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
419         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
420 #endif
421
422         struct SplitList_Lazy_st_less :
423             public cc::split_list::make_traits<
424                 cc::split_list::ordered_list<cc::lazy_list_tag>
425                 ,cc::split_list::dynamic_bucket_table< false >
426                 ,co::hash< hash >
427                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
428                 ,cc::split_list::ordered_list_traits<
429                     typename cc::lazy_list::make_traits<
430                         co::less< less >
431                     >::type
432                 >
433             >::type
434         {};
435         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
436         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
437         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less> SplitList_Lazy_NOGC_st_less;
438         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
439         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
440         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
441 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
442         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
443 #endif
444
445         struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
446         {
447             typedef cc::split_list::stat<> stat;
448             typedef typename cc::lazy_list::make_traits<
449                 co::less< less >
450                 , co::stat< cc::lazy_list::stat<>>
451             >::type ordered_list_traits;
452         };
453         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
454         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
455         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat> SplitList_Lazy_NOGC_st_less_stat;
456         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
457         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
458         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
459 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
460         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
461 #endif
462
463
464         // ***************************************************************************
465         // SplitListMap based on IterableList
466         struct traits_SplitList_Iterable_dyn_cmp: public cc::split_list::make_traits<
467                 cc::split_list::ordered_list<cc::iterable_list_tag>
468                 ,co::hash< hash >
469                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
470                 ,cc::split_list::ordered_list_traits<
471                     typename cc::iterable_list::make_traits<
472                         co::compare< compare >
473                     >::type
474                 >
475             >::type
476         {};
477         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_HP_dyn_cmp;
478         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_DHP_dyn_cmp;
479
480         struct traits_SplitList_Iterable_dyn_cmp_stat : public traits_SplitList_Iterable_dyn_cmp
481         {
482             typedef cc::split_list::stat<> stat;
483             typedef typename cc::iterable_list::make_traits<
484                 co::compare< compare >
485                 , co::stat< cc::iterable_list::stat<>>
486             >::type ordered_list_traits;
487         };
488         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_HP_dyn_cmp_stat;
489         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_DHP_dyn_cmp_stat;
490
491         struct traits_SplitList_Iterable_dyn_cmp_seqcst: public cc::split_list::make_traits<
492                 cc::split_list::ordered_list<cc::iterable_list_tag>
493                 ,co::hash< hash >
494                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
495                 ,co::memory_model< co::v::sequential_consistent >
496                 ,cc::split_list::ordered_list_traits<
497                     typename cc::iterable_list::make_traits<
498                         co::compare< compare >
499                         ,co::memory_model< co::v::sequential_consistent >
500                     >::type
501                 >
502             >::type
503         {};
504         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_HP_dyn_cmp_seqcst;
505         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_DHP_dyn_cmp_seqcst;
506
507         struct traits_SplitList_Iterable_st_cmp: public cc::split_list::make_traits<
508                 cc::split_list::ordered_list<cc::iterable_list_tag>
509                 ,cc::split_list::dynamic_bucket_table< false >
510                 ,co::hash< hash >
511                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
512                 ,cc::split_list::ordered_list_traits<
513                     typename cc::iterable_list::make_traits<
514                         co::compare< compare >
515                     >::type
516                 >
517             >::type
518         {};
519         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_HP_st_cmp;
520         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_DHP_st_cmp;
521
522         //HP + less
523         struct traits_SplitList_Iterable_dyn_less: public cc::split_list::make_traits<
524                 cc::split_list::ordered_list<cc::iterable_list_tag>
525                 ,co::hash< hash >
526                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
527                 ,cc::split_list::ordered_list_traits<
528                     typename cc::iterable_list::make_traits<
529                         co::less< less >
530                     >::type
531                 >
532             >::type
533         {};
534         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_HP_dyn_less;
535         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_DHP_dyn_less;
536
537         struct traits_SplitList_Iterable_st_less: public cc::split_list::make_traits<
538                 cc::split_list::ordered_list<cc::iterable_list_tag>
539                 ,cc::split_list::dynamic_bucket_table< false >
540                 ,co::hash< hash >
541                 , co::item_counter< cds::atomicity::cache_friendly_item_counter >
542                 ,cc::split_list::ordered_list_traits<
543                     typename cc::iterable_list::make_traits<
544                         co::less< less >
545                     >::type
546                 >
547             >::type
548         {};
549         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_HP_st_less;
550         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_DHP_st_less;
551
552         struct traits_SplitList_Iterable_st_less_stat : traits_SplitList_Iterable_st_less
553         {
554             typedef cc::split_list::stat<> stat;
555             typedef typename cc::iterable_list::make_traits<
556                 co::less< less >
557                 , co::stat< cc::iterable_list::stat<>>
558             >::type ordered_list_traits;
559         };
560         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_HP_st_less_stat;
561         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_DHP_st_less_stat;
562     };
563
564     template <typename GC, typename K, typename T, typename Traits >
565     static inline void print_stat( cds_test::property_stream& o, SplitListMap< GC, K, T, Traits > const& m )
566     {
567         o << m.statistics()
568           << cds_test::stat_prefix( "list_stat" )
569           << m.list_statistics()
570           << cds_test::stat_prefix( "" );
571     }
572
573 }   // namespace map
574
575 #define CDSSTRESS_SplitListMap_case( fixture, test_case, splitlist_map_type, key_type, value_type ) \
576     TEST_P( fixture, splitlist_map_type ) \
577     { \
578         typedef map::map_type< tag_SplitListMap, key_type, value_type >::splitlist_map_type map_type; \
579         test_case<map_type>(); \
580     }
581
582 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
583
584 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 1
585 #   define CDSSTRESS_SplitListMap_SHRCU_2( fixture, test_case, key_type, value_type ) \
586         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_seqcst,  key_type, value_type ) \
587         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_seqcst,  key_type, value_type ) \
588
589 #else
590 #   define CDSSTRESS_SplitListMap_SHRCU_2( fixture, test_case, key_type, value_type )
591 #endif
592
593 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL == 1
594 #   define CDSSTRESS_SplitListMap_SHRCU_1( fixture, test_case, key_type, value_type ) \
595         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp,         key_type, value_type ) \
596         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_stat,    key_type, value_type ) \
597         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_cmp,          key_type, value_type ) \
598         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_cmp,          key_type, value_type ) \
599         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_less,        key_type, value_type ) \
600         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less,         key_type, value_type ) \
601         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less_stat,    key_type, value_type ) \
602         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp,            key_type, value_type ) \
603         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp_stat,       key_type, value_type ) \
604         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_cmp,             key_type, value_type ) \
605         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_cmp,             key_type, value_type ) \
606         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_less,           key_type, value_type ) \
607         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less,            key_type, value_type ) \
608         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less_stat,       key_type, value_type ) \
609
610 #else
611 #   define CDSSTRESS_SplitListMap_SHRCU_1( fixture, test_case, key_type, value_type )
612 #endif
613
614
615 #   define CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type ) \
616         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp,         key_type, value_type ) \
617         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_stat,    key_type, value_type ) \
618         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_less,        key_type, value_type ) \
619         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less,         key_type, value_type ) \
620         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less_stat,    key_type, value_type ) \
621         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp,            key_type, value_type ) \
622         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp_stat,       key_type, value_type ) \
623         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_less,           key_type, value_type ) \
624         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less,            key_type, value_type ) \
625         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less_stat,       key_type, value_type ) \
626         CDSSTRESS_SplitListMap_SHRCU_1( fixture, test_case, key_type, value_type ) \
627         CDSSTRESS_SplitListMap_SHRCU_2( fixture, test_case, key_type, value_type ) \
628
629 #else
630 #   define CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type )
631 #endif
632
633 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 1
634 #   define CDSSTRESS_SplitListMap_HP_2( fixture, test_case, key_type, value_type ) \
635         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_seqcst,       key_type, value_type ) \
636         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_seqcst,      key_type, value_type ) \
637         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_seqcst,          key_type, value_type ) \
638         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_seqcst,         key_type, value_type ) \
639
640 #   define CDSSTRESS_SplitListMap_RCU_2( fixture, test_case, key_type, value_type ) \
641         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_seqcst,  key_type, value_type ) \
642         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_seqcst,  key_type, value_type ) \
643         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_seqcst,  key_type, value_type ) \
644         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst,     key_type, value_type ) \
645         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst,     key_type, value_type ) \
646         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst,     key_type, value_type ) \
647
648 #   define CDSSTRESS_SplitListMap_2( fixture, test_case, key_type, value_type ) \
649         CDSSTRESS_SplitListMap_HP_2( fixture, test_case, key_type, value_type ) \
650         CDSSTRESS_SplitListMap_RCU_2( fixture, test_case, key_type, value_type ) \
651
652
653 #else
654 #   define CDSSTRESS_SplitListMap_HP_2( fixture, test_case, key_type, value_type )
655 #   define CDSSTRESS_SplitListMap_RCU_2( fixture, test_case, key_type, value_type )
656 #   define CDSSTRESS_SplitListMap_2( fixture, test_case, key_type, value_type )
657 #endif
658
659 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL == 1
660 #   define CDSSTRESS_SplitListMap_HP_1( fixture, test_case, key_type, value_type ) \
661         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp,             key_type, value_type ) \
662         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_swar,        key_type, value_type ) \
663         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_stat,         key_type, value_type ) \
664         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_cmp,               key_type, value_type ) \
665         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_less,            key_type, value_type ) \
666         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_less,              key_type, value_type ) \
667         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_less_stat,        key_type, value_type ) \
668         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp,                key_type, value_type ) \
669         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_stat,            key_type, value_type ) \
670         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_cmp,                  key_type, value_type ) \
671         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_less,               key_type, value_type ) \
672         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_less,                 key_type, value_type ) \
673         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_less_stat,           key_type, value_type ) \
674
675 #   define CDSSTRESS_SplitListMap_RCU_1( fixture, test_case, key_type, value_type ) \
676         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_stat,    key_type, value_type ) \
677         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp,         key_type, value_type ) \
678         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_stat,    key_type, value_type ) \
679         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_cmp,          key_type, value_type ) \
680         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_cmp,          key_type, value_type ) \
681         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_less,        key_type, value_type ) \
682         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less,         key_type, value_type ) \
683         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less,         key_type, value_type ) \
684         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less_stat,    key_type, value_type ) \
685         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp,            key_type, value_type ) \
686         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_stat,       key_type, value_type ) \
687         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_stat,       key_type, value_type ) \
688         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_cmp,             key_type, value_type ) \
689         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_cmp,             key_type, value_type ) \
690         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_less,           key_type, value_type ) \
691         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less,            key_type, value_type ) \
692         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less,            key_type, value_type ) \
693         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less_stat,       key_type, value_type ) \
694         CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type ) \
695
696 #   define CDSSTRESS_SplitListMap_1( fixture, test_case, key_type, value_type ) \
697         CDSSTRESS_SplitListMap_HP_1( fixture, test_case, key_type, value_type ) \
698         CDSSTRESS_SplitListMap_RCU_1( fixture, test_case, key_type, value_type ) \
699
700 #else
701 #   define CDSSTRESS_SplitListMap_HP_1( fixture, test_case, key_type, value_type )
702 #   define CDSSTRESS_SplitListMap_RCU_1( fixture, test_case, key_type, value_type )
703 #   define CDSSTRESS_SplitListMap_1( fixture, test_case, key_type, value_type )
704 #endif
705
706
707 #define CDSSTRESS_SplitListMap_HP( fixture, test_case, key_type, value_type ) \
708     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp,              key_type, value_type ) \
709     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_swar,         key_type, value_type ) \
710     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_stat,        key_type, value_type ) \
711     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_cmp,              key_type, value_type ) \
712     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_less,             key_type, value_type ) \
713     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_less_stat,         key_type, value_type ) \
714     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_less,             key_type, value_type ) \
715     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp,                 key_type, value_type ) \
716     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_stat,           key_type, value_type ) \
717     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_cmp,                 key_type, value_type ) \
718     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_less,                key_type, value_type ) \
719     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_less,                key_type, value_type ) \
720     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_less_stat,            key_type, value_type ) \
721     CDSSTRESS_SplitListMap_HP_1( fixture, test_case, key_type, value_type ) \
722     CDSSTRESS_SplitListMap_HP_2( fixture, test_case, key_type, value_type ) \
723
724 #define CDSSTRESS_SplitListMap_RCU( fixture, test_case, key_type, value_type ) \
725     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp,         key_type, value_type ) \
726     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp,         key_type, value_type ) \
727     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_swar,    key_type, value_type ) \
728     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_stat,    key_type, value_type ) \
729     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_cmp,          key_type, value_type ) \
730     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_less,        key_type, value_type ) \
731     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_less,        key_type, value_type ) \
732     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less,         key_type, value_type ) \
733     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less_stat,    key_type, value_type ) \
734     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less_stat,    key_type, value_type ) \
735     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp,            key_type, value_type ) \
736     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp,            key_type, value_type ) \
737     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_stat,       key_type, value_type ) \
738     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_cmp,             key_type, value_type ) \
739     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_less,           key_type, value_type ) \
740     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_less,           key_type, value_type ) \
741     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less,            key_type, value_type ) \
742     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less_stat,       key_type, value_type ) \
743     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less_stat,       key_type, value_type ) \
744     CDSSTRESS_SplitListMap_RCU_1( fixture, test_case, key_type, value_type ) \
745     CDSSTRESS_SplitListMap_RCU_2( fixture, test_case, key_type, value_type ) \
746
747 #define CDSSTRESS_SplitListMap( fixture, test_case, key_type, value_type ) \
748     CDSSTRESS_SplitListMap_HP( fixture, test_case, key_type, value_type ) \
749     CDSSTRESS_SplitListMap_RCU( fixture, test_case, key_type, value_type ) \
750
751 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 0
752 #   define CDSSTRESS_SplitListIterableMap_1( fixture, test_case, key_type, value_type ) \
753         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp,             key_type, value_type ) \
754         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_stat,         key_type, value_type ) \
755         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_cmp,               key_type, value_type ) \
756         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_less,            key_type, value_type ) \
757         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_less,              key_type, value_type ) \
758         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_less_stat,        key_type, value_type ) \
759
760 #else
761 #   define CDSSTRESS_SplitListIterableMap_1( fixture, test_case, key_type, value_type )
762 #endif
763
764
765 #define CDSSTRESS_SplitListIterableMap( fixture, test_case, key_type, value_type ) \
766     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp,              key_type, value_type ) \
767     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_stat,        key_type, value_type ) \
768     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_cmp,              key_type, value_type ) \
769     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_less,             key_type, value_type ) \
770     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_less,             key_type, value_type ) \
771     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_less_stat,         key_type, value_type ) \
772     CDSSTRESS_SplitListIterableMap_1( fixture, test_case, key_type, value_type ) \
773
774
775 #define CDSSTRESS_SplitListMap_nogc( fixture, test_case, key_type, value_type ) \
776     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_cmp,            key_type, value_type ) \
777     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_cmp_stat,       key_type, value_type ) \
778     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_cmp,             key_type, value_type ) \
779     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_less,           key_type, value_type ) \
780     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_less,            key_type, value_type ) \
781     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_less_stat,       key_type, value_type ) \
782     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_cmp,               key_type, value_type ) \
783     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_cmp_stat,          key_type, value_type ) \
784     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_cmp,                key_type, value_type ) \
785     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_less,              key_type, value_type ) \
786     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_less,               key_type, value_type ) \
787     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_less_stat,          key_type, value_type ) \
788
789 #endif // ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H