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/intrusive/lazy_list_hp.h>
33 #include <cds/intrusive/split_list.h>
37 void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmp_lazy()
39 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
40 typedef ci::LazyList< cds::gc::HP
42 ,ci::lazy_list::make_traits<
43 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
44 ,co::compare< cmp<item> >
45 ,ci::opt::disposer< faked_disposer >
46 ,ci::opt::back_off< cds::backoff::empty >
50 typedef ci::SplitListSet< cds::gc::HP, ord_list,
51 ci::split_list::make_traits<
53 ,ci::split_list::dynamic_bucket_table<true>
54 ,co::memory_model<co::v::relaxed_ordering>
57 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
62 void IntrusiveHashSetHdrTest::split_dyn_HP_base_less_lazy()
64 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
65 typedef ci::LazyList< cds::gc::HP
67 ,ci::lazy_list::make_traits<
68 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
69 ,co::less< less<item> >
70 ,ci::opt::disposer< faked_disposer >
74 typedef ci::SplitListSet< cds::gc::HP, ord_list,
75 ci::split_list::make_traits<
77 ,co::memory_model<co::v::sequential_consistent>
80 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
85 void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmpmix_lazy()
87 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HP> > > item;
88 typedef ci::LazyList< cds::gc::HP
90 ,ci::lazy_list::make_traits<
91 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
92 ,co::less< less<item> >
93 ,co::compare< cmp<item> >
94 ,ci::opt::disposer< faked_disposer >
98 typedef ci::SplitListSet< cds::gc::HP, ord_list,
99 ci::split_list::make_traits<
101 ,co::item_counter< simple_item_counter >
102 ,ci::split_list::dynamic_bucket_table<true>
105 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
110 void IntrusiveHashSetHdrTest::split_dyn_HP_base_cmpmix_stat_lazy()
112 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HP> > > item;
113 typedef ci::LazyList< cds::gc::HP
115 ,ci::lazy_list::make_traits<
116 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
117 ,co::less< less<item> >
118 ,co::compare< cmp<item> >
119 ,ci::opt::disposer< faked_disposer >
123 typedef ci::SplitListSet< cds::gc::HP, ord_list,
124 ci::split_list::make_traits<
126 ,co::item_counter< simple_item_counter >
127 ,ci::split_list::dynamic_bucket_table<true>
128 ,co::stat< ci::split_list::stat<> >
131 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
136 void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmp_lazy()
138 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
139 typedef ci::LazyList< cds::gc::HP
141 ,ci::lazy_list::make_traits<
142 ci::opt::hook< ci::lazy_list::member_hook<
143 offsetof( item, hMember ),
146 ,co::compare< cmp<item> >
147 ,ci::opt::disposer< faked_disposer >
151 typedef ci::SplitListSet< cds::gc::HP, ord_list,
152 ci::split_list::make_traits<
154 ,co::memory_model<co::v::relaxed_ordering>
157 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
162 void IntrusiveHashSetHdrTest::split_dyn_HP_member_less_lazy()
164 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
165 typedef ci::LazyList< cds::gc::HP
167 ,ci::lazy_list::make_traits<
168 ci::opt::hook< ci::lazy_list::member_hook<
169 offsetof( item, hMember ),
172 ,co::less< less<item> >
173 ,ci::opt::disposer< faked_disposer >
177 typedef ci::SplitListSet< cds::gc::HP, ord_list,
178 ci::split_list::make_traits<
180 ,co::memory_model<co::v::sequential_consistent>
183 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
188 void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmpmix_lazy()
190 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
191 typedef ci::LazyList< cds::gc::HP
193 ,ci::lazy_list::make_traits<
194 ci::opt::hook< ci::lazy_list::member_hook<
195 offsetof( item, hMember ),
198 ,co::compare< cmp<item> >
199 ,co::less< less<item> >
200 ,ci::opt::disposer< faked_disposer >
204 typedef ci::SplitListSet< cds::gc::HP, ord_list,
205 ci::split_list::make_traits<
207 ,co::item_counter< simple_item_counter >
210 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
215 void IntrusiveHashSetHdrTest::split_dyn_HP_member_cmpmix_stat_lazy()
217 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
218 struct list_traits : public ci::lazy_list::traits
220 typedef ci::lazy_list::member_hook< offsetof( item, hMember ), co::gc<cds::gc::HP>> hook;
221 typedef cmp<item> compare;
222 typedef IntrusiveHashSetHdrTest::less<item> less;
223 typedef faked_disposer disposer;
225 typedef ci::LazyList< cds::gc::HP, item, list_traits > ord_list;
227 struct set_traits : public ci::split_list::traits
229 typedef hash_int hash;
230 typedef simple_item_counter item_counter;
231 typedef ci::split_list::stat<> stat;
233 typedef ci::SplitListSet< cds::gc::HP, ord_list, set_traits > set;
235 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
241 // Static bucket table
242 void IntrusiveHashSetHdrTest::split_st_HP_base_cmp_lazy()
244 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
245 typedef ci::LazyList< cds::gc::HP
247 ,ci::lazy_list::make_traits<
248 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
249 ,co::compare< cmp<item> >
250 ,ci::opt::disposer< faked_disposer >
254 typedef ci::SplitListSet< cds::gc::HP, ord_list,
255 ci::split_list::make_traits<
257 ,ci::split_list::dynamic_bucket_table<false>
258 ,co::memory_model<co::v::relaxed_ordering>
261 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
266 void IntrusiveHashSetHdrTest::split_st_HP_base_less_lazy()
268 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
269 typedef ci::LazyList< cds::gc::HP
271 ,ci::lazy_list::make_traits<
272 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
273 ,co::less< less<item> >
274 ,ci::opt::disposer< faked_disposer >
278 typedef ci::SplitListSet< cds::gc::HP, ord_list,
279 ci::split_list::make_traits<
281 ,ci::split_list::dynamic_bucket_table<false>
282 ,co::memory_model<co::v::sequential_consistent>
285 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
290 void IntrusiveHashSetHdrTest::split_st_HP_base_cmpmix_lazy()
292 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HP> > > item;
293 typedef ci::LazyList< cds::gc::HP
295 ,ci::lazy_list::make_traits<
296 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
297 ,co::less< less<item> >
298 ,co::compare< cmp<item> >
299 ,ci::opt::disposer< faked_disposer >
303 typedef ci::SplitListSet< cds::gc::HP, ord_list,
304 ci::split_list::make_traits<
306 ,co::item_counter< simple_item_counter >
307 ,ci::split_list::dynamic_bucket_table<false>
310 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
315 void IntrusiveHashSetHdrTest::split_st_HP_base_cmpmix_stat_lazy()
317 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::HP> > > item;
319 public ci::lazy_list::make_traits<
320 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::HP> > >
321 ,co::less< less<item> >
322 ,co::compare< cmp<item> >
323 ,ci::opt::disposer< faked_disposer >
326 typedef ci::LazyList< cds::gc::HP, item, list_traits > ord_list;
329 public ci::split_list::make_traits<
331 ,co::item_counter< simple_item_counter >
332 ,ci::split_list::dynamic_bucket_table<false>
335 typedef ci::split_list::stat<> stat;
337 typedef ci::SplitListSet< cds::gc::HP, ord_list, set_traits > set;
339 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
344 void IntrusiveHashSetHdrTest::split_st_HP_member_cmp_lazy()
346 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
347 typedef ci::LazyList< cds::gc::HP
349 ,ci::lazy_list::make_traits<
350 ci::opt::hook< ci::lazy_list::member_hook<
351 offsetof( item, hMember ),
354 ,co::compare< cmp<item> >
355 ,ci::opt::disposer< faked_disposer >
359 typedef ci::SplitListSet< cds::gc::HP, ord_list,
360 ci::split_list::make_traits<
362 ,ci::split_list::dynamic_bucket_table<false>
363 ,co::memory_model<co::v::relaxed_ordering>
366 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
371 void IntrusiveHashSetHdrTest::split_st_HP_member_less_lazy()
373 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
374 typedef ci::LazyList< cds::gc::HP
376 ,ci::lazy_list::make_traits<
377 ci::opt::hook< ci::lazy_list::member_hook<
378 offsetof( item, hMember ),
381 ,co::less< less<item> >
382 ,ci::opt::disposer< faked_disposer >
386 typedef ci::SplitListSet< cds::gc::HP, ord_list,
387 ci::split_list::make_traits<
388 ci::split_list::dynamic_bucket_table<false>
389 ,co::hash< hash_int >
390 ,co::memory_model<co::v::sequential_consistent>
393 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
398 void IntrusiveHashSetHdrTest::split_st_HP_member_cmpmix_lazy()
400 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
401 typedef ci::LazyList< cds::gc::HP
403 ,ci::lazy_list::make_traits<
404 ci::opt::hook< ci::lazy_list::member_hook<
405 offsetof( item, hMember ),
408 ,co::compare< cmp<item> >
409 ,co::less< less<item> >
410 ,ci::opt::disposer< faked_disposer >
414 typedef ci::SplitListSet< cds::gc::HP, ord_list,
415 ci::split_list::make_traits<
417 ,co::item_counter< simple_item_counter >
418 ,ci::split_list::dynamic_bucket_table<false>
421 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
426 void IntrusiveHashSetHdrTest::split_st_HP_member_cmpmix_stat_lazy()
428 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::HP> > > item;
429 typedef ci::LazyList< cds::gc::HP
431 ,ci::lazy_list::make_traits<
432 ci::opt::hook< ci::lazy_list::member_hook<
433 offsetof( item, hMember ),
436 ,co::compare< cmp<item> >
437 ,co::less< less<item> >
438 ,ci::opt::disposer< faked_disposer >
442 typedef ci::SplitListSet< cds::gc::HP, ord_list,
443 ci::split_list::make_traits<
445 ,co::item_counter< simple_item_counter >
446 ,ci::split_list::dynamic_bucket_table<false>
447 ,co::stat< ci::split_list::stat<> >
451 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );