[SkipList] Added random-lvel generators for max height 32/24/16
[libcds.git] / test / unit / intrusive-set / intrusive_skiplist_dhp.cpp
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "test_intrusive_set_hp.h"
32
33 #include <cds/intrusive/skip_list_dhp.h>
34
35 namespace {
36     namespace ci = cds::intrusive;
37     typedef cds::gc::DHP gc_type;
38
39     class IntrusiveSkipListSet_DHP : public cds_test::intrusive_set_hp
40     {
41     protected:
42         typedef cds_test::intrusive_set_hp base_class;
43
44     protected:
45         typedef typename base_class::base_int_item< ci::skip_list::node< gc_type>>   base_item_type;
46         typedef typename base_class::member_int_item< ci::skip_list::node< gc_type>> member_item_type;
47
48         void SetUp()
49         {
50             typedef ci::SkipListSet< gc_type, base_item_type,
51                 typename ci::skip_list::make_traits<
52                     ci::opt::hook<ci::skip_list::base_hook< ci::opt::gc< gc_type >>>
53                     ,ci::opt::disposer<mock_disposer>
54                     ,ci::opt::compare<mock_disposer>
55                 >::type
56             > set_type;
57
58             cds::gc::dhp::smr::construct( set_type::c_nHazardPtrCount );
59             cds::threading::Manager::attachThread();
60         }
61
62         void TearDown()
63         {
64             cds::threading::Manager::detachThread();
65             cds::gc::dhp::smr::destruct();
66         }
67     };
68
69
70     TEST_F( IntrusiveSkipListSet_DHP, base_cmp )
71     {
72         struct traits : public ci::skip_list::traits
73         {
74             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
75             typedef mock_disposer disposer;
76             typedef cmp<base_item_type> compare;
77         };
78
79         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
80
81         set_type s;
82         test( s );
83     }
84
85     TEST_F( IntrusiveSkipListSet_DHP, base_less )
86     {
87         struct traits : public ci::skip_list::traits
88         {
89             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
90             typedef mock_disposer disposer;
91             typedef base_class::less<base_item_type> less;
92             typedef cds::atomicity::item_counter item_counter;
93         };
94
95         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
96
97         set_type s;
98         test( s );
99     }
100
101     TEST_F( IntrusiveSkipListSet_DHP, base_cmpmix )
102     {
103         struct traits : public ci::skip_list::traits
104         {
105             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
106             typedef mock_disposer disposer;
107             typedef cmp<base_item_type> compare;
108             typedef base_class::less<base_item_type> less;
109             typedef ci::skip_list::stat<> stat;
110         };
111
112         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
113
114         set_type s;
115         test( s );
116     }
117
118     TEST_F( IntrusiveSkipListSet_DHP, base_xorshift32 )
119     {
120         struct traits : public ci::skip_list::traits
121         {
122             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
123             typedef mock_disposer disposer;
124             typedef cmp<base_item_type> compare;
125             typedef ci::skip_list::xorshift32 random_level_generator;
126         };
127
128         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
129
130         set_type s;
131         test( s );
132     }
133
134     TEST_F( IntrusiveSkipListSet_DHP, base_xorshift24 )
135     {
136         struct traits: public ci::skip_list::traits
137         {
138             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
139             typedef mock_disposer disposer;
140             typedef cmp<base_item_type> compare;
141             typedef ci::skip_list::xorshift24 random_level_generator;
142         };
143
144         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
145
146         set_type s;
147         test( s );
148     }
149
150     TEST_F( IntrusiveSkipListSet_DHP, base_xorshift16 )
151     {
152         struct traits: public ci::skip_list::traits
153         {
154             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
155             typedef mock_disposer disposer;
156             typedef cmp<base_item_type> compare;
157             typedef ci::skip_list::xorshift16 random_level_generator;
158         };
159
160         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
161
162         set_type s;
163         test( s );
164     }
165
166     TEST_F( IntrusiveSkipListSet_DHP, base_turbo32 )
167     {
168         struct traits: public ci::skip_list::traits
169         {
170             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
171             typedef mock_disposer disposer;
172             typedef cmp<base_item_type> compare;
173             typedef ci::skip_list::turbo32 random_level_generator;
174         };
175
176         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
177
178         set_type s;
179         test( s );
180     }
181
182     TEST_F( IntrusiveSkipListSet_DHP, base_turbo24 )
183     {
184         struct traits: public ci::skip_list::traits
185         {
186             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
187             typedef mock_disposer disposer;
188             typedef cmp<base_item_type> compare;
189             typedef ci::skip_list::turbo24 random_level_generator;
190         };
191
192         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
193
194         set_type s;
195         test( s );
196     }
197
198     TEST_F( IntrusiveSkipListSet_DHP, base_turbo16 )
199     {
200         struct traits: public ci::skip_list::traits
201         {
202             typedef ci::skip_list::base_hook< ci::opt::gc< gc_type >> hook;
203             typedef mock_disposer disposer;
204             typedef cmp<base_item_type> compare;
205             typedef ci::skip_list::turbo16 random_level_generator;
206         };
207
208         typedef ci::SkipListSet< gc_type, base_item_type, traits > set_type;
209
210         set_type s;
211         test( s );
212     }
213
214     TEST_F( IntrusiveSkipListSet_DHP, member_cmp )
215     {
216         struct traits : public ci::skip_list::traits
217         {
218             typedef ci::skip_list::member_hook< offsetof(member_item_type, hMember), ci::opt::gc< gc_type >> hook;
219             typedef mock_disposer disposer;
220             typedef cmp<member_item_type> compare;
221         };
222
223         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
224
225         set_type s;
226         test( s );
227     }
228
229     TEST_F( IntrusiveSkipListSet_DHP, member_less )
230     {
231         struct traits : public ci::skip_list::traits
232         {
233             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
234             typedef mock_disposer disposer;
235             typedef base_class::less<member_item_type> less;
236             typedef cds::atomicity::item_counter item_counter;
237             typedef ci::opt::v::sequential_consistent memory_model;
238         };
239
240         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
241
242         set_type s;
243         test( s );
244     }
245
246     TEST_F( IntrusiveSkipListSet_DHP, member_cmpmix )
247     {
248         struct traits : public ci::skip_list::traits
249         {
250             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
251             typedef mock_disposer disposer;
252             typedef cmp<member_item_type> compare;
253             typedef base_class::less<member_item_type> less;
254             typedef ci::skip_list::stat<> stat;
255         };
256
257         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
258
259         set_type s;
260         test( s );
261     }
262
263     TEST_F( IntrusiveSkipListSet_DHP, member_xorshift32 )
264     {
265         struct traits : public ci::skip_list::traits
266         {
267             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
268             typedef mock_disposer disposer;
269             typedef cmp<member_item_type> compare;
270             typedef ci::skip_list::xorshift32 random_level_generator;
271         };
272
273         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
274
275         set_type s;
276         test( s );
277     }
278
279     TEST_F( IntrusiveSkipListSet_DHP, member_xorshift24 )
280     {
281         struct traits: public ci::skip_list::traits
282         {
283             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
284             typedef mock_disposer disposer;
285             typedef cmp<member_item_type> compare;
286             typedef ci::skip_list::xorshift24 random_level_generator;
287         };
288
289         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
290
291         set_type s;
292         test( s );
293     }
294
295     TEST_F( IntrusiveSkipListSet_DHP, member_xorshift16 )
296     {
297         struct traits: public ci::skip_list::traits
298         {
299             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
300             typedef mock_disposer disposer;
301             typedef cmp<member_item_type> compare;
302             typedef ci::skip_list::xorshift16 random_level_generator;
303         };
304
305         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
306
307         set_type s;
308         test( s );
309     }
310
311     TEST_F( IntrusiveSkipListSet_DHP, member_turbo32 )
312     {
313         struct traits: public ci::skip_list::traits
314         {
315             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
316             typedef mock_disposer disposer;
317             typedef cmp<member_item_type> compare;
318             typedef ci::skip_list::turbo32 random_level_generator;
319         };
320
321         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
322
323         set_type s;
324         test( s );
325     }
326
327     TEST_F( IntrusiveSkipListSet_DHP, member_turbo24 )
328     {
329         struct traits: public ci::skip_list::traits
330         {
331             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
332             typedef mock_disposer disposer;
333             typedef cmp<member_item_type> compare;
334             typedef ci::skip_list::turbo24 random_level_generator;
335         };
336
337         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
338
339         set_type s;
340         test( s );
341     }
342
343     TEST_F( IntrusiveSkipListSet_DHP, member_turbo16 )
344     {
345         struct traits: public ci::skip_list::traits
346         {
347             typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
348             typedef mock_disposer disposer;
349             typedef cmp<member_item_type> compare;
350             typedef ci::skip_list::turbo16 random_level_generator;
351         };
352
353         typedef ci::SkipListSet< gc_type, member_item_type, traits > set_type;
354
355         set_type s;
356         test( s );
357     }
358
359 } // namespace