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