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 #ifndef CDSUNIT_SET_TEST_INTRUSIVE_STRIPED_SET_H
32 #define CDSUNIT_SET_TEST_INTRUSIVE_STRIPED_SET_H
34 #include "test_intrusive_set.h"
36 #include <cds/intrusive/striped_set.h>
39 namespace ci = cds::intrusive;
41 template <typename ContainerPair>
42 class IntrusiveStripedSet : public cds_test::intrusive_set
45 typedef cds_test::intrusive_set base_class;
47 typedef typename ContainerPair::base_item base_item;
48 typedef typename ContainerPair::member_item member_item;
50 typedef typename ContainerPair::base_hook_container base_hook_container;
51 typedef typename ContainerPair::member_hook_container member_hook_container;
60 TYPED_TEST_CASE_P( IntrusiveStripedSet );
62 // ****************************************************************
65 TYPED_TEST_P( IntrusiveStripedSet, striped_basehook_compare )
67 typedef ci::StripedSet<
68 typename TestFixture::base_hook_container,
69 ci::opt::hash< typename TestFixture::hash1 >,
70 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>
73 std::vector< typename set_type::value_type > data;
76 this->test( s, data );
80 TYPED_TEST_P( IntrusiveStripedSet, striped_basehook_less )
82 typedef ci::StripedSet<
83 typename TestFixture::base_hook_container,
84 ci::opt::hash< typename TestFixture::hash1 >,
85 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>
88 std::vector< typename set_type::value_type > data;
91 this->test( s, data );
95 TYPED_TEST_P( IntrusiveStripedSet, striped_basehook_cmpmix )
97 typedef ci::StripedSet<
98 typename TestFixture::base_hook_container,
99 ci::opt::hash< typename TestFixture::hash1 >,
100 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>,
101 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>,
102 ci::opt::resizing_policy< ci::striped_set::load_factor_resizing< 8 >>
105 std::vector< typename set_type::value_type > data;
108 this->test( s, data );
112 TYPED_TEST_P( IntrusiveStripedSet, striped_basehook_resizing_threshold )
114 typedef ci::StripedSet<
115 typename TestFixture::base_hook_container,
116 ci::opt::hash< typename TestFixture::hash1 >,
117 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>,
118 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>,
119 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<8>>
122 std::vector< typename set_type::value_type > data;
125 this->test( s, data );
129 TYPED_TEST_P( IntrusiveStripedSet, striped_basehook_resizing_threshold_rt )
131 typedef ci::StripedSet<
132 typename TestFixture::base_hook_container,
133 ci::opt::hash< typename TestFixture::hash2 >,
134 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>,
135 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>,
136 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<0>>
139 std::vector< typename set_type::value_type > data;
141 set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>( 4 ) );
142 this->test( s, data );
146 // ****************************************************************
147 // striped member hook
149 TYPED_TEST_P( IntrusiveStripedSet, striped_memberhook_compare )
151 typedef ci::StripedSet<
152 typename TestFixture::member_hook_container,
153 ci::opt::hash< typename TestFixture::hash1 >,
154 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>
157 std::vector< typename set_type::value_type > data;
160 this->test( s, data );
164 TYPED_TEST_P( IntrusiveStripedSet, striped_memberhook_less )
166 typedef ci::StripedSet<
167 typename TestFixture::member_hook_container,
168 ci::opt::hash< typename TestFixture::hash1 >,
169 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>
172 std::vector< typename set_type::value_type > data;
175 this->test( s, data );
179 TYPED_TEST_P( IntrusiveStripedSet, striped_memberhook_cmpmix )
181 typedef ci::StripedSet<
182 typename TestFixture::member_hook_container,
183 ci::opt::hash< typename TestFixture::hash1 >,
184 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>,
185 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>,
186 ci::opt::resizing_policy< ci::striped_set::load_factor_resizing< 8 >>
189 std::vector< typename set_type::value_type > data;
192 this->test( s, data );
196 TYPED_TEST_P( IntrusiveStripedSet, striped_memberhook_resizing_threshold )
198 typedef ci::StripedSet<
199 typename TestFixture::member_hook_container,
200 ci::opt::hash< typename TestFixture::hash1 >,
201 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>,
202 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>,
203 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<8>>
206 std::vector< typename set_type::value_type > data;
209 this->test( s, data );
213 TYPED_TEST_P( IntrusiveStripedSet, striped_memberhook_resizing_threshold_rt )
215 typedef ci::StripedSet<
216 typename TestFixture::member_hook_container,
217 ci::opt::hash< typename TestFixture::hash2 >,
218 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>,
219 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>,
220 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<0>>
223 std::vector< typename set_type::value_type > data;
225 set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>( 4 ) );
226 this->test( s, data );
231 // ****************************************************************
232 // refinable base hook
234 TYPED_TEST_P( IntrusiveStripedSet, refinable_basehook_compare )
236 typedef ci::StripedSet<
237 typename TestFixture::base_hook_container,
238 ci::opt::hash< typename TestFixture::hash1 >,
239 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>
242 std::vector< typename set_type::value_type > data;
245 this->test( s, data );
249 TYPED_TEST_P( IntrusiveStripedSet, refinable_basehook_less )
251 typedef ci::StripedSet<
252 typename TestFixture::base_hook_container,
253 ci::opt::hash< typename TestFixture::hash1 >,
254 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>
257 std::vector< typename set_type::value_type > data;
260 this->test( s, data );
264 TYPED_TEST_P( IntrusiveStripedSet, refinable_basehook_cmpmix )
266 typedef ci::StripedSet<
267 typename TestFixture::base_hook_container,
268 ci::opt::hash< typename TestFixture::hash1 >,
269 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>,
270 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>,
271 ci::opt::resizing_policy< ci::striped_set::load_factor_resizing< 8 >>
274 std::vector< typename set_type::value_type > data;
277 this->test( s, data );
281 TYPED_TEST_P( IntrusiveStripedSet, refinable_basehook_resizing_threshold )
283 typedef ci::StripedSet<
284 typename TestFixture::base_hook_container,
285 ci::opt::hash< typename TestFixture::hash1 >,
286 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>,
287 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>,
288 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<8>>
291 std::vector< typename set_type::value_type > data;
294 this->test( s, data );
298 TYPED_TEST_P( IntrusiveStripedSet, refinable_basehook_resizing_threshold_rt )
300 typedef ci::StripedSet<
301 typename TestFixture::base_hook_container,
302 ci::opt::hash< typename TestFixture::hash2 >,
303 ci::opt::less< typename TestFixture::template less< typename TestFixture::base_item >>,
304 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::base_item >>,
305 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<0>>
308 std::vector< typename set_type::value_type > data;
310 set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>( 4 ));
311 this->test( s, data );
315 // ****************************************************************
316 // refinable member hook
318 TYPED_TEST_P( IntrusiveStripedSet, refinable_memberhook_compare )
320 typedef ci::StripedSet<
321 typename TestFixture::member_hook_container,
322 ci::opt::hash< typename TestFixture::hash1 >,
323 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>
326 std::vector< typename set_type::value_type > data;
329 this->test( s, data );
333 TYPED_TEST_P( IntrusiveStripedSet, refinable_memberhook_less )
335 typedef ci::StripedSet<
336 typename TestFixture::member_hook_container,
337 ci::opt::hash< typename TestFixture::hash1 >,
338 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>
341 std::vector< typename set_type::value_type > data;
344 this->test( s, data );
348 TYPED_TEST_P( IntrusiveStripedSet, refinable_memberhook_cmpmix )
350 typedef ci::StripedSet<
351 typename TestFixture::member_hook_container,
352 ci::opt::hash< typename TestFixture::hash1 >,
353 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>,
354 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>,
355 ci::opt::resizing_policy< ci::striped_set::load_factor_resizing< 8 >>
358 std::vector< typename set_type::value_type > data;
361 this->test( s, data );
365 TYPED_TEST_P( IntrusiveStripedSet, refinable_memberhook_resizing_threshold )
367 typedef ci::StripedSet<
368 typename TestFixture::member_hook_container,
369 ci::opt::hash< typename TestFixture::hash1 >,
370 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>,
371 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>,
372 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<8>>
375 std::vector< typename set_type::value_type > data;
378 this->test( s, data );
382 TYPED_TEST_P( IntrusiveStripedSet, refinable_memberhook_resizing_threshold_rt )
384 typedef ci::StripedSet<
385 typename TestFixture::member_hook_container,
386 ci::opt::hash< typename TestFixture::hash2 >,
387 ci::opt::less< typename TestFixture::template less< typename TestFixture::member_item >>,
388 ci::opt::compare< typename TestFixture::template cmp< typename TestFixture::member_item >>,
389 ci::opt::resizing_policy< ci::striped_set::single_bucket_size_threshold<0>>
392 std::vector< typename set_type::value_type > data;
394 set_type s( 64, ci::striped_set::single_bucket_size_threshold<0>( 4 ) );
395 this->test( s, data );
399 REGISTER_TYPED_TEST_CASE_P( IntrusiveStripedSet,
400 striped_basehook_compare, striped_basehook_less, striped_basehook_cmpmix, striped_basehook_resizing_threshold, striped_basehook_resizing_threshold_rt, striped_memberhook_compare, striped_memberhook_less, striped_memberhook_cmpmix, striped_memberhook_resizing_threshold, striped_memberhook_resizing_threshold_rt, refinable_basehook_compare, refinable_basehook_less, refinable_basehook_cmpmix, refinable_basehook_resizing_threshold, refinable_basehook_resizing_threshold_rt, refinable_memberhook_compare, refinable_memberhook_less, refinable_memberhook_cmpmix, refinable_memberhook_resizing_threshold, refinable_memberhook_resizing_threshold_rt
405 #endif // CDSUNIT_SET_TEST_INTRUSIVE_STRIPED_SET_H