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