3 #ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H
4 #define CDSUNIT_MAP_TYPE_SPLIT_LIST_H
6 #include "map2/map_type.h"
8 #include <cds/container/michael_kvlist_hp.h>
9 #include <cds/container/michael_kvlist_dhp.h>
10 #include <cds/container/michael_kvlist_rcu.h>
11 #include <cds/container/michael_kvlist_nogc.h>
13 #include <cds/container/lazy_kvlist_hp.h>
14 #include <cds/container/lazy_kvlist_dhp.h>
15 #include <cds/container/lazy_kvlist_rcu.h>
16 #include <cds/container/lazy_kvlist_nogc.h>
18 #include <cds/container/split_list_map.h>
19 #include <cds/container/split_list_map_rcu.h>
20 #include <cds/container/split_list_map_nogc.h>
22 #include "print_split_list_stat.h"
26 template <class GC, typename Key, typename T, typename Traits = cc::split_list::traits >
27 class SplitListMap : public cc::SplitListMap< GC, Key, T, Traits >
29 typedef cc::SplitListMap< GC, Key, T, Traits > base_class;
31 template <typename Config>
32 SplitListMap( Config const& cfg)
33 : base_class( cfg.c_nMapSize, cfg.c_nLoadFactor )
37 static CDS_CONSTEXPR bool const c_bExtractSupported = true;
38 static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
41 template <typename Key, typename T, typename Traits >
42 class SplitListMap< cds::gc::nogc, Key, T, Traits> : public cc::SplitListMap< cds::gc::nogc, Key, T, Traits >
44 typedef cc::SplitListMap< cds::gc::nogc, Key, T, Traits > base_class;
46 template <typename Config>
47 SplitListMap( Config const& cfg)
48 : base_class( cfg.c_nMapSize, cfg.c_nLoadFactor )
52 bool insert( K const& key )
54 return base_class::insert( key ) != base_class::end();
57 template <typename K, typename V>
58 bool insert( K const& key, V const& val )
60 return base_class::insert( key, val ) != base_class::end();
63 template <typename K, typename Func>
64 bool insert_with( K const& key, Func func )
66 return base_class::insert_with( key, func ) != base_class::end();
70 bool find( K const& key )
72 return base_class::find( key ) != base_class::end();
79 static CDS_CONSTEXPR bool const c_bExtractSupported = true;
80 static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
83 struct tag_SplitListMap;
85 template <typename Key, typename Value>
86 struct map_type< tag_SplitListMap, Key, Value >: public map_type_base< Key, Value >
88 typedef map_type_base< Key, Value > base_class;
89 typedef typename base_class::compare compare;
90 typedef typename base_class::less less;
91 typedef typename base_class::equal_to equal_to;
92 typedef typename base_class::key_hash key_hash;
93 typedef typename base_class::hash hash;
96 // ***************************************************************************
97 // SplitListMap based on MichaelList
98 struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
99 cc::split_list::ordered_list<cc::michael_list_tag>
101 ,cc::split_list::ordered_list_traits<
102 typename cc::michael_list::make_traits<
103 co::compare< compare >
108 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
109 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
110 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_NOGC_dyn_cmp;
111 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
112 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
113 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
114 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
115 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
116 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
119 struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
121 typedef cc::split_list::stat<> stat;
123 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
124 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
125 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat> SplitList_Michael_NOGC_dyn_cmp_stat;
126 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
127 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
128 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
129 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
130 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
131 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
134 struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
135 cc::split_list::ordered_list<cc::michael_list_tag>
137 ,co::memory_model< co::v::sequential_consistent >
138 ,cc::split_list::ordered_list_traits<
139 typename cc::michael_list::make_traits<
140 co::compare< compare >
141 ,co::memory_model< co::v::sequential_consistent >
146 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
147 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
148 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst> SplitList_Michael_NOGC_dyn_cmp_seqcst;
149 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
150 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
151 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
152 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
153 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
154 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
157 struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
158 cc::split_list::ordered_list<cc::michael_list_tag>
159 ,cc::split_list::dynamic_bucket_table< false >
161 ,cc::split_list::ordered_list_traits<
162 typename cc::michael_list::make_traits<
163 co::compare< compare >
168 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
169 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
170 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp> SplitList_Michael_NOGC_st_cmp;
171 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
172 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
173 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
174 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
175 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
176 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
179 struct traits_SplitList_Michael_st_cmp_seqcst: public cc::split_list::make_traits<
180 cc::split_list::ordered_list<cc::michael_list_tag>
182 ,cc::split_list::dynamic_bucket_table< false >
183 ,co::memory_model< co::v::sequential_consistent >
184 ,cc::split_list::ordered_list_traits<
185 typename cc::michael_list::make_traits<
186 co::compare< compare >
187 ,co::memory_model< co::v::sequential_consistent >
192 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_HP_st_cmp_seqcst;
193 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_DHP_st_cmp_seqcst;
194 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_NOGC_st_cmp_seqcst;
195 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPI_st_cmp_seqcst;
196 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPB_st_cmp_seqcst;
197 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPT_st_cmp_seqcst;
198 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
199 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHB_st_cmp_seqcst;
200 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHT_st_cmp_seqcst;
204 struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
205 cc::split_list::ordered_list<cc::michael_list_tag>
207 ,cc::split_list::ordered_list_traits<
208 typename cc::michael_list::make_traits<
214 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
215 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
216 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less> SplitList_Michael_NOGC_dyn_less;
217 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
218 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
219 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
220 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
221 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
222 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
226 struct traits_SplitList_Michael_dyn_less_seqcst: public cc::split_list::make_traits<
227 cc::split_list::ordered_list<cc::michael_list_tag>
229 ,co::memory_model< co::v::sequential_consistent >
230 ,cc::split_list::ordered_list_traits<
231 typename cc::michael_list::make_traits<
233 ,co::memory_model< co::v::sequential_consistent >
238 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
239 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
240 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less_seqcst> SplitList_Michael_NOGC_dyn_less_seqcst;
241 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
242 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
243 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
244 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
245 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
246 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
249 struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
250 cc::split_list::ordered_list<cc::michael_list_tag>
251 ,cc::split_list::dynamic_bucket_table< false >
253 ,cc::split_list::ordered_list_traits<
254 typename cc::michael_list::make_traits<
260 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
261 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
262 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less> SplitList_Michael_NOGC_st_less;
263 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
264 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
265 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
266 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
267 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
268 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
271 struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
273 typedef cc::split_list::stat<> stat;
275 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
276 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
277 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat> SplitList_Michael_NOGC_st_less_stat;
278 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
279 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
280 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
281 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
282 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
283 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
287 class traits_SplitList_Michael_st_less_seqcst: public cc::split_list::make_traits<
288 cc::split_list::ordered_list<cc::michael_list_tag>
290 ,cc::split_list::dynamic_bucket_table< false >
291 ,co::memory_model< co::v::sequential_consistent >
292 ,cc::split_list::ordered_list_traits<
293 typename cc::michael_list::make_traits<
295 ,co::memory_model< co::v::sequential_consistent >
300 typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
301 typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
302 typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_seqcst> SplitList_Michael_NOGC_st_less_seqcst;
303 typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
304 typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
305 typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
306 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
307 typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
308 typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
312 // ***************************************************************************
313 // SplitListMap based on LazyKVList
315 struct SplitList_Lazy_dyn_cmp :
316 public cc::split_list::make_traits<
317 cc::split_list::ordered_list<cc::lazy_list_tag>
319 ,cc::split_list::ordered_list_traits<
320 typename cc::lazy_list::make_traits<
321 co::compare< compare >
326 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
327 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
328 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp> SplitList_Lazy_NOGC_dyn_cmp;
329 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
330 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
331 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
332 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
333 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
334 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
337 struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
339 typedef cc::split_list::stat<> stat;
341 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
342 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
343 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat> SplitList_Lazy_NOGC_dyn_cmp_stat;
344 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
345 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
346 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
347 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
348 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
349 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
352 struct SplitList_Lazy_dyn_cmp_seqcst :
353 public cc::split_list::make_traits<
354 cc::split_list::ordered_list<cc::lazy_list_tag>
356 ,co::memory_model< co::v::sequential_consistent >
357 ,cc::split_list::ordered_list_traits<
358 typename cc::lazy_list::make_traits<
359 co::compare< compare >
360 ,co::memory_model< co::v::sequential_consistent >
365 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
366 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
367 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
368 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
369 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
370 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
371 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
372 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
373 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
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 >
381 ,cc::split_list::ordered_list_traits<
382 typename cc::lazy_list::make_traits<
383 co::compare< compare >
388 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
389 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
390 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp> SplitList_Lazy_NOGC_st_cmp;
391 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
392 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
393 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
394 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
395 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
396 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
400 struct SplitList_Lazy_st_cmp_seqcst :
401 public cc::split_list::make_traits<
402 cc::split_list::ordered_list<cc::lazy_list_tag>
404 ,cc::split_list::dynamic_bucket_table< false >
405 ,co::memory_model< co::v::sequential_consistent >
406 ,cc::split_list::ordered_list_traits<
407 typename cc::lazy_list::make_traits<
408 co::compare< compare >
409 ,co::memory_model< co::v::sequential_consistent >
414 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_HP_st_cmp_seqcst;
415 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_DHP_st_cmp_seqcst;
416 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_NOGC_st_cmp_seqcst;
417 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
418 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
419 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
420 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
421 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
422 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
426 struct SplitList_Lazy_dyn_less :
427 public cc::split_list::make_traits<
428 cc::split_list::ordered_list<cc::lazy_list_tag>
430 ,cc::split_list::ordered_list_traits<
431 typename cc::lazy_list::make_traits<
437 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
438 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
439 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less> SplitList_Lazy_NOGC_dyn_less;
440 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
441 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
442 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
443 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
444 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
445 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
448 struct SplitList_Lazy_dyn_less_seqcst:
449 public cc::split_list::make_traits<
450 cc::split_list::ordered_list<cc::lazy_list_tag>
452 ,co::memory_model< co::v::sequential_consistent >
453 ,cc::split_list::ordered_list_traits<
454 typename cc::lazy_list::make_traits<
456 ,co::memory_model< co::v::sequential_consistent >
461 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
462 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
463 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less_seqcst> SplitList_Lazy_NOGC_dyn_less_seqcst;
464 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
465 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
466 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
467 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
468 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
469 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
472 struct SplitList_Lazy_st_less :
473 public cc::split_list::make_traits<
474 cc::split_list::ordered_list<cc::lazy_list_tag>
475 ,cc::split_list::dynamic_bucket_table< false >
477 ,cc::split_list::ordered_list_traits<
478 typename cc::lazy_list::make_traits<
484 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
485 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
486 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less> SplitList_Lazy_NOGC_st_less;
487 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
488 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
489 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
490 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
491 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
492 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
495 struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
497 typedef cc::split_list::stat<> stat;
499 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
500 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
501 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat> SplitList_Lazy_NOGC_st_less_stat;
502 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
503 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
504 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
505 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
506 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
507 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
510 struct SplitList_Lazy_st_less_seqcst :
511 public cc::split_list::make_traits<
512 cc::split_list::ordered_list<cc::lazy_list_tag>
514 ,cc::split_list::dynamic_bucket_table< false >
515 ,co::memory_model< co::v::sequential_consistent >
516 ,cc::split_list::ordered_list_traits<
517 typename cc::lazy_list::make_traits<
519 ,co::memory_model< co::v::sequential_consistent >
524 typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
525 typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
526 typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_seqcst> SplitList_Lazy_NOGC_st_less_seqcst;
527 typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
528 typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
529 typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
530 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
531 typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
532 typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
536 template <typename GC, typename K, typename T, typename Traits >
537 static inline void print_stat( SplitListMap< GC, K, T, Traits > const& m )
539 CPPUNIT_MSG( m.statistics() );
544 #endif // ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H