cbfdfba4bb13de8a0b13ed50ef30e05a17353bec
[libcds.git] / test / unit / intrusive-set / test_intrusive_skiplist_rcu.h
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 #ifndef CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H
31 #define CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H
32
33 #include "test_intrusive_set_rcu.h"
34 #include <cds/intrusive/skip_list_rcu.h>
35
36 namespace ci = cds::intrusive;
37
38 template <class RCU>
39 class IntrusiveSkipListSet: public cds_test::intrusive_set_rcu
40 {
41     typedef cds_test::intrusive_set_rcu base_class;
42 public:
43     typedef cds::urcu::gc<RCU> rcu_type;
44     typedef typename base_class::base_int_item< ci::skip_list::node<rcu_type>>   base_item_type;
45     typedef typename base_class::member_int_item< ci::skip_list::node<rcu_type>> member_item_type;
46
47 protected:
48     void SetUp()
49     {
50         RCU::Construct();
51         cds::threading::Manager::attachThread();
52     }
53
54     void TearDown()
55     {
56         cds::threading::Manager::detachThread();
57         RCU::Destruct();
58     }
59 };
60
61 TYPED_TEST_CASE_P( IntrusiveSkipListSet );
62
63 TYPED_TEST_P( IntrusiveSkipListSet, base_cmp )
64 {
65     typedef typename TestFixture::rcu_type rcu_type;
66     typedef typename TestFixture::base_item_type base_item_type;
67     typedef typename TestFixture::mock_disposer mock_disposer;
68     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
69
70     struct traits : public ci::skip_list::traits
71     {
72         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
73         typedef mock_disposer disposer;
74         typedef item_cmp compare;
75     };
76
77     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
78
79     set_type s;
80     this->test( s );
81 }
82
83 TYPED_TEST_P( IntrusiveSkipListSet, base_less )
84 {
85     typedef typename TestFixture::rcu_type rcu_type;
86     typedef typename TestFixture::base_item_type base_item_type;
87     typedef typename TestFixture::mock_disposer mock_disposer;
88     typedef typename TestFixture::template less<base_item_type> less_predicate;
89
90     struct traits : public ci::skip_list::traits
91     {
92         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
93         typedef mock_disposer disposer;
94         typedef less_predicate less;
95         typedef cds::atomicity::item_counter item_counter;
96     };
97
98     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
99
100     set_type s;
101     this->test( s );
102 }
103
104 TYPED_TEST_P( IntrusiveSkipListSet, base_cmpmix )
105 {
106     typedef typename TestFixture::rcu_type rcu_type;
107     typedef typename TestFixture::base_item_type base_item_type;
108     typedef typename TestFixture::mock_disposer mock_disposer;
109     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
110     typedef typename TestFixture::template less<base_item_type> less_predicate;
111
112     struct traits : public ci::skip_list::traits
113     {
114         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
115         typedef mock_disposer disposer;
116         typedef item_cmp compare;
117         typedef less_predicate less;
118         typedef ci::skip_list::stat<> stat;
119     };
120
121     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
122
123     set_type s;
124     this->test( s );
125 }
126
127 TYPED_TEST_P( IntrusiveSkipListSet, base_xorshift32 )
128 {
129     typedef typename TestFixture::rcu_type rcu_type;
130     typedef typename TestFixture::base_item_type base_item_type;
131     typedef typename TestFixture::mock_disposer mock_disposer;
132     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
133
134     struct traits : public ci::skip_list::traits
135     {
136         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
137         typedef mock_disposer disposer;
138         typedef item_cmp compare;
139         typedef ci::skip_list::xorshift32 random_level_generator;
140     };
141
142     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
143
144     set_type s;
145     this->test( s );
146 }
147
148 TYPED_TEST_P( IntrusiveSkipListSet, base_xorshift24 )
149 {
150     typedef typename TestFixture::rcu_type rcu_type;
151     typedef typename TestFixture::base_item_type base_item_type;
152     typedef typename TestFixture::mock_disposer mock_disposer;
153     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
154
155     struct traits: public ci::skip_list::traits
156     {
157         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
158         typedef mock_disposer disposer;
159         typedef item_cmp compare;
160         typedef ci::skip_list::xorshift24 random_level_generator;
161     };
162
163     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
164
165     set_type s;
166     this->test( s );
167 }
168
169 TYPED_TEST_P( IntrusiveSkipListSet, base_xorshift16 )
170 {
171     typedef typename TestFixture::rcu_type rcu_type;
172     typedef typename TestFixture::base_item_type base_item_type;
173     typedef typename TestFixture::mock_disposer mock_disposer;
174     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
175
176     struct traits: public ci::skip_list::traits
177     {
178         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
179         typedef mock_disposer disposer;
180         typedef item_cmp compare;
181         typedef ci::skip_list::xorshift16 random_level_generator;
182     };
183
184     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
185
186     set_type s;
187     this->test( s );
188 }
189
190 TYPED_TEST_P( IntrusiveSkipListSet, base_turbo32 )
191 {
192     typedef typename TestFixture::rcu_type rcu_type;
193     typedef typename TestFixture::base_item_type base_item_type;
194     typedef typename TestFixture::mock_disposer mock_disposer;
195     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
196
197     struct traits: public ci::skip_list::traits
198     {
199         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
200         typedef mock_disposer disposer;
201         typedef item_cmp compare;
202         typedef ci::skip_list::turbo32 random_level_generator;
203     };
204
205     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
206
207     set_type s;
208     this->test( s );
209 }
210
211 TYPED_TEST_P( IntrusiveSkipListSet, base_turbo24 )
212 {
213     typedef typename TestFixture::rcu_type rcu_type;
214     typedef typename TestFixture::base_item_type base_item_type;
215     typedef typename TestFixture::mock_disposer mock_disposer;
216     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
217
218     struct traits: public ci::skip_list::traits
219     {
220         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
221         typedef mock_disposer disposer;
222         typedef item_cmp compare;
223         typedef ci::skip_list::turbo24 random_level_generator;
224     };
225
226     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
227
228     set_type s;
229     this->test( s );
230 }
231
232 TYPED_TEST_P( IntrusiveSkipListSet, base_turbo16 )
233 {
234     typedef typename TestFixture::rcu_type rcu_type;
235     typedef typename TestFixture::base_item_type base_item_type;
236     typedef typename TestFixture::mock_disposer mock_disposer;
237     typedef typename TestFixture::template cmp<base_item_type> item_cmp;
238
239     struct traits: public ci::skip_list::traits
240     {
241         typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
242         typedef mock_disposer disposer;
243         typedef item_cmp compare;
244         typedef ci::skip_list::turbo16 random_level_generator;
245     };
246
247     typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
248
249     set_type s;
250     this->test( s );
251 }
252
253
254 TYPED_TEST_P( IntrusiveSkipListSet, member_cmp )
255 {
256     typedef typename TestFixture::rcu_type rcu_type;
257     typedef typename TestFixture::member_item_type member_item_type;
258     typedef typename TestFixture::mock_disposer mock_disposer;
259     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
260
261     struct traits : public ci::skip_list::traits
262     {
263         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
264         typedef mock_disposer disposer;
265         typedef item_cmp compare;
266     };
267
268     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
269
270     set_type s;
271     this->test( s );
272 }
273
274 TYPED_TEST_P( IntrusiveSkipListSet, member_less )
275 {
276     typedef typename TestFixture::rcu_type rcu_type;
277     typedef typename TestFixture::member_item_type member_item_type;
278     typedef typename TestFixture::mock_disposer mock_disposer;
279     typedef typename TestFixture::template less<member_item_type> less_predicate;
280     //typedef typename TestFixture::hash_int hash_int;
281
282     struct traits : public ci::skip_list::traits
283     {
284         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
285         typedef mock_disposer disposer;
286         typedef less_predicate less;
287         typedef cds::atomicity::item_counter item_counter;
288         typedef ci::opt::v::sequential_consistent memory_model;
289     };
290
291     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
292
293     set_type s;
294     this->test( s );
295 }
296
297 TYPED_TEST_P( IntrusiveSkipListSet, member_cmpmix )
298 {
299     typedef typename TestFixture::rcu_type rcu_type;
300     typedef typename TestFixture::member_item_type member_item_type;
301     typedef typename TestFixture::mock_disposer mock_disposer;
302     typedef typename TestFixture::template less<member_item_type> less_predicate;
303     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
304
305     struct traits : public ci::skip_list::traits
306     {
307         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
308         typedef mock_disposer disposer;
309         typedef item_cmp compare;
310         typedef less_predicate less;
311         typedef ci::skip_list::stat<> stat;
312     };
313
314     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
315
316     set_type s;
317     this->test( s );
318 }
319
320 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift32 )
321 {
322     typedef typename TestFixture::rcu_type rcu_type;
323     typedef typename TestFixture::member_item_type member_item_type;
324     typedef typename TestFixture::mock_disposer mock_disposer;
325     typedef typename TestFixture::template less<member_item_type> less_predicate;
326     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
327
328     struct traits : public ci::skip_list::traits
329     {
330         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
331         typedef mock_disposer disposer;
332         typedef item_cmp compare;
333         typedef less_predicate less;
334         typedef ci::skip_list::stat<> stat;
335         typedef ci::skip_list::xorshift32 random_level_generator;
336     };
337
338     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
339
340     set_type s;
341     this->test( s );
342 }
343
344 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift24 )
345 {
346     typedef typename TestFixture::rcu_type rcu_type;
347     typedef typename TestFixture::member_item_type member_item_type;
348     typedef typename TestFixture::mock_disposer mock_disposer;
349     typedef typename TestFixture::template less<member_item_type> less_predicate;
350     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
351
352     struct traits: public ci::skip_list::traits
353     {
354         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
355         typedef mock_disposer disposer;
356         typedef item_cmp compare;
357         typedef less_predicate less;
358         typedef ci::skip_list::stat<> stat;
359         typedef ci::skip_list::xorshift24 random_level_generator;
360     };
361
362     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
363
364     set_type s;
365     this->test( s );
366 }
367
368 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift16 )
369 {
370     typedef typename TestFixture::rcu_type rcu_type;
371     typedef typename TestFixture::member_item_type member_item_type;
372     typedef typename TestFixture::mock_disposer mock_disposer;
373     typedef typename TestFixture::template less<member_item_type> less_predicate;
374     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
375
376     struct traits: public ci::skip_list::traits
377     {
378         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
379         typedef mock_disposer disposer;
380         typedef item_cmp compare;
381         typedef less_predicate less;
382         typedef ci::skip_list::stat<> stat;
383         typedef ci::skip_list::xorshift16 random_level_generator;
384     };
385
386     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
387
388     set_type s;
389     this->test( s );
390 }
391
392 TYPED_TEST_P( IntrusiveSkipListSet, member_turbo32 )
393 {
394     typedef typename TestFixture::rcu_type rcu_type;
395     typedef typename TestFixture::member_item_type member_item_type;
396     typedef typename TestFixture::mock_disposer mock_disposer;
397     typedef typename TestFixture::template less<member_item_type> less_predicate;
398     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
399
400     struct traits: public ci::skip_list::traits
401     {
402         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
403         typedef mock_disposer disposer;
404         typedef item_cmp compare;
405         typedef less_predicate less;
406         typedef ci::skip_list::stat<> stat;
407         typedef ci::skip_list::turbo32 random_level_generator;
408     };
409
410     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
411
412     set_type s;
413     this->test( s );
414 }
415
416 TYPED_TEST_P( IntrusiveSkipListSet, member_turbo24 )
417 {
418     typedef typename TestFixture::rcu_type rcu_type;
419     typedef typename TestFixture::member_item_type member_item_type;
420     typedef typename TestFixture::mock_disposer mock_disposer;
421     typedef typename TestFixture::template less<member_item_type> less_predicate;
422     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
423
424     struct traits: public ci::skip_list::traits
425     {
426         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
427         typedef mock_disposer disposer;
428         typedef item_cmp compare;
429         typedef less_predicate less;
430         typedef ci::skip_list::stat<> stat;
431         typedef ci::skip_list::turbo24 random_level_generator;
432     };
433
434     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
435
436     set_type s;
437     this->test( s );
438 }
439
440 TYPED_TEST_P( IntrusiveSkipListSet, member_turbo16 )
441 {
442     typedef typename TestFixture::rcu_type rcu_type;
443     typedef typename TestFixture::member_item_type member_item_type;
444     typedef typename TestFixture::mock_disposer mock_disposer;
445     typedef typename TestFixture::template less<member_item_type> less_predicate;
446     typedef typename TestFixture::template cmp<member_item_type> item_cmp;
447
448     struct traits: public ci::skip_list::traits
449     {
450         typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
451         typedef mock_disposer disposer;
452         typedef item_cmp compare;
453         typedef less_predicate less;
454         typedef ci::skip_list::stat<> stat;
455         typedef ci::skip_list::turbo16 random_level_generator;
456     };
457
458     typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
459
460     set_type s;
461     this->test( s );
462 }
463
464
465 // All test names should be written on single line, otherwise a runtime error will be encountered like as
466 // "No test named <test_name> can be found in this test case"
467 REGISTER_TYPED_TEST_CASE_P( IntrusiveSkipListSet,
468     base_cmp, base_less, base_cmpmix, base_xorshift32, base_xorshift24, base_xorshift16, base_turbo32, base_turbo24, base_turbo16, member_cmp, member_less, member_cmpmix, member_xorshift32, member_xorshift24, member_xorshift16, member_turbo32, member_turbo24, member_turbo16
469 );
470
471
472 #endif // CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H
473