Extending intrusive MichaelSet<HP> to IterableList
[libcds.git] / test / unit / intrusive-set / test_intrusive_michael_michael_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-2016
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_MICHAEL_MICHAEL_RCU_H
31 #define CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_MICHAEL_RCU_H
32
33 #include "test_intrusive_set_rcu.h"
34 #include <cds/intrusive/michael_list_rcu.h>
35 #include <cds/intrusive/michael_set_rcu.h>
36
37 namespace ci = cds::intrusive;
38
39 template <class RCU>
40 class IntrusiveMichaelSet: public cds_test::intrusive_set_rcu
41 {
42     typedef cds_test::intrusive_set_rcu base_class;
43 public:
44     typedef cds::urcu::gc<RCU> rcu_type;
45     typedef typename base_class::base_int_item< ci::michael_list::node<rcu_type>>   base_item_type;
46     typedef typename base_class::member_int_item< ci::michael_list::node<rcu_type>> member_item_type;
47
48 protected:
49     void SetUp()
50     {
51         RCU::Construct();
52         cds::threading::Manager::attachThread();
53     }
54
55     void TearDown()
56     {
57         cds::threading::Manager::detachThread();
58         RCU::Destruct();
59     }
60 };
61
62 TYPED_TEST_CASE_P( IntrusiveMichaelSet );
63
64 TYPED_TEST_P( IntrusiveMichaelSet, base_cmp )
65 {
66     typedef typename TestFixture::rcu_type rcu_type;
67     typedef typename TestFixture::base_item_type base_item_type;
68     typedef typename TestFixture::mock_disposer mock_disposer;
69     typedef typename TestFixture::template cmp<base_item_type> cmp;
70     typedef typename TestFixture::hash_int hash_int;
71
72     typedef ci::MichaelList< rcu_type
73         , base_item_type
74         , typename ci::michael_list::make_traits<
75             ci::opt::hook< ci::michael_list::base_hook< ci::opt::gc< rcu_type > > >
76             , ci::opt::compare< cmp >
77             , ci::opt::disposer< mock_disposer >
78         >::type
79     > bucket_type;
80
81     typedef ci::MichaelHashSet< rcu_type, bucket_type,
82         typename ci::michael_set::make_traits<
83             ci::opt::hash< hash_int >
84         >::type
85     > set_type;
86
87     set_type s( TestFixture::kSize, 2 );
88     this->test( s );
89 }
90
91 TYPED_TEST_P( IntrusiveMichaelSet, base_less )
92 {
93     typedef typename TestFixture::rcu_type rcu_type;
94     typedef typename TestFixture::base_item_type base_item_type;
95     typedef typename TestFixture::mock_disposer mock_disposer;
96     typedef typename TestFixture::template less<base_item_type> less;
97     typedef typename TestFixture::hash_int hash_int;
98
99     typedef ci::MichaelList< rcu_type
100         , base_item_type
101         , typename ci::michael_list::make_traits<
102             ci::opt::hook< ci::michael_list::base_hook< ci::opt::gc< rcu_type >>>
103             , ci::opt::less< less >
104             , ci::opt::disposer< mock_disposer >
105         >::type
106     > bucket_type;
107
108     typedef ci::MichaelHashSet< rcu_type, bucket_type,
109         typename ci::michael_set::make_traits<
110             ci::opt::hash< hash_int >
111         >::type
112     > set_type;
113
114     set_type s( TestFixture::kSize, 2 );
115     this->test( s );
116 }
117
118 TYPED_TEST_P( IntrusiveMichaelSet, base_cmpmix )
119 {
120     typedef typename TestFixture::rcu_type rcu_type;
121     typedef typename TestFixture::base_item_type base_item_type;
122     typedef typename TestFixture::mock_disposer mock_disposer;
123     typedef typename TestFixture::hash_int hash_int;
124
125     struct list_traits : public ci::michael_list::traits
126     {
127         typedef ci::michael_list::base_hook< ci::opt::gc<rcu_type>> hook;
128         typedef typename TestFixture::template less<base_item_type> less;
129         typedef typename TestFixture::template cmp<base_item_type> compare;
130         typedef mock_disposer disposer;
131     };
132     typedef ci::MichaelList< rcu_type, base_item_type, list_traits > bucket_type;
133
134     struct set_traits : public ci::michael_set::traits
135     {
136         typedef hash_int hash;
137         typedef typename TestFixture::simple_item_counter item_counter;
138     };
139     typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
140
141     set_type s( TestFixture::kSize, 2 );
142     this->test( s );
143 }
144
145 TYPED_TEST_P( IntrusiveMichaelSet, base_stat )
146 {
147     typedef typename TestFixture::rcu_type rcu_type;
148     typedef typename TestFixture::base_item_type base_item_type;
149     typedef typename TestFixture::mock_disposer mock_disposer;
150     typedef typename TestFixture::hash_int hash_int;
151
152     struct list_traits: public ci::michael_list::traits
153     {
154         typedef ci::michael_list::base_hook< ci::opt::gc<rcu_type>> hook;
155         typedef typename TestFixture::template less<base_item_type> less;
156         typedef typename TestFixture::template cmp<base_item_type> compare;
157         typedef mock_disposer disposer;
158         typedef ci::michael_list::stat<> stat;
159     };
160     typedef ci::MichaelList< rcu_type, base_item_type, list_traits > bucket_type;
161
162     struct set_traits: public ci::michael_set::traits
163     {
164         typedef hash_int hash;
165         typedef typename TestFixture::simple_item_counter item_counter;
166     };
167     typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
168
169     set_type s( TestFixture::kSize, 2 );
170     this->test( s );
171 }
172
173 TYPED_TEST_P( IntrusiveMichaelSet, base_wrapped_stat )
174 {
175     typedef typename TestFixture::rcu_type rcu_type;
176     typedef typename TestFixture::base_item_type base_item_type;
177     typedef typename TestFixture::mock_disposer mock_disposer;
178     typedef typename TestFixture::hash_int hash_int;
179
180     struct list_traits: public ci::michael_list::traits
181     {
182         typedef ci::michael_list::base_hook< ci::opt::gc<rcu_type>> hook;
183         typedef typename TestFixture::template less<base_item_type> less;
184         typedef typename TestFixture::template cmp<base_item_type> compare;
185         typedef mock_disposer disposer;
186         typedef ci::michael_list::wrapped_stat<> stat;
187     };
188     typedef ci::MichaelList< rcu_type, base_item_type, list_traits > bucket_type;
189
190     struct set_traits: public ci::michael_set::traits
191     {
192         typedef hash_int hash;
193         typedef typename TestFixture::simple_item_counter item_counter;
194     };
195     typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
196
197     set_type s( TestFixture::kSize, 2 );
198     this->test( s );
199 }
200
201 TYPED_TEST_P( IntrusiveMichaelSet, member_cmp )
202 {
203     typedef typename TestFixture::rcu_type rcu_type;
204     typedef typename TestFixture::member_item_type member_item_type;
205     typedef typename TestFixture::mock_disposer mock_disposer;
206     typedef typename TestFixture::template cmp<member_item_type> cmp;
207     typedef typename TestFixture::hash_int hash_int;
208
209     typedef ci::MichaelList< rcu_type
210         , member_item_type
211         , typename ci::michael_list::make_traits<
212             ci::opt::hook< ci::michael_list::member_hook<
213                 offsetof( member_item_type, hMember ),
214                 ci::opt::gc<rcu_type>
215             >>
216             , ci::opt::compare< cmp >
217             , ci::opt::disposer< mock_disposer >
218         >::type
219     >    bucket_type;
220
221     typedef ci::MichaelHashSet< rcu_type, bucket_type,
222         typename ci::michael_set::make_traits<
223             ci::opt::hash< hash_int >
224         >::type
225     > set_type;
226
227     set_type s( TestFixture::kSize, 2 );
228     this->test( s );
229 }
230
231 TYPED_TEST_P( IntrusiveMichaelSet, member_less )
232 {
233     typedef typename TestFixture::rcu_type rcu_type;
234     typedef typename TestFixture::member_item_type member_item_type;
235     typedef typename TestFixture::mock_disposer mock_disposer;
236     typedef typename TestFixture::template less<member_item_type> less;
237     typedef typename TestFixture::hash_int hash_int;
238
239     typedef ci::MichaelList< rcu_type
240         , member_item_type
241         , typename ci::michael_list::make_traits<
242             ci::opt::hook< ci::michael_list::member_hook<
243                 offsetof( member_item_type, hMember ),
244                 ci::opt::gc<rcu_type>
245             > >
246             , ci::opt::less< less >
247             , ci::opt::disposer< mock_disposer >
248         >::type
249     > bucket_type;
250
251     typedef ci::MichaelHashSet< rcu_type, bucket_type,
252         typename ci::michael_set::make_traits<
253             ci::opt::hash< hash_int >
254         >::type
255     > set_type;
256
257     set_type s( TestFixture::kSize, 2 );
258     this->test( s );
259 }
260
261 TYPED_TEST_P( IntrusiveMichaelSet, member_cmpmix )
262 {
263     typedef typename TestFixture::rcu_type rcu_type;
264     typedef typename TestFixture::member_item_type member_item_type;
265     typedef typename TestFixture::mock_disposer mock_disposer;
266     typedef typename TestFixture::hash_int hash_int;
267
268     struct list_traits : public ci::michael_list::traits
269     {
270         typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
271         typedef typename TestFixture::template less<member_item_type> less;
272         typedef typename TestFixture::template cmp<member_item_type> compare;
273         typedef mock_disposer disposer;
274     };
275     typedef ci::MichaelList< rcu_type, member_item_type, list_traits > bucket_type;
276
277     struct set_traits : public ci::michael_set::traits
278     {
279         typedef hash_int hash;
280         typedef typename TestFixture::simple_item_counter item_counter;
281     };
282     typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
283
284     set_type s( TestFixture::kSize, 2 );
285     this->test( s );
286 }
287
288 TYPED_TEST_P( IntrusiveMichaelSet, member_stat )
289 {
290     typedef typename TestFixture::rcu_type rcu_type;
291     typedef typename TestFixture::member_item_type member_item_type;
292     typedef typename TestFixture::mock_disposer mock_disposer;
293     typedef typename TestFixture::hash_int hash_int;
294
295     struct list_traits: public ci::michael_list::traits
296     {
297         typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
298         typedef typename TestFixture::template cmp<member_item_type> compare;
299         typedef mock_disposer disposer;
300         typedef ci::michael_list::stat<> stat;
301     };
302     typedef ci::MichaelList< rcu_type, member_item_type, list_traits > bucket_type;
303
304     struct set_traits: public ci::michael_set::traits
305     {
306         typedef hash_int hash;
307         typedef typename TestFixture::simple_item_counter item_counter;
308     };
309     typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
310
311     set_type s( TestFixture::kSize, 2 );
312     this->test( s );
313 }
314
315 TYPED_TEST_P( IntrusiveMichaelSet, member_wrapped_stat )
316 {
317     typedef typename TestFixture::rcu_type rcu_type;
318     typedef typename TestFixture::member_item_type member_item_type;
319     typedef typename TestFixture::mock_disposer mock_disposer;
320     typedef typename TestFixture::hash_int hash_int;
321
322     struct list_traits: public ci::michael_list::traits
323     {
324         typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
325         typedef typename TestFixture::template cmp<member_item_type> compare;
326         typedef mock_disposer disposer;
327         typedef ci::michael_list::wrapped_stat<> stat;
328     };
329     typedef ci::MichaelList< rcu_type, member_item_type, list_traits > bucket_type;
330
331     struct set_traits: public ci::michael_set::traits
332     {
333         typedef hash_int hash;
334         typedef typename TestFixture::simple_item_counter item_counter;
335     };
336     typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
337
338     set_type s( TestFixture::kSize, 2 );
339     this->test( s );
340 }
341
342 // GCC 5: All test names should be written on single line, otherwise a runtime error will be encountered like as
343 // "No test named <test_name> can be found in this test case"
344 REGISTER_TYPED_TEST_CASE_P( IntrusiveMichaelSet,
345     base_cmp, base_less, base_cmpmix, base_stat, base_wrapped_stat, member_cmp, member_less, member_cmpmix, member_stat, member_wrapped_stat
346 );
347
348
349 #endif // CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_MICHAEL_RCU_H
350