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.
31 #include "set/hdr_intrusive_set.h"
32 #include <cds/urcu/general_instant.h>
33 #include <cds/intrusive/lazy_list_rcu.h>
34 #include <cds/intrusive/split_list_rcu.h>
38 typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
41 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmp_lazy()
43 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
44 typedef ci::LazyList< rcu_type
46 ,ci::lazy_list::make_traits<
47 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
48 ,co::compare< cmp<item> >
49 ,ci::opt::disposer< faked_disposer >
53 typedef ci::SplitListSet< rcu_type, ord_list,
54 ci::split_list::make_traits<
56 ,ci::split_list::dynamic_bucket_table<true>
57 ,co::memory_model<co::v::relaxed_ordering>
60 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
65 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_less_lazy()
67 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
68 typedef ci::LazyList< rcu_type
70 ,ci::lazy_list::make_traits<
71 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
72 ,co::less< less<item> >
73 ,ci::opt::disposer< faked_disposer >
77 typedef ci::SplitListSet< rcu_type, ord_list,
78 ci::split_list::make_traits<
80 ,co::memory_model<co::v::sequential_consistent>
83 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
88 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmpmix_lazy()
90 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
91 typedef ci::LazyList< rcu_type
93 ,ci::lazy_list::make_traits<
94 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
95 ,co::less< less<item> >
96 ,co::compare< cmp<item> >
97 ,ci::opt::disposer< faked_disposer >
101 typedef ci::SplitListSet< rcu_type, ord_list,
102 ci::split_list::make_traits<
104 ,co::item_counter< simple_item_counter >
105 ,ci::split_list::dynamic_bucket_table<true>
108 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
113 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmp_lazy()
115 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
116 typedef ci::LazyList< rcu_type
118 ,ci::lazy_list::make_traits<
119 ci::opt::hook< ci::lazy_list::member_hook<
120 offsetof( item, hMember ),
123 ,co::compare< cmp<item> >
124 ,ci::opt::disposer< faked_disposer >
128 typedef ci::SplitListSet< rcu_type, ord_list,
129 ci::split_list::make_traits<
131 ,co::memory_model<co::v::relaxed_ordering>
134 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
139 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_less_lazy()
141 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
142 typedef ci::LazyList< rcu_type
144 ,ci::lazy_list::make_traits<
145 ci::opt::hook< ci::lazy_list::member_hook<
146 offsetof( item, hMember ),
149 ,co::less< less<item> >
150 ,ci::opt::disposer< faked_disposer >
154 typedef ci::SplitListSet< rcu_type, ord_list,
155 ci::split_list::make_traits<
157 ,co::memory_model<co::v::sequential_consistent>
160 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
165 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmpmix_lazy()
167 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
168 typedef ci::LazyList< rcu_type
170 ,ci::lazy_list::make_traits<
171 ci::opt::hook< ci::lazy_list::member_hook<
172 offsetof( item, hMember ),
175 ,co::compare< cmp<item> >
176 ,co::less< less<item> >
177 ,ci::opt::disposer< faked_disposer >
181 typedef ci::SplitListSet< rcu_type, ord_list,
182 ci::split_list::make_traits<
184 ,co::item_counter< simple_item_counter >
187 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
193 // Static bucket table
194 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmp_lazy()
196 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
197 typedef ci::LazyList< rcu_type
199 ,ci::lazy_list::make_traits<
200 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
201 ,co::compare< cmp<item> >
202 ,ci::opt::disposer< faked_disposer >
206 typedef ci::SplitListSet< rcu_type, ord_list,
207 ci::split_list::make_traits<
209 ,ci::split_list::dynamic_bucket_table<false>
210 ,co::memory_model<co::v::relaxed_ordering>
213 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
218 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_less_lazy()
220 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
221 typedef ci::LazyList< rcu_type
223 ,ci::lazy_list::make_traits<
224 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
225 ,co::less< less<item> >
226 ,ci::opt::disposer< faked_disposer >
230 typedef ci::SplitListSet< rcu_type, ord_list,
231 ci::split_list::make_traits<
233 ,ci::split_list::dynamic_bucket_table<false>
234 ,co::memory_model<co::v::sequential_consistent>
237 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
242 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmpmix_lazy()
244 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
245 typedef ci::LazyList< rcu_type
247 ,ci::lazy_list::make_traits<
248 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
249 ,co::less< less<item> >
250 ,co::compare< cmp<item> >
251 ,ci::opt::disposer< faked_disposer >
255 typedef ci::SplitListSet< rcu_type, ord_list,
256 ci::split_list::make_traits<
258 ,co::item_counter< simple_item_counter >
259 ,ci::split_list::dynamic_bucket_table<false>
262 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
267 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmp_lazy()
269 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
270 typedef ci::LazyList< rcu_type
272 ,ci::lazy_list::make_traits<
273 ci::opt::hook< ci::lazy_list::member_hook<
274 offsetof( item, hMember ),
277 ,co::compare< cmp<item> >
278 ,ci::opt::disposer< faked_disposer >
282 typedef ci::SplitListSet< rcu_type, ord_list,
283 ci::split_list::make_traits<
285 ,ci::split_list::dynamic_bucket_table<false>
286 ,co::memory_model<co::v::relaxed_ordering>
289 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
294 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_less_lazy()
296 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
297 typedef ci::LazyList< rcu_type
299 ,ci::lazy_list::make_traits<
300 ci::opt::hook< ci::lazy_list::member_hook<
301 offsetof( item, hMember ),
304 ,co::less< less<item> >
305 ,ci::opt::disposer< faked_disposer >
309 typedef ci::SplitListSet< rcu_type, ord_list,
310 ci::split_list::make_traits<
311 ci::split_list::dynamic_bucket_table<false>
312 ,co::hash< hash_int >
313 ,co::memory_model<co::v::sequential_consistent>
316 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
321 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmpmix_lazy()
323 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
324 typedef ci::LazyList< rcu_type
326 ,ci::lazy_list::make_traits<
327 ci::opt::hook< ci::lazy_list::member_hook<
328 offsetof( item, hMember ),
331 ,co::compare< cmp<item> >
332 ,co::less< less<item> >
333 ,ci::opt::disposer< faked_disposer >
337 typedef ci::SplitListSet< rcu_type, ord_list,
338 ci::split_list::make_traits<
340 ,co::item_counter< simple_item_counter >
341 ,ci::split_list::dynamic_bucket_table<false>
344 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
349 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmpmix_stat_lazy()
351 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
352 struct list_traits : public ci::lazy_list::traits
354 typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
355 typedef IntrusiveHashSetHdrTest::less< item > less;
356 typedef cmp<item> compare;
357 typedef faked_disposer disposer;
359 typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
361 struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
363 typedef hash_int hash;
364 typedef simple_item_counter item_counter;
365 typedef ci::split_list::stat<> stat;
367 typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
368 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
373 void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmpmix_stat_lazy()
375 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
377 public ci::lazy_list::make_traits<
378 ci::opt::hook< ci::lazy_list::member_hook<
379 offsetof( item, hMember ),
382 ,co::compare< cmp<item> >
383 ,co::less< less<item> >
384 ,ci::opt::disposer< faked_disposer >
387 typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
390 public ci::split_list::make_traits<
392 ,co::item_counter< simple_item_counter >
393 ,co::stat< ci::split_list::stat<> >
396 typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
397 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
402 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmpmix_stat_lazy()
404 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
405 typedef ci::LazyList< rcu_type
407 ,ci::lazy_list::make_traits<
408 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
409 ,co::less< less<item> >
410 ,co::compare< cmp<item> >
411 ,ci::opt::disposer< faked_disposer >
415 typedef ci::SplitListSet< rcu_type, ord_list,
416 ci::split_list::make_traits<
418 ,co::item_counter< simple_item_counter >
419 ,ci::split_list::dynamic_bucket_table<false>
420 ,co::stat< ci::split_list::stat<>>
423 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
428 void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmpmix_stat_lazy()
430 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
431 typedef ci::LazyList< rcu_type
433 ,ci::lazy_list::make_traits<
434 ci::opt::hook< ci::lazy_list::member_hook<
435 offsetof( item, hMember ),
438 ,co::compare< cmp<item> >
439 ,co::less< less<item> >
440 ,ci::opt::disposer< faked_disposer >
444 typedef ci::SplitListSet< rcu_type, ord_list,
445 ci::split_list::make_traits<
447 ,co::item_counter< simple_item_counter >
448 ,ci::split_list::dynamic_bucket_table<false>
449 ,co::stat< ci::split_list::stat<>>
452 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );