2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
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.
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.
31 #ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H
32 #define CDSUNIT_MAP_TYPE_SPLIT_LIST_H
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>
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>
46 #include <cds/container/iterable_kvlist_hp.h>
47 #include <cds/container/iterable_kvlist_dhp.h>
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>
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>
60 template <class GC, typename Key, typename T, typename Traits = cc::split_list::traits >
61 class SplitListMap : public cc::SplitListMap< GC, Key, T, Traits >
63 typedef cc::SplitListMap< GC, Key, T, Traits > base_class;
65 template <typename Config>
66 SplitListMap( Config const& cfg)
67 : base_class( cfg.s_nMapSize, cfg.s_nLoadFactor )
71 static CDS_CONSTEXPR bool const c_bExtractSupported = true;
72 static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
73 static CDS_CONSTEXPR bool const c_bEraseExactKey = false;
76 template <typename Key, typename T, typename Traits >
77 class SplitListMap< cds::gc::nogc, Key, T, Traits> : public cc::SplitListMap< cds::gc::nogc, Key, T, Traits >
79 typedef cc::SplitListMap< cds::gc::nogc, Key, T, Traits > base_class;
81 template <typename Config>
82 SplitListMap( Config const& cfg)
83 : base_class( cfg.s_nMapSize, cfg.s_nLoadFactor )
87 bool insert( K const& key )
89 return base_class::insert( key ) != base_class::end();
92 template <typename K, typename V>
93 bool insert( K const& key, V const& val )
95 return base_class::insert( key, val ) != base_class::end();
98 template <typename K, typename Func>
99 bool insert_with( K const& key, Func func )
101 return base_class::insert_with( key, func ) != base_class::end();
104 template <typename K>
105 bool find( K const& key )
107 return base_class::find( key ) != base_class::end();
114 static CDS_CONSTEXPR bool const c_bExtractSupported = true;
115 static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
118 struct tag_SplitListMap;
120 template <typename Key, typename Value>
121 struct map_type< tag_SplitListMap, Key, Value >: public map_type_base< Key, Value >
123 typedef map_type_base< Key, Value > base_class;
124 typedef typename base_class::key_compare compare;
125 typedef typename base_class::key_less less;
126 typedef typename base_class::equal_to equal_to;
127 typedef typename base_class::key_hash hash;
130 // ***************************************************************************
131 // SplitListMap based on MichaelList
132 struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
133 cc::split_list::ordered_list<cc::michael_list_tag>
135 ,cc::split_list::ordered_list_traits<
136 typename cc::michael_list::make_traits<
137 co::compare< compare >
142 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
143 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
144 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_NOGC_dyn_cmp;
145 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
146 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
147 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
148 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
149 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
150 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
153 struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
155 typedef cc::split_list::stat<> stat;
157 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
158 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
159 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat> SplitList_Michael_NOGC_dyn_cmp_stat;
160 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
161 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
162 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
163 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
164 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
165 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
168 struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
169 cc::split_list::ordered_list<cc::michael_list_tag>
171 ,co::memory_model< co::v::sequential_consistent >
172 ,cc::split_list::ordered_list_traits<
173 typename cc::michael_list::make_traits<
174 co::compare< compare >
175 ,co::memory_model< co::v::sequential_consistent >
180 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
181 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
182 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst> SplitList_Michael_NOGC_dyn_cmp_seqcst;
183 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
184 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
185 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
186 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
187 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
188 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
191 struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
192 cc::split_list::ordered_list<cc::michael_list_tag>
193 ,cc::split_list::dynamic_bucket_table< false >
195 ,cc::split_list::ordered_list_traits<
196 typename cc::michael_list::make_traits<
197 co::compare< compare >
202 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
203 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
204 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp> SplitList_Michael_NOGC_st_cmp;
205 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
206 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
207 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
208 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
209 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
210 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
214 struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
215 cc::split_list::ordered_list<cc::michael_list_tag>
217 ,cc::split_list::ordered_list_traits<
218 typename cc::michael_list::make_traits<
224 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
225 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
226 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less> SplitList_Michael_NOGC_dyn_less;
227 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
228 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
229 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
230 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
231 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
232 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
236 struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
237 cc::split_list::ordered_list<cc::michael_list_tag>
238 ,cc::split_list::dynamic_bucket_table< false >
240 ,cc::split_list::ordered_list_traits<
241 typename cc::michael_list::make_traits<
247 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
248 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
249 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less> SplitList_Michael_NOGC_st_less;
250 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
251 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
252 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
253 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
254 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
255 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
258 struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
260 typedef cc::split_list::stat<> stat;
262 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
263 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
264 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat> SplitList_Michael_NOGC_st_less_stat;
265 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
266 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
267 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
268 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
269 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
270 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
274 // ***************************************************************************
275 // SplitListMap based on LazyKVList
277 struct SplitList_Lazy_dyn_cmp :
278 public cc::split_list::make_traits<
279 cc::split_list::ordered_list<cc::lazy_list_tag>
281 ,cc::split_list::ordered_list_traits<
282 typename cc::lazy_list::make_traits<
283 co::compare< compare >
288 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
289 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
290 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp> SplitList_Lazy_NOGC_dyn_cmp;
291 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
292 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
293 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
294 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
295 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
296 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
299 struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
301 typedef cc::split_list::stat<> stat;
303 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
304 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
305 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat> SplitList_Lazy_NOGC_dyn_cmp_stat;
306 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
307 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
308 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
309 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
310 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
311 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
314 struct SplitList_Lazy_dyn_cmp_seqcst :
315 public cc::split_list::make_traits<
316 cc::split_list::ordered_list<cc::lazy_list_tag>
318 ,co::memory_model< co::v::sequential_consistent >
319 ,cc::split_list::ordered_list_traits<
320 typename cc::lazy_list::make_traits<
321 co::compare< compare >
322 ,co::memory_model< co::v::sequential_consistent >
327 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
328 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
329 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
330 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
331 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
332 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
333 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
334 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
335 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
338 struct SplitList_Lazy_st_cmp :
339 public cc::split_list::make_traits<
340 cc::split_list::ordered_list<cc::lazy_list_tag>
341 ,cc::split_list::dynamic_bucket_table< false >
343 ,cc::split_list::ordered_list_traits<
344 typename cc::lazy_list::make_traits<
345 co::compare< compare >
350 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
351 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
352 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp> SplitList_Lazy_NOGC_st_cmp;
353 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
354 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
355 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
356 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
357 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
358 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
362 struct SplitList_Lazy_dyn_less :
363 public cc::split_list::make_traits<
364 cc::split_list::ordered_list<cc::lazy_list_tag>
366 ,cc::split_list::ordered_list_traits<
367 typename cc::lazy_list::make_traits<
373 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
374 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
375 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less> SplitList_Lazy_NOGC_dyn_less;
376 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
377 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
378 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
379 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
380 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
381 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
384 struct SplitList_Lazy_st_less :
385 public cc::split_list::make_traits<
386 cc::split_list::ordered_list<cc::lazy_list_tag>
387 ,cc::split_list::dynamic_bucket_table< false >
389 ,cc::split_list::ordered_list_traits<
390 typename cc::lazy_list::make_traits<
396 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
397 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
398 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less> SplitList_Lazy_NOGC_st_less;
399 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
400 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
401 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
402 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
403 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
404 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
407 struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
409 typedef cc::split_list::stat<> stat;
411 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
412 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
413 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat> SplitList_Lazy_NOGC_st_less_stat;
414 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
415 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
416 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
417 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
418 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
419 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
423 // ***************************************************************************
424 // SplitListMap based on IterableList
425 struct traits_SplitList_Iterable_dyn_cmp: public cc::split_list::make_traits<
426 cc::split_list::ordered_list<cc::iterable_list_tag>
428 ,cc::split_list::ordered_list_traits<
429 typename cc::iterable_list::make_traits<
430 co::compare< compare >
435 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_HP_dyn_cmp;
436 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_DHP_dyn_cmp;
438 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_NOGC_dyn_cmp;
439 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_GPI_dyn_cmp;
440 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_GPB_dyn_cmp;
441 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_GPT_dyn_cmp;
442 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
443 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_SHB_dyn_cmp;
444 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_SHT_dyn_cmp;
448 struct traits_SplitList_Iterable_dyn_cmp_stat : public traits_SplitList_Iterable_dyn_cmp
450 typedef cc::split_list::stat<> stat;
452 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_HP_dyn_cmp_stat;
453 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_DHP_dyn_cmp_stat;
455 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat> SplitList_Iterable_NOGC_dyn_cmp_stat;
456 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_GPI_dyn_cmp_stat;
457 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_GPB_dyn_cmp_stat;
458 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_GPT_dyn_cmp_stat;
459 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
460 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_SHB_dyn_cmp_stat;
461 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_SHT_dyn_cmp_stat;
465 struct traits_SplitList_Iterable_dyn_cmp_seqcst: public cc::split_list::make_traits<
466 cc::split_list::ordered_list<cc::iterable_list_tag>
468 ,co::memory_model< co::v::sequential_consistent >
469 ,cc::split_list::ordered_list_traits<
470 typename cc::iterable_list::make_traits<
471 co::compare< compare >
472 ,co::memory_model< co::v::sequential_consistent >
477 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_HP_dyn_cmp_seqcst;
478 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_DHP_dyn_cmp_seqcst;
480 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst> SplitList_Iterable_NOGC_dyn_cmp_seqcst;
481 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_GPI_dyn_cmp_seqcst;
482 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_GPB_dyn_cmp_seqcst;
483 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_GPT_dyn_cmp_seqcst;
484 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
485 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_SHB_dyn_cmp_seqcst;
486 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_SHT_dyn_cmp_seqcst;
490 struct traits_SplitList_Iterable_st_cmp: public cc::split_list::make_traits<
491 cc::split_list::ordered_list<cc::iterable_list_tag>
492 ,cc::split_list::dynamic_bucket_table< false >
494 ,cc::split_list::ordered_list_traits<
495 typename cc::iterable_list::make_traits<
496 co::compare< compare >
501 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_HP_st_cmp;
502 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_DHP_st_cmp;
504 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_st_cmp> SplitList_Iterable_NOGC_st_cmp;
505 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_GPI_st_cmp;
506 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_GPB_st_cmp;
507 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_GPT_st_cmp;
508 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
509 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_SHB_st_cmp;
510 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_SHT_st_cmp;
515 struct traits_SplitList_Iterable_dyn_less: public cc::split_list::make_traits<
516 cc::split_list::ordered_list<cc::iterable_list_tag>
518 ,cc::split_list::ordered_list_traits<
519 typename cc::iterable_list::make_traits<
525 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_HP_dyn_less;
526 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_DHP_dyn_less;
528 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_less> SplitList_Iterable_NOGC_dyn_less;
529 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_GPI_dyn_less;
530 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_GPB_dyn_less;
531 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_GPT_dyn_less;
532 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
533 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_SHB_dyn_less;
534 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_SHT_dyn_less;
539 struct traits_SplitList_Iterable_st_less: public cc::split_list::make_traits<
540 cc::split_list::ordered_list<cc::iterable_list_tag>
541 ,cc::split_list::dynamic_bucket_table< false >
543 ,cc::split_list::ordered_list_traits<
544 typename cc::iterable_list::make_traits<
550 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_HP_st_less;
551 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_DHP_st_less;
553 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_st_less> SplitList_Iterable_NOGC_st_less;
554 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_GPI_st_less;
555 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_GPB_st_less;
556 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_GPT_st_less;
557 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
558 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_SHB_st_less;
559 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_SHT_st_less;
563 struct traits_SplitList_Iterable_st_less_stat : traits_SplitList_Iterable_st_less
565 typedef cc::split_list::stat<> stat;
567 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_HP_st_less_stat;
568 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_DHP_st_less_stat;
570 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_st_less_stat> SplitList_Iterable_NOGC_st_less_stat;
571 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_GPI_st_less_stat;
572 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_GPB_st_less_stat;
573 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_GPT_st_less_stat;
574 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
575 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_SHB_st_less_stat;
576 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_SHT_st_less_stat;
582 template <typename GC, typename K, typename T, typename Traits >
583 static inline void print_stat( cds_test::property_stream& o, SplitListMap< GC, K, T, Traits > const& m )
586 << m.list_statistics();
591 #define CDSSTRESS_SplitListMap_case( fixture, test_case, splitlist_map_type, key_type, value_type, level ) \
592 TEST_P( fixture, splitlist_map_type ) \
594 if ( !check_detail_level( level )) return; \
595 typedef map::map_type< tag_SplitListMap, key_type, value_type >::splitlist_map_type map_type; \
596 test_case<map_type>(); \
599 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
600 # define CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type ) \
601 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp, key_type, value_type, 0 ) \
602 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp, key_type, value_type, 1 ) \
603 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_stat, key_type, value_type, 1 ) \
604 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_stat, key_type, value_type, 0 ) \
605 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_seqcst, key_type, value_type, 2 ) \
606 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_seqcst, key_type, value_type, 2 ) \
607 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_cmp, key_type, value_type, 1 ) \
608 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_cmp, key_type, value_type, 1 ) \
609 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_less, key_type, value_type, 1 ) \
610 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_less, key_type, value_type, 0 ) \
611 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less, key_type, value_type, 0 ) \
612 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less, key_type, value_type, 1 ) \
613 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less_stat, key_type, value_type, 1 ) \
614 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less_stat, key_type, value_type, 0 ) \
615 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp, key_type, value_type, 0 ) \
616 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp, key_type, value_type, 1 ) \
617 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp_stat, key_type, value_type, 1 ) \
618 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp_stat, key_type, value_type, 0 ) \
619 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_cmp, key_type, value_type, 1 ) \
620 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_cmp, key_type, value_type, 1 ) \
621 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_less, key_type, value_type, 1 ) \
622 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_less, key_type, value_type, 0 ) \
623 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less, key_type, value_type, 0 ) \
624 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less, key_type, value_type, 1 ) \
625 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less_stat, key_type, value_type, 1 ) \
626 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less_stat, key_type, value_type, 0 ) \
628 # define CDSSTRESS_SplitListIterableMap_SHRCU( fixture, test_case, key_type, value_type )
630 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_cmp, key_type, value_type, 0 ) \
631 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_cmp, key_type, value_type, 1 ) \
632 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_cmp_stat, key_type, value_type, 1 ) \
633 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_cmp_stat, key_type, value_type, 0 ) \
634 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_cmp_seqcst, key_type, value_type, 2 ) \
635 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_cmp_seqcst, key_type, value_type, 2 ) \
636 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_st_cmp, key_type, value_type, 1 ) \
637 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_st_cmp, key_type, value_type, 1 ) \
638 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_less, key_type, value_type, 1 ) \
639 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_less, key_type, value_type, 0 ) \
640 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_st_less, key_type, value_type, 0 ) \
641 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_st_less, key_type, value_type, 1 ) \
642 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_st_less_stat, key_type, value_type, 1 ) \
643 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_st_less_stat, key_type, value_type, 0 ) \
646 # define CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type )
647 # define CDSSTRESS_SplitListIterableMap_SHRCU( fixture, test_case, key_type, value_type )
650 #define CDSSTRESS_SplitListMap( fixture, test_case, key_type, value_type ) \
651 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp, key_type, value_type, 0 ) \
652 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp, key_type, value_type, 1 ) \
653 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp, key_type, value_type, 0 ) \
654 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp, key_type, value_type, 1 ) \
655 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp, key_type, value_type, 0 ) \
656 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_stat, key_type, value_type, 1 ) \
657 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_stat, key_type, value_type, 0 ) \
658 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_stat, key_type, value_type, 1 ) \
659 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_stat, key_type, value_type, 0 ) \
660 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_stat, key_type, value_type, 1 ) \
661 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_seqcst, key_type, value_type, 2 ) \
662 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_seqcst, key_type, value_type, 2 ) \
663 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_seqcst, key_type, value_type, 2 ) \
664 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_seqcst, key_type, value_type, 2 ) \
665 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_seqcst, key_type, value_type, 2 ) \
666 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_cmp, key_type, value_type, 1 ) \
667 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_cmp, key_type, value_type, 0 ) \
668 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_cmp, key_type, value_type, 1 ) \
669 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_cmp, key_type, value_type, 0 ) \
670 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_cmp, key_type, value_type, 1 ) \
671 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_less, key_type, value_type, 0 ) \
672 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_less, key_type, value_type, 1 ) \
673 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_less, key_type, value_type, 0 ) \
674 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_less, key_type, value_type, 1 ) \
675 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_less, key_type, value_type, 0 ) \
676 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_less, key_type, value_type, 1 ) \
677 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_less, key_type, value_type, 0 ) \
678 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less, key_type, value_type, 1 ) \
679 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less, key_type, value_type, 0 ) \
680 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less, key_type, value_type, 1 ) \
681 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_less_stat, key_type, value_type, 0 ) \
682 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_less_stat, key_type, value_type, 1 ) \
683 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less_stat, key_type, value_type, 0 ) \
684 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less_stat, key_type, value_type, 1 ) \
685 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less_stat, key_type, value_type, 0 ) \
686 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp, key_type, value_type, 0 ) \
687 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp, key_type, value_type, 1 ) \
688 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp, key_type, value_type, 0 ) \
689 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp, key_type, value_type, 1 ) \
690 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp, key_type, value_type, 0 ) \
691 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_stat, key_type, value_type, 1 ) \
692 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_stat, key_type, value_type, 0 ) \
693 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_stat, key_type, value_type, 1 ) \
694 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_stat, key_type, value_type, 0 ) \
695 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_stat, key_type, value_type, 1 ) \
696 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_seqcst, key_type, value_type, 2 ) \
697 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_seqcst, key_type, value_type, 2 ) \
698 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst, key_type, value_type, 2 ) \
699 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst, key_type, value_type, 2 ) \
700 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst, key_type, value_type, 2 ) \
701 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_cmp, key_type, value_type, 1 ) \
702 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_cmp, key_type, value_type, 0 ) \
703 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_cmp, key_type, value_type, 1 ) \
704 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_cmp, key_type, value_type, 0 ) \
705 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_cmp, key_type, value_type, 1 ) \
706 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_less, key_type, value_type, 0 ) \
707 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_less, key_type, value_type, 1 ) \
708 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_less, key_type, value_type, 0 ) \
709 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_less, key_type, value_type, 1 ) \
710 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_less, key_type, value_type, 0 ) \
711 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_less, key_type, value_type, 1 ) \
712 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_less, key_type, value_type, 0 ) \
713 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less, key_type, value_type, 1 ) \
714 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less, key_type, value_type, 0 ) \
715 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less, key_type, value_type, 1 ) \
716 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_less_stat, key_type, value_type, 0 ) \
717 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_less_stat, key_type, value_type, 1 ) \
718 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less_stat, key_type, value_type, 0 ) \
719 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less_stat, key_type, value_type, 1 ) \
720 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less_stat, key_type, value_type, 0 ) \
721 CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type )
723 #define CDSSTRESS_SplitListIterableMap( fixture, test_case, key_type, value_type ) \
724 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp, key_type, value_type, 0 ) \
725 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp, key_type, value_type, 1 ) \
726 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_cmp, key_type, value_type, 0 )*/ \
727 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_cmp, key_type, value_type, 1 )*/ \
728 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_cmp, key_type, value_type, 0 )*/ \
729 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_stat, key_type, value_type, 1 ) \
730 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_stat, key_type, value_type, 0 ) \
731 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_cmp_stat, key_type, value_type, 1 )*/ \
732 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_cmp_stat, key_type, value_type, 0 )*/ \
733 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_cmp_stat, key_type, value_type, 1 )*/ \
734 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_seqcst, key_type, value_type, 2 ) \
735 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_seqcst, key_type, value_type, 2 ) \
736 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_cmp_seqcst, key_type, value_type, 2 )*/ \
737 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_cmp_seqcst, key_type, value_type, 2 )*/ \
738 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_cmp_seqcst, key_type, value_type, 2 )*/ \
739 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_cmp, key_type, value_type, 1 ) \
740 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_cmp, key_type, value_type, 0 ) \
741 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_st_cmp, key_type, value_type, 1 )*/ \
742 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_st_cmp, key_type, value_type, 0 )*/ \
743 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_st_cmp, key_type, value_type, 1 )*/ \
744 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_less, key_type, value_type, 0 ) \
745 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_less, key_type, value_type, 1 ) \
746 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_less, key_type, value_type, 0 )*/ \
747 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_less, key_type, value_type, 1 )*/ \
748 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_less, key_type, value_type, 0 )*/ \
749 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_less, key_type, value_type, 1 ) \
750 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_less, key_type, value_type, 0 ) \
751 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_st_less, key_type, value_type, 1 )*/ \
752 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_st_less, key_type, value_type, 0 )*/ \
753 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_st_less, key_type, value_type, 1 )*/ \
754 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_less_stat, key_type, value_type, 0 ) \
755 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_less_stat, key_type, value_type, 1 ) \
756 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_st_less_stat, key_type, value_type, 0 )*/ \
757 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_st_less_stat, key_type, value_type, 1 )*/ \
758 /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_st_less_stat, key_type, value_type, 0 )*/ \
759 CDSSTRESS_SplitListIterableMap_SHRCU( fixture, test_case, key_type, value_type )
762 #define CDSSTRESS_SplitListMap_nogc( fixture, test_case, key_type, value_type ) \
763 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_cmp, key_type, value_type, 0 ) \
764 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_cmp_stat, key_type, value_type, 0 ) \
765 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_cmp, key_type, value_type, 0 ) \
766 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_less, key_type, value_type, 0 ) \
767 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_less, key_type, value_type, 0 ) \
768 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_less_stat, key_type, value_type, 0 ) \
769 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_cmp, key_type, value_type, 0 ) \
770 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_cmp_stat, key_type, value_type, 0 ) \
771 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_cmp, key_type, value_type, 0 ) \
772 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_less, key_type, value_type, 0 ) \
773 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_less, key_type, value_type, 0 ) \
774 CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_less_stat, key_type, value_type, 0 ) \
776 #endif // ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H