2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
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.
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.
30 #ifndef CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H
31 #define CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H
33 #include "test_intrusive_set_rcu.h"
34 #include <cds/intrusive/skip_list_rcu.h>
36 namespace ci = cds::intrusive;
39 class IntrusiveSkipListSet: public cds_test::intrusive_set_rcu
41 typedef cds_test::intrusive_set_rcu base_class;
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;
51 cds::threading::Manager::attachThread();
56 cds::threading::Manager::detachThread();
61 TYPED_TEST_CASE_P( IntrusiveSkipListSet );
63 TYPED_TEST_P( IntrusiveSkipListSet, base_cmp )
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> cmp;
70 struct traits : public ci::skip_list::traits
72 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
73 typedef mock_disposer disposer;
77 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
83 TYPED_TEST_P( IntrusiveSkipListSet, base_less )
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;
90 struct traits : public ci::skip_list::traits
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;
98 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
104 TYPED_TEST_P( IntrusiveSkipListSet, base_cmpmix )
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> cmp;
110 typedef typename TestFixture::template less<base_item_type> less_predicate;
112 struct traits : public ci::skip_list::traits
114 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
115 typedef mock_disposer disposer;
117 typedef less_predicate less;
118 typedef ci::skip_list::stat<> stat;
121 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
127 TYPED_TEST_P( IntrusiveSkipListSet, base_xorshift32 )
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> cmp;
134 struct traits : public ci::skip_list::traits
136 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
137 typedef mock_disposer disposer;
139 typedef ci::skip_list::xorshift32 random_level_generator;
142 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
148 TYPED_TEST_P( IntrusiveSkipListSet, base_xorshift24 )
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> cmp;
155 struct traits: public ci::skip_list::traits
157 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
158 typedef mock_disposer disposer;
160 typedef ci::skip_list::xorshift24 random_level_generator;
163 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
169 TYPED_TEST_P( IntrusiveSkipListSet, base_xorshift16 )
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> cmp;
176 struct traits: public ci::skip_list::traits
178 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
179 typedef mock_disposer disposer;
181 typedef ci::skip_list::xorshift16 random_level_generator;
184 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
190 TYPED_TEST_P( IntrusiveSkipListSet, base_turbo32 )
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> cmp;
197 struct traits: public ci::skip_list::traits
199 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
200 typedef mock_disposer disposer;
202 typedef ci::skip_list::turbo32 random_level_generator;
205 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
211 TYPED_TEST_P( IntrusiveSkipListSet, base_turbo24 )
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> cmp;
218 struct traits: public ci::skip_list::traits
220 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
221 typedef mock_disposer disposer;
223 typedef ci::skip_list::turbo24 random_level_generator;
226 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
232 TYPED_TEST_P( IntrusiveSkipListSet, base_turbo16 )
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> cmp;
239 struct traits: public ci::skip_list::traits
241 typedef ci::skip_list::base_hook< ci::opt::gc< rcu_type >> hook;
242 typedef mock_disposer disposer;
244 typedef ci::skip_list::turbo16 random_level_generator;
247 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
254 TYPED_TEST_P( IntrusiveSkipListSet, member_cmp )
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> cmp;
261 struct traits : public ci::skip_list::traits
263 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
264 typedef mock_disposer disposer;
268 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
274 TYPED_TEST_P( IntrusiveSkipListSet, member_less )
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;
282 struct traits : public ci::skip_list::traits
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;
291 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
297 TYPED_TEST_P( IntrusiveSkipListSet, member_cmpmix )
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> cmp;
305 struct traits : public ci::skip_list::traits
307 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
308 typedef mock_disposer disposer;
310 typedef less_predicate less;
311 typedef ci::skip_list::stat<> stat;
314 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
320 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift32 )
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> cmp;
328 struct traits : public ci::skip_list::traits
330 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
331 typedef mock_disposer disposer;
333 typedef less_predicate less;
334 typedef ci::skip_list::stat<> stat;
335 typedef ci::skip_list::xorshift32 random_level_generator;
338 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
344 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift24 )
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> cmp;
352 struct traits: public ci::skip_list::traits
354 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
355 typedef mock_disposer disposer;
357 typedef less_predicate less;
358 typedef ci::skip_list::stat<> stat;
359 typedef ci::skip_list::xorshift24 random_level_generator;
362 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
368 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift16 )
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> cmp;
376 struct traits: public ci::skip_list::traits
378 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
379 typedef mock_disposer disposer;
381 typedef less_predicate less;
382 typedef ci::skip_list::stat<> stat;
383 typedef ci::skip_list::xorshift16 random_level_generator;
386 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
392 TYPED_TEST_P( IntrusiveSkipListSet, member_turbo32 )
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> cmp;
400 struct traits: public ci::skip_list::traits
402 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
403 typedef mock_disposer disposer;
405 typedef less_predicate less;
406 typedef ci::skip_list::stat<> stat;
407 typedef ci::skip_list::turbo32 random_level_generator;
410 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
416 TYPED_TEST_P( IntrusiveSkipListSet, member_turbo24 )
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> cmp;
424 struct traits: public ci::skip_list::traits
426 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
427 typedef mock_disposer disposer;
429 typedef less_predicate less;
430 typedef ci::skip_list::stat<> stat;
431 typedef ci::skip_list::turbo24 random_level_generator;
434 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
440 TYPED_TEST_P( IntrusiveSkipListSet, member_turbo16 )
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> cmp;
448 struct traits: public ci::skip_list::traits
450 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
451 typedef mock_disposer disposer;
453 typedef less_predicate less;
454 typedef ci::skip_list::stat<> stat;
455 typedef ci::skip_list::turbo16 random_level_generator;
458 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
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
472 #endif // CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H