Added copyright and license
[libcds.git] / tests / test-hdr / set / hdr_intrusive_skiplist_rcu_shb_member.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 "set/hdr_intrusive_skiplist_set_rcu.h"
32
33 #include <cds/urcu/signal_buffered.h>
34 #include <cds/intrusive/skip_list_rcu.h>
35 #include "map/print_skiplist_stat.h"
36
37 namespace set {
38 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
39     namespace {
40         typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
41     }
42 #endif
43
44     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp()
45     {
46 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
47         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
48
49         typedef ci::SkipListSet< rcu_type, item,
50             ci::skip_list::make_traits<
51                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
52                 ,co::compare< cmp<item> >
53                 ,ci::opt::disposer< faked_disposer >
54                 ,co::item_counter< cds::atomicity::item_counter >
55             >::type
56         >   set_type;
57
58         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
59 #endif
60     }
61
62     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less()
63     {
64 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
65         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
66
67         typedef ci::SkipListSet< rcu_type, item,
68             ci::skip_list::make_traits<
69                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
70                 ,co::less< less<item> >
71                 ,ci::opt::disposer< faked_disposer >
72                 ,co::item_counter< cds::atomicity::item_counter >
73             >::type
74         >   set_type;
75
76         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
77 #endif
78     }
79
80     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix()
81     {
82 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
83         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
84
85         typedef ci::SkipListSet< rcu_type, item,
86             ci::skip_list::make_traits<
87                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
88                 ,co::less< less<item> >
89                 ,ci::opt::disposer< faked_disposer >
90                 ,co::compare< cmp<item> >
91                 ,co::item_counter< cds::atomicity::item_counter >
92             >::type
93         >   set_type;
94
95         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
96 #endif
97     }
98
99     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_stat()
100     {
101 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
102         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
103
104         typedef ci::SkipListSet< rcu_type, item,
105             ci::skip_list::make_traits<
106                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
107                 ,co::compare< cmp<item> >
108                 ,ci::opt::disposer< faked_disposer >
109                 ,co::stat< ci::skip_list::stat<> >
110                 ,co::item_counter< cds::atomicity::item_counter >
111             >::type
112         >   set_type;
113
114         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
115 #endif
116     }
117
118     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_stat()
119     {
120 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
121         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
122
123         typedef ci::SkipListSet< rcu_type, item,
124             ci::skip_list::make_traits<
125                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
126                 ,co::less< less<item> >
127                 ,ci::opt::disposer< faked_disposer >
128                 ,co::stat< ci::skip_list::stat<> >
129                 ,co::item_counter< cds::atomicity::item_counter >
130             >::type
131         >   set_type;
132
133         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
134 #endif
135     }
136
137     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_stat()
138     {
139 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
140         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
141
142         typedef ci::SkipListSet< rcu_type, item,
143             ci::skip_list::make_traits<
144                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
145                 ,co::less< less<item> >
146                 ,ci::opt::disposer< faked_disposer >
147                 ,co::compare< cmp<item> >
148                 ,co::stat< ci::skip_list::stat<> >
149                 ,co::item_counter< cds::atomicity::item_counter >
150             >::type
151         >   set_type;
152
153         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
154 #endif
155     }
156
157     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_xorshift()
158     {
159 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
160         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
161
162         typedef ci::SkipListSet< rcu_type, item,
163             ci::skip_list::make_traits<
164                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
165                 ,co::compare< cmp<item> >
166                 ,ci::opt::disposer< faked_disposer >
167                 ,co::item_counter< cds::atomicity::item_counter >
168                 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
169             >::type
170         >   set_type;
171
172         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
173 #endif
174     }
175
176     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_xorshift()
177     {
178 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
179         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
180
181         typedef ci::SkipListSet< rcu_type, item,
182             ci::skip_list::make_traits<
183                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
184                 ,co::less< less<item> >
185                 ,ci::opt::disposer< faked_disposer >
186                 ,co::item_counter< cds::atomicity::item_counter >
187                 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
188             >::type
189         >   set_type;
190
191         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
192 #endif
193     }
194
195     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_xorshift()
196     {
197 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
198         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
199
200         typedef ci::SkipListSet< rcu_type, item,
201             ci::skip_list::make_traits<
202                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
203                 ,co::less< less<item> >
204                 ,ci::opt::disposer< faked_disposer >
205                 ,co::compare< cmp<item> >
206                 ,co::item_counter< cds::atomicity::item_counter >
207                 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
208             >::type
209         >   set_type;
210
211         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
212 #endif
213     }
214
215     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_xorshift_stat()
216     {
217 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
218         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
219
220         typedef ci::SkipListSet< rcu_type, item,
221             ci::skip_list::make_traits<
222                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
223                 ,co::compare< cmp<item> >
224                 ,ci::opt::disposer< faked_disposer >
225                 ,co::item_counter< cds::atomicity::item_counter >
226                 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
227                 ,co::stat< ci::skip_list::stat<> >
228             >::type
229         >   set_type;
230
231         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
232 #endif
233     }
234
235     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_xorshift_stat()
236     {
237 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
238         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
239
240         typedef ci::SkipListSet< rcu_type, item,
241             ci::skip_list::make_traits<
242                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
243                 ,co::less< less<item> >
244                 ,ci::opt::disposer< faked_disposer >
245                 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
246                 ,co::stat< ci::skip_list::stat<> >
247                 ,co::item_counter< cds::atomicity::item_counter >
248             >::type
249         >   set_type;
250
251         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
252 #endif
253     }
254
255     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_xorshift_stat()
256     {
257 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
258         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
259
260         typedef ci::SkipListSet< rcu_type, item,
261             ci::skip_list::make_traits<
262                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
263                 ,co::less< less<item> >
264                 ,ci::opt::disposer< faked_disposer >
265                 ,co::compare< cmp<item> >
266                 ,co::item_counter< cds::atomicity::item_counter >
267                 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
268                 ,co::stat< ci::skip_list::stat<> >
269             >::type
270         >   set_type;
271
272         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
273 #endif
274     }
275
276
277     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_pascal()
278     {
279 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
280         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
281
282         typedef ci::SkipListSet< rcu_type, item,
283             ci::skip_list::make_traits<
284                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
285                 ,co::compare< cmp<item> >
286                 ,ci::opt::disposer< faked_disposer >
287                 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
288                 ,co::item_counter< cds::atomicity::item_counter >
289             >::type
290         >   set_type;
291
292         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
293 #endif
294     }
295
296     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_pascal()
297     {
298 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
299         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
300
301         typedef ci::SkipListSet< rcu_type, item,
302             ci::skip_list::make_traits<
303                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
304                 ,co::less< less<item> >
305                 ,ci::opt::disposer< faked_disposer >
306                 ,co::item_counter< cds::atomicity::item_counter >
307                 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
308             >::type
309         >   set_type;
310
311         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
312 #endif
313     }
314
315     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_pascal()
316     {
317 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
318         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
319
320         typedef ci::SkipListSet< rcu_type, item,
321             ci::skip_list::make_traits<
322                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
323                 ,co::less< less<item> >
324                 ,ci::opt::disposer< faked_disposer >
325                 ,co::compare< cmp<item> >
326                 ,co::item_counter< cds::atomicity::item_counter >
327                 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
328             >::type
329         >   set_type;
330
331         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
332 #endif
333     }
334
335     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_pascal_stat()
336     {
337 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
338         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
339
340         typedef ci::SkipListSet< rcu_type, item,
341             ci::skip_list::make_traits<
342                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
343                 ,co::compare< cmp<item> >
344                 ,ci::opt::disposer< faked_disposer >
345                 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
346                 ,co::stat< ci::skip_list::stat<> >
347                 ,co::item_counter< cds::atomicity::item_counter >
348             >::type
349         >   set_type;
350
351         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
352 #endif
353     }
354
355     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_pascal_stat()
356     {
357 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
358         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
359
360         typedef ci::SkipListSet< rcu_type, item,
361             ci::skip_list::make_traits<
362                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
363                 ,co::less< less<item> >
364                 ,ci::opt::disposer< faked_disposer >
365                 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
366                 ,co::stat< ci::skip_list::stat<> >
367                 ,co::item_counter< cds::atomicity::item_counter >
368             >::type
369         >   set_type;
370
371         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
372 #endif
373     }
374
375     void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_pascal_stat()
376     {
377 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
378         typedef member_int_item< ci::skip_list::node< rcu_type> > item;
379
380         typedef ci::SkipListSet< rcu_type, item,
381             ci::skip_list::make_traits<
382                 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
383                 ,co::less< less<item> >
384                 ,ci::opt::disposer< faked_disposer >
385                 ,co::compare< cmp<item> >
386                 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
387                 ,co::stat< ci::skip_list::stat<> >
388                 ,co::item_counter< cds::atomicity::item_counter >
389             >::type
390         >   set_type;
391
392         test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
393 #endif
394     }
395
396 } // namespace set