3a807253874419984c9847837a74ebf2ebdd26c6
[libcds.git] / tests / unit / map2 / map_type_split_list.h
1 //$$CDS-header$$
2
3 #ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H
4 #define CDSUNIT_MAP_TYPE_SPLIT_LIST_H
5
6 #include "map2/map_type.h"
7
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>
12
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>
17
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>
21
22 #include "print_split_list_stat.h"
23
24 namespace map2 {
25
26     template <class GC, typename Key, typename T, typename Traits = cc::split_list::traits >
27     class SplitListMap : public cc::SplitListMap< GC, Key, T, Traits >
28     {
29         typedef cc::SplitListMap< GC, Key, T, Traits > base_class;
30     public:
31         template <typename Config>
32         SplitListMap( Config const& cfg)
33             : base_class( cfg.c_nMapSize, cfg.c_nLoadFactor )
34         {}
35
36         // for testing
37         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
38         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
39     };
40
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 >
43     {
44         typedef cc::SplitListMap< cds::gc::nogc, Key, T, Traits > base_class;
45     public:
46         template <typename Config>
47         SplitListMap( Config const& cfg)
48             : base_class( cfg.c_nMapSize, cfg.c_nLoadFactor )
49         {}
50
51         template <typename K>
52         bool insert( K const& key )
53         {
54             return base_class::insert( key ) != base_class::end();
55         }
56
57         template <typename K, typename V>
58         bool insert( K const& key, V const& val )
59         {
60             return base_class::insert( key, val ) != base_class::end();
61         }
62
63         template <typename K, typename Func>
64         bool insert_with( K const& key, Func func )
65         {
66             return base_class::insert_with( key, func ) != base_class::end();
67         }
68
69         template <typename K>
70         bool find( K const& key )
71         {
72             return base_class::find( key ) != base_class::end();
73         }
74
75         void clear()
76         {}
77
78         // for testing
79         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
80         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
81     };
82
83     struct tag_SplitListMap;
84
85     template <typename Key, typename Value>
86     struct map_type< tag_SplitListMap, Key, Value >: public map_type_base< Key, Value >
87     {
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;
94
95
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>
100                 ,co::hash< hash >
101                 ,cc::split_list::ordered_list_traits<
102                     typename cc::michael_list::make_traits<
103                         co::compare< compare >
104                     >::type
105                 >
106             >::type
107         {};
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;
117 #endif
118
119         struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
120         {
121             typedef cc::split_list::stat<> stat;
122         };
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;
132 #endif
133
134         struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
135                 cc::split_list::ordered_list<cc::michael_list_tag>
136                 ,co::hash< hash >
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 >
142                     >::type
143                 >
144             >::type
145         {};
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;
155 #endif
156
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 >
160                 ,co::hash< hash >
161                 ,cc::split_list::ordered_list_traits<
162                     typename cc::michael_list::make_traits<
163                         co::compare< compare >
164                     >::type
165                 >
166             >::type
167         {};
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;
177 #endif
178
179         struct traits_SplitList_Michael_st_cmp_seqcst: public cc::split_list::make_traits<
180                 cc::split_list::ordered_list<cc::michael_list_tag>
181                 ,co::hash< hash >
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 >
188                     >::type
189                 >
190             >::type
191         {};
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;
201 #endif
202
203         //HP + less
204         struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
205                 cc::split_list::ordered_list<cc::michael_list_tag>
206                 ,co::hash< hash >
207                 ,cc::split_list::ordered_list_traits<
208                     typename cc::michael_list::make_traits<
209                         co::less< less >
210                     >::type
211                 >
212             >::type
213         {};
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;
223 #endif
224
225
226         struct traits_SplitList_Michael_dyn_less_seqcst: public cc::split_list::make_traits<
227                 cc::split_list::ordered_list<cc::michael_list_tag>
228                 ,co::hash< hash >
229                 ,co::memory_model< co::v::sequential_consistent >
230                 ,cc::split_list::ordered_list_traits<
231                     typename cc::michael_list::make_traits<
232                         co::less< less >
233                         ,co::memory_model< co::v::sequential_consistent >
234                     >::type
235                 >
236             >::type
237         {};
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;
247 #endif
248
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 >
252                 ,co::hash< hash >
253                 ,cc::split_list::ordered_list_traits<
254                     typename cc::michael_list::make_traits<
255                         co::less< less >
256                     >::type
257                 >
258             >::type
259         {};
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;
269 #endif
270
271         struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
272         {
273             typedef cc::split_list::stat<> stat;
274         };
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;
284 #endif
285
286
287         class traits_SplitList_Michael_st_less_seqcst: public cc::split_list::make_traits<
288                 cc::split_list::ordered_list<cc::michael_list_tag>
289                 ,co::hash< hash >
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<
294                         co::less< less >
295                         ,co::memory_model< co::v::sequential_consistent >
296                     >::type
297                 >
298             >::type
299         {};
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;
309 #endif
310
311
312         // ***************************************************************************
313         // SplitListMap based on LazyKVList
314
315         struct SplitList_Lazy_dyn_cmp :
316             public cc::split_list::make_traits<
317                 cc::split_list::ordered_list<cc::lazy_list_tag>
318                 ,co::hash< hash >
319                 ,cc::split_list::ordered_list_traits<
320                     typename cc::lazy_list::make_traits<
321                         co::compare< compare >
322                     >::type
323                 >
324             >::type
325         {};
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;
335 #endif
336
337         struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
338         {
339             typedef cc::split_list::stat<> stat;
340         };
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;
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::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 >
361                     >::type
362                 >
363             >::type
364         {};
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;
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                 ,cc::split_list::ordered_list_traits<
382                     typename cc::lazy_list::make_traits<
383                         co::compare< compare >
384                     >::type
385                 >
386             >::type
387         {};
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;
397 #endif
398
399
400         struct SplitList_Lazy_st_cmp_seqcst :
401             public cc::split_list::make_traits<
402                 cc::split_list::ordered_list<cc::lazy_list_tag>
403                 ,co::hash< hash >
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 >
410                     >::type
411                 >
412             >::type
413         {};
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;
423 #endif
424
425
426         struct SplitList_Lazy_dyn_less :
427             public cc::split_list::make_traits<
428                 cc::split_list::ordered_list<cc::lazy_list_tag>
429                 ,co::hash< hash >
430                 ,cc::split_list::ordered_list_traits<
431                     typename cc::lazy_list::make_traits<
432                         co::less< less >
433                     >::type
434                 >
435             >::type
436         {};
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;
446 #endif
447
448         struct SplitList_Lazy_dyn_less_seqcst:
449             public cc::split_list::make_traits<
450                 cc::split_list::ordered_list<cc::lazy_list_tag>
451                 ,co::hash< hash >
452                 ,co::memory_model< co::v::sequential_consistent >
453                 ,cc::split_list::ordered_list_traits<
454                     typename cc::lazy_list::make_traits<
455                         co::less< less >
456                         ,co::memory_model< co::v::sequential_consistent >
457                     >::type
458                 >
459             >::type
460         {};
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;
470 #endif
471
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 >
476                 ,co::hash< hash >
477                 ,cc::split_list::ordered_list_traits<
478                     typename cc::lazy_list::make_traits<
479                         co::less< less >
480                     >::type
481                 >
482             >::type
483         {};
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;
493 #endif
494
495         struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
496         {
497             typedef cc::split_list::stat<> stat;
498         };
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;
508 #endif
509
510         struct SplitList_Lazy_st_less_seqcst :
511             public cc::split_list::make_traits<
512                 cc::split_list::ordered_list<cc::lazy_list_tag>
513                 ,co::hash< hash >
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<
518                         co::less< less >
519                         ,co::memory_model< co::v::sequential_consistent >
520                     >::type
521                 >
522             >::type
523         {};
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;
533 #endif
534     };
535
536     template <typename GC, typename K, typename T, typename Traits >
537     static inline void print_stat( SplitListMap< GC, K, T, Traits > const& m )
538     {
539         CPPUNIT_MSG( m.statistics() );
540     }
541
542 }   // namespace map2
543
544 #endif // ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H