Test working directory set to the binary output directory in order to
[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         static CDS_CONSTEXPR bool const c_bEraseExactKey = false;
40     };
41
42     template <typename Key, typename T, typename Traits >
43     class SplitListMap< cds::gc::nogc, Key, T, Traits> : public cc::SplitListMap< cds::gc::nogc, Key, T, Traits >
44     {
45         typedef cc::SplitListMap< cds::gc::nogc, Key, T, Traits > base_class;
46     public:
47         template <typename Config>
48         SplitListMap( Config const& cfg)
49             : base_class( cfg.c_nMapSize, cfg.c_nLoadFactor )
50         {}
51
52         template <typename K>
53         bool insert( K const& key )
54         {
55             return base_class::insert( key ) != base_class::end();
56         }
57
58         template <typename K, typename V>
59         bool insert( K const& key, V const& val )
60         {
61             return base_class::insert( key, val ) != base_class::end();
62         }
63
64         template <typename K, typename Func>
65         bool insert_with( K const& key, Func func )
66         {
67             return base_class::insert_with( key, func ) != base_class::end();
68         }
69
70         template <typename K>
71         bool find( K const& key )
72         {
73             return base_class::find( key ) != base_class::end();
74         }
75
76         void clear()
77         {}
78
79         // for testing
80         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
81         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
82     };
83
84     struct tag_SplitListMap;
85
86     template <typename Key, typename Value>
87     struct map_type< tag_SplitListMap, Key, Value >: public map_type_base< Key, Value >
88     {
89         typedef map_type_base< Key, Value > base_class;
90         typedef typename base_class::compare    compare;
91         typedef typename base_class::less       less;
92         typedef typename base_class::equal_to   equal_to;
93         typedef typename base_class::key_hash   key_hash;
94         typedef typename base_class::hash       hash;
95
96
97         // ***************************************************************************
98         // SplitListMap based on MichaelList
99         struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
100                 cc::split_list::ordered_list<cc::michael_list_tag>
101                 ,co::hash< hash >
102                 ,cc::split_list::ordered_list_traits<
103                     typename cc::michael_list::make_traits<
104                         co::compare< compare >
105                     >::type
106                 >
107             >::type
108         {};
109         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
110         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
111         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_NOGC_dyn_cmp;
112         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
113         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
114         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
115 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
116         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
117         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
118 #endif
119
120         struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
121         {
122             typedef cc::split_list::stat<> stat;
123         };
124         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
125         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
126         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat> SplitList_Michael_NOGC_dyn_cmp_stat;
127         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
128         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
129         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
130 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
131         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
132         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
133 #endif
134
135         struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
136                 cc::split_list::ordered_list<cc::michael_list_tag>
137                 ,co::hash< hash >
138                 ,co::memory_model< co::v::sequential_consistent >
139                 ,cc::split_list::ordered_list_traits<
140                     typename cc::michael_list::make_traits<
141                         co::compare< compare >
142                         ,co::memory_model< co::v::sequential_consistent >
143                     >::type
144                 >
145             >::type
146         {};
147         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
148         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
149         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst> SplitList_Michael_NOGC_dyn_cmp_seqcst;
150         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
151         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
152         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
153 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
154         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
155         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
156 #endif
157
158         struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
159                 cc::split_list::ordered_list<cc::michael_list_tag>
160                 ,cc::split_list::dynamic_bucket_table< false >
161                 ,co::hash< hash >
162                 ,cc::split_list::ordered_list_traits<
163                     typename cc::michael_list::make_traits<
164                         co::compare< compare >
165                     >::type
166                 >
167             >::type
168         {};
169         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
170         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
171         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp> SplitList_Michael_NOGC_st_cmp;
172         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
173         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
174         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
175 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
176         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
177         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
178 #endif
179
180         struct traits_SplitList_Michael_st_cmp_seqcst: public cc::split_list::make_traits<
181                 cc::split_list::ordered_list<cc::michael_list_tag>
182                 ,co::hash< hash >
183                 ,cc::split_list::dynamic_bucket_table< false >
184                 ,co::memory_model< co::v::sequential_consistent >
185                 ,cc::split_list::ordered_list_traits<
186                     typename cc::michael_list::make_traits<
187                         co::compare< compare >
188                         ,co::memory_model< co::v::sequential_consistent >
189                     >::type
190                 >
191             >::type
192         {};
193         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_HP_st_cmp_seqcst;
194         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_DHP_st_cmp_seqcst;
195         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_NOGC_st_cmp_seqcst;
196         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPI_st_cmp_seqcst;
197         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPB_st_cmp_seqcst;
198         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_GPT_st_cmp_seqcst;
199 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
200         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHB_st_cmp_seqcst;
201         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp_seqcst > SplitList_Michael_RCU_SHT_st_cmp_seqcst;
202 #endif
203
204         //HP + less
205         struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
206                 cc::split_list::ordered_list<cc::michael_list_tag>
207                 ,co::hash< hash >
208                 ,cc::split_list::ordered_list_traits<
209                     typename cc::michael_list::make_traits<
210                         co::less< less >
211                     >::type
212                 >
213             >::type
214         {};
215         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
216         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
217         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less> SplitList_Michael_NOGC_dyn_less;
218         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
219         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
220         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
221 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
222         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
223         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
224 #endif
225
226
227         struct traits_SplitList_Michael_dyn_less_seqcst: public cc::split_list::make_traits<
228                 cc::split_list::ordered_list<cc::michael_list_tag>
229                 ,co::hash< hash >
230                 ,co::memory_model< co::v::sequential_consistent >
231                 ,cc::split_list::ordered_list_traits<
232                     typename cc::michael_list::make_traits<
233                         co::less< less >
234                         ,co::memory_model< co::v::sequential_consistent >
235                     >::type
236                 >
237             >::type
238         {};
239         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
240         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
241         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less_seqcst> SplitList_Michael_NOGC_dyn_less_seqcst;
242         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
243         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
244         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
245 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
246         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
247         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
248 #endif
249
250         struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
251                 cc::split_list::ordered_list<cc::michael_list_tag>
252                 ,cc::split_list::dynamic_bucket_table< false >
253                 ,co::hash< hash >
254                 ,cc::split_list::ordered_list_traits<
255                     typename cc::michael_list::make_traits<
256                         co::less< less >
257                     >::type
258                 >
259             >::type
260         {};
261         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
262         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
263         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less> SplitList_Michael_NOGC_st_less;
264         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
265         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
266         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
267 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
268         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
269         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
270 #endif
271
272         struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
273         {
274             typedef cc::split_list::stat<> stat;
275         };
276         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
277         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
278         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat> SplitList_Michael_NOGC_st_less_stat;
279         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
280         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
281         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
282 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
283         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
284         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
285 #endif
286
287
288         class traits_SplitList_Michael_st_less_seqcst: public cc::split_list::make_traits<
289                 cc::split_list::ordered_list<cc::michael_list_tag>
290                 ,co::hash< hash >
291                 ,cc::split_list::dynamic_bucket_table< false >
292                 ,co::memory_model< co::v::sequential_consistent >
293                 ,cc::split_list::ordered_list_traits<
294                     typename cc::michael_list::make_traits<
295                         co::less< less >
296                         ,co::memory_model< co::v::sequential_consistent >
297                     >::type
298                 >
299             >::type
300         {};
301         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
302         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
303         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_seqcst> SplitList_Michael_NOGC_st_less_seqcst;
304         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
305         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
306         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
307 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
308         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
309         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
310 #endif
311
312
313         // ***************************************************************************
314         // SplitListMap based on LazyKVList
315
316         struct SplitList_Lazy_dyn_cmp :
317             public cc::split_list::make_traits<
318                 cc::split_list::ordered_list<cc::lazy_list_tag>
319                 ,co::hash< hash >
320                 ,cc::split_list::ordered_list_traits<
321                     typename cc::lazy_list::make_traits<
322                         co::compare< compare >
323                     >::type
324                 >
325             >::type
326         {};
327         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
328         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
329         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp> SplitList_Lazy_NOGC_dyn_cmp;
330         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
331         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
332         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
333 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
334         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
335         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
336 #endif
337
338         struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
339         {
340             typedef cc::split_list::stat<> stat;
341         };
342         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
343         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
344         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat> SplitList_Lazy_NOGC_dyn_cmp_stat;
345         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
346         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
347         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
348 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
349         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
350         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
351 #endif
352
353         struct SplitList_Lazy_dyn_cmp_seqcst :
354             public cc::split_list::make_traits<
355                 cc::split_list::ordered_list<cc::lazy_list_tag>
356                 ,co::hash< hash >
357                 ,co::memory_model< co::v::sequential_consistent >
358                 ,cc::split_list::ordered_list_traits<
359                     typename cc::lazy_list::make_traits<
360                         co::compare< compare >
361                         ,co::memory_model< co::v::sequential_consistent >
362                     >::type
363                 >
364             >::type
365         {};
366         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
367         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
368         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
369         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
370         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
371         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
372 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
373         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
374         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
375 #endif
376
377         struct SplitList_Lazy_st_cmp :
378             public cc::split_list::make_traits<
379                 cc::split_list::ordered_list<cc::lazy_list_tag>
380                 ,cc::split_list::dynamic_bucket_table< false >
381                 ,co::hash< hash >
382                 ,cc::split_list::ordered_list_traits<
383                     typename cc::lazy_list::make_traits<
384                         co::compare< compare >
385                     >::type
386                 >
387             >::type
388         {};
389         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
390         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
391         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp> SplitList_Lazy_NOGC_st_cmp;
392         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
393         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
394         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
395 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
396         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
397         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
398 #endif
399
400
401         struct SplitList_Lazy_st_cmp_seqcst :
402             public cc::split_list::make_traits<
403                 cc::split_list::ordered_list<cc::lazy_list_tag>
404                 ,co::hash< hash >
405                 ,cc::split_list::dynamic_bucket_table< false >
406                 ,co::memory_model< co::v::sequential_consistent >
407                 ,cc::split_list::ordered_list_traits<
408                     typename cc::lazy_list::make_traits<
409                         co::compare< compare >
410                         ,co::memory_model< co::v::sequential_consistent >
411                     >::type
412                 >
413             >::type
414         {};
415         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_HP_st_cmp_seqcst;
416         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_DHP_st_cmp_seqcst;
417         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_NOGC_st_cmp_seqcst;
418         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
419         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
420         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
421 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
422         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
423         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp_seqcst> SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
424 #endif
425
426
427         struct SplitList_Lazy_dyn_less :
428             public cc::split_list::make_traits<
429                 cc::split_list::ordered_list<cc::lazy_list_tag>
430                 ,co::hash< hash >
431                 ,cc::split_list::ordered_list_traits<
432                     typename cc::lazy_list::make_traits<
433                         co::less< less >
434                     >::type
435                 >
436             >::type
437         {};
438         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
439         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
440         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less> SplitList_Lazy_NOGC_dyn_less;
441         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
442         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
443         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
444 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
445         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
446         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
447 #endif
448
449         struct SplitList_Lazy_dyn_less_seqcst:
450             public cc::split_list::make_traits<
451                 cc::split_list::ordered_list<cc::lazy_list_tag>
452                 ,co::hash< hash >
453                 ,co::memory_model< co::v::sequential_consistent >
454                 ,cc::split_list::ordered_list_traits<
455                     typename cc::lazy_list::make_traits<
456                         co::less< less >
457                         ,co::memory_model< co::v::sequential_consistent >
458                     >::type
459                 >
460             >::type
461         {};
462         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
463         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
464         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less_seqcst> SplitList_Lazy_NOGC_dyn_less_seqcst;
465         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
466         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
467         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
468 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
469         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
470         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
471 #endif
472
473         struct SplitList_Lazy_st_less :
474             public cc::split_list::make_traits<
475                 cc::split_list::ordered_list<cc::lazy_list_tag>
476                 ,cc::split_list::dynamic_bucket_table< false >
477                 ,co::hash< hash >
478                 ,cc::split_list::ordered_list_traits<
479                     typename cc::lazy_list::make_traits<
480                         co::less< less >
481                     >::type
482                 >
483             >::type
484         {};
485         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
486         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
487         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less> SplitList_Lazy_NOGC_st_less;
488         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
489         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
490         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
491 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
492         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
493         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
494 #endif
495
496         struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
497         {
498             typedef cc::split_list::stat<> stat;
499         };
500         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
501         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
502         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat> SplitList_Lazy_NOGC_st_less_stat;
503         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
504         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
505         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
506 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
507         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
508         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
509 #endif
510
511         struct SplitList_Lazy_st_less_seqcst :
512             public cc::split_list::make_traits<
513                 cc::split_list::ordered_list<cc::lazy_list_tag>
514                 ,co::hash< hash >
515                 ,cc::split_list::dynamic_bucket_table< false >
516                 ,co::memory_model< co::v::sequential_consistent >
517                 ,cc::split_list::ordered_list_traits<
518                     typename cc::lazy_list::make_traits<
519                         co::less< less >
520                         ,co::memory_model< co::v::sequential_consistent >
521                     >::type
522                 >
523             >::type
524         {};
525         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
526         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
527         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_seqcst> SplitList_Lazy_NOGC_st_less_seqcst;
528         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
529         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
530         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
531 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
532         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
533         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
534 #endif
535     };
536
537     template <typename GC, typename K, typename T, typename Traits >
538     static inline void print_stat( SplitListMap< GC, K, T, Traits > const& m )
539     {
540         CPPUNIT_MSG( m.statistics() );
541     }
542
543 }   // namespace map2
544
545 #endif // ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H