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_dhp.h>
33 #include <cds/intrusive/split_list.h>
37 void IntrusiveHashSetHdrTest::split_dyn_DHP_base_cmp_lazy()
39 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
40 typedef ci::LazyList< cds::gc::DHP
42 ,ci::lazy_list::make_traits<
43 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
44 ,co::compare< cmp<item> >
45 ,ci::opt::disposer< faked_disposer >
49 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
50 ci::split_list::make_traits<
52 ,ci::split_list::dynamic_bucket_table<true>
53 ,co::memory_model<co::v::relaxed_ordering>
56 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
61 void IntrusiveHashSetHdrTest::split_dyn_DHP_base_less_lazy()
63 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
64 typedef ci::LazyList< cds::gc::DHP
66 ,ci::lazy_list::make_traits<
67 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
68 ,co::less< less<item> >
69 ,ci::opt::disposer< faked_disposer >
73 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
74 ci::split_list::make_traits<
76 ,co::memory_model<co::v::sequential_consistent>
79 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
84 void IntrusiveHashSetHdrTest::split_dyn_DHP_base_cmpmix_lazy()
86 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::DHP> > > item;
87 typedef ci::LazyList< cds::gc::DHP
89 ,ci::lazy_list::make_traits<
90 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
91 ,co::less< less<item> >
92 ,co::compare< cmp<item> >
93 ,ci::opt::disposer< faked_disposer >
97 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
98 ci::split_list::make_traits<
100 ,co::item_counter< simple_item_counter >
101 ,ci::split_list::dynamic_bucket_table<true>
104 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
109 void IntrusiveHashSetHdrTest::split_dyn_DHP_base_cmpmix_stat_lazy()
111 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::DHP> > > item;
112 typedef ci::LazyList< cds::gc::DHP
114 ,ci::lazy_list::make_traits<
115 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
116 ,co::less< less<item> >
117 ,co::compare< cmp<item> >
118 ,ci::opt::disposer< faked_disposer >
122 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
123 ci::split_list::make_traits<
125 ,co::item_counter< simple_item_counter >
126 ,ci::split_list::dynamic_bucket_table<true>
127 ,co::stat< ci::split_list::stat<> >
130 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
135 void IntrusiveHashSetHdrTest::split_dyn_DHP_member_cmp_lazy()
137 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
138 typedef ci::LazyList< cds::gc::DHP
140 ,ci::lazy_list::make_traits<
141 ci::opt::hook< ci::lazy_list::member_hook<
142 offsetof( item, hMember ),
145 ,co::compare< cmp<item> >
146 ,ci::opt::disposer< faked_disposer >
150 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
151 ci::split_list::make_traits<
153 ,co::memory_model<co::v::relaxed_ordering>
156 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
161 void IntrusiveHashSetHdrTest::split_dyn_DHP_member_less_lazy()
163 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
164 typedef ci::LazyList< cds::gc::DHP
166 ,ci::lazy_list::make_traits<
167 ci::opt::hook< ci::lazy_list::member_hook<
168 offsetof( item, hMember ),
171 ,co::less< less<item> >
172 ,ci::opt::disposer< faked_disposer >
176 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
177 ci::split_list::make_traits<
179 ,co::memory_model<co::v::sequential_consistent>
182 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
187 void IntrusiveHashSetHdrTest::split_dyn_DHP_member_cmpmix_lazy()
189 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
190 typedef ci::LazyList< cds::gc::DHP
192 ,ci::lazy_list::make_traits<
193 ci::opt::hook< ci::lazy_list::member_hook<
194 offsetof( item, hMember ),
197 ,co::compare< cmp<item> >
198 ,co::less< less<item> >
199 ,ci::opt::disposer< faked_disposer >
203 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
204 ci::split_list::make_traits<
206 ,co::item_counter< simple_item_counter >
209 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
214 void IntrusiveHashSetHdrTest::split_dyn_DHP_member_cmpmix_stat_lazy()
216 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
217 struct list_traits : public ci::lazy_list::traits
219 typedef ci::lazy_list::member_hook< offsetof( item, hMember ), co::gc<cds::gc::DHP>> hook;
220 typedef cmp<item> compare;
221 typedef IntrusiveHashSetHdrTest::less<item> less;
222 typedef faked_disposer disposer;
224 typedef ci::LazyList< cds::gc::DHP, item, list_traits > ord_list;
226 struct set_traits : public ci::split_list::traits {
227 typedef hash_int hash;
228 typedef simple_item_counter item_counter;
229 typedef ci::split_list::stat<> stat;
231 typedef ci::SplitListSet< cds::gc::DHP, ord_list, set_traits > set;
233 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
238 // Static bucket table
239 void IntrusiveHashSetHdrTest::split_st_DHP_base_cmp_lazy()
241 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
242 typedef ci::LazyList< cds::gc::DHP
244 ,ci::lazy_list::make_traits<
245 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
246 ,co::compare< cmp<item> >
247 ,ci::opt::disposer< faked_disposer >
251 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
252 ci::split_list::make_traits<
254 ,ci::split_list::dynamic_bucket_table<false>
255 ,co::memory_model<co::v::relaxed_ordering>
258 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
263 void IntrusiveHashSetHdrTest::split_st_DHP_base_less_lazy()
265 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
266 typedef ci::LazyList< cds::gc::DHP
268 ,ci::lazy_list::make_traits<
269 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
270 ,co::less< less<item> >
271 ,ci::opt::disposer< faked_disposer >
275 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
276 ci::split_list::make_traits<
278 ,ci::split_list::dynamic_bucket_table<false>
279 ,co::memory_model<co::v::sequential_consistent>
282 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
287 void IntrusiveHashSetHdrTest::split_st_DHP_base_cmpmix_lazy()
289 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::DHP> > > item;
290 typedef ci::LazyList< cds::gc::DHP
292 ,ci::lazy_list::make_traits<
293 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
294 ,co::less< less<item> >
295 ,co::compare< cmp<item> >
296 ,ci::opt::disposer< faked_disposer >
300 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
301 ci::split_list::make_traits<
303 ,co::item_counter< simple_item_counter >
304 ,ci::split_list::dynamic_bucket_table<false>
307 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
312 void IntrusiveHashSetHdrTest::split_st_DHP_base_cmpmix_stat_lazy()
314 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<cds::gc::DHP> > > item;
315 typedef ci::LazyList< cds::gc::DHP
317 ,ci::lazy_list::make_traits<
318 ci::opt::hook< ci::lazy_list::base_hook< co::gc<cds::gc::DHP> > >
319 ,co::less< less<item> >
320 ,co::compare< cmp<item> >
321 ,ci::opt::disposer< faked_disposer >
325 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
326 ci::split_list::make_traits<
328 ,co::item_counter< simple_item_counter >
329 ,ci::split_list::dynamic_bucket_table<false>
330 ,co::stat< ci::split_list::stat<> >
333 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
338 void IntrusiveHashSetHdrTest::split_st_DHP_member_cmp_lazy()
340 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
341 typedef ci::LazyList< cds::gc::DHP
343 ,ci::lazy_list::make_traits<
344 ci::opt::hook< ci::lazy_list::member_hook<
345 offsetof( item, hMember ),
348 ,co::compare< cmp<item> >
349 ,ci::opt::disposer< faked_disposer >
353 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
354 ci::split_list::make_traits<
356 ,ci::split_list::dynamic_bucket_table<false>
357 ,co::memory_model<co::v::relaxed_ordering>
360 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
365 void IntrusiveHashSetHdrTest::split_st_DHP_member_less_lazy()
367 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
368 typedef ci::LazyList< cds::gc::DHP
370 ,ci::lazy_list::make_traits<
371 ci::opt::hook< ci::lazy_list::member_hook<
372 offsetof( item, hMember ),
375 ,co::less< less<item> >
376 ,ci::opt::disposer< faked_disposer >
380 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
381 ci::split_list::make_traits<
382 ci::split_list::dynamic_bucket_table<false>
383 ,co::hash< hash_int >
384 ,co::memory_model<co::v::sequential_consistent>
387 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
392 void IntrusiveHashSetHdrTest::split_st_DHP_member_cmpmix_lazy()
394 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
395 typedef ci::LazyList< cds::gc::DHP
397 ,ci::lazy_list::make_traits<
398 ci::opt::hook< ci::lazy_list::member_hook<
399 offsetof( item, hMember ),
402 ,co::compare< cmp<item> >
403 ,co::less< less<item> >
404 ,ci::opt::disposer< faked_disposer >
408 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
409 ci::split_list::make_traits<
411 ,co::item_counter< simple_item_counter >
412 ,ci::split_list::dynamic_bucket_table<false>
415 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
420 void IntrusiveHashSetHdrTest::split_st_DHP_member_cmpmix_stat_lazy()
422 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<cds::gc::DHP> > > item;
423 typedef ci::LazyList< cds::gc::DHP
425 ,ci::lazy_list::make_traits<
426 ci::opt::hook< ci::lazy_list::member_hook<
427 offsetof( item, hMember ),
430 ,co::compare< cmp<item> >
431 ,co::less< less<item> >
432 ,ci::opt::disposer< faked_disposer >
436 typedef ci::SplitListSet< cds::gc::DHP, ord_list,
437 ci::split_list::make_traits<
439 ,co::item_counter< simple_item_counter >
440 ,ci::split_list::dynamic_bucket_table<false>
441 ,co::stat< ci::split_list::stat<> >
444 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );