2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
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_xorshift )
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::xorshift random_level_generator;
142 typedef ci::SkipListSet< rcu_type, base_item_type, traits > set_type;
149 TYPED_TEST_P( IntrusiveSkipListSet, member_cmp )
151 typedef typename TestFixture::rcu_type rcu_type;
152 typedef typename TestFixture::member_item_type member_item_type;
153 typedef typename TestFixture::mock_disposer mock_disposer;
154 typedef typename TestFixture::template cmp<member_item_type> cmp;
156 struct traits : public ci::skip_list::traits
158 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
159 typedef mock_disposer disposer;
163 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
169 TYPED_TEST_P( IntrusiveSkipListSet, member_less )
171 typedef typename TestFixture::rcu_type rcu_type;
172 typedef typename TestFixture::member_item_type member_item_type;
173 typedef typename TestFixture::mock_disposer mock_disposer;
174 typedef typename TestFixture::template less<member_item_type> less_predicate;
175 //typedef typename TestFixture::hash_int hash_int;
177 struct traits : public ci::skip_list::traits
179 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
180 typedef mock_disposer disposer;
181 typedef less_predicate less;
182 typedef cds::atomicity::item_counter item_counter;
183 typedef ci::opt::v::sequential_consistent memory_model;
186 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
192 TYPED_TEST_P( IntrusiveSkipListSet, member_cmpmix )
194 typedef typename TestFixture::rcu_type rcu_type;
195 typedef typename TestFixture::member_item_type member_item_type;
196 typedef typename TestFixture::mock_disposer mock_disposer;
197 typedef typename TestFixture::template less<member_item_type> less_predicate;
198 typedef typename TestFixture::template cmp<member_item_type> cmp;
200 struct traits : public ci::skip_list::traits
202 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
203 typedef mock_disposer disposer;
205 typedef less_predicate less;
206 typedef ci::skip_list::stat<> stat;
209 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
215 TYPED_TEST_P( IntrusiveSkipListSet, member_xorshift )
217 typedef typename TestFixture::rcu_type rcu_type;
218 typedef typename TestFixture::member_item_type member_item_type;
219 typedef typename TestFixture::mock_disposer mock_disposer;
220 typedef typename TestFixture::template less<member_item_type> less_predicate;
221 typedef typename TestFixture::template cmp<member_item_type> cmp;
223 struct traits : public ci::skip_list::traits
225 typedef ci::skip_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
226 typedef mock_disposer disposer;
228 typedef less_predicate less;
229 typedef ci::skip_list::stat<> stat;
230 typedef ci::skip_list::xorshift random_level_generator;
233 typedef ci::SkipListSet< rcu_type, member_item_type, traits > set_type;
240 // GCC 5: All test names should be written on single line, otherwise a runtime error will be encountered like as
241 // "No test named <test_name> can be found in this test case"
242 REGISTER_TYPED_TEST_CASE_P( IntrusiveSkipListSet,
243 base_cmp, base_less, base_cmpmix, base_xorshift, member_cmp, member_less, member_cmpmix, member_xorshift
247 #endif // CDSUNIT_SET_TEST_INTRUSIVE_SKIPLIST_RCU_H