3 #ifndef CDSTEST_HDR_QUEUE_H
4 #define CDSTEST_HDR_QUEUE_H
6 #include "cppunit/cppunit_proxy.h"
7 #include <cds/details/defs.h>
12 // Test queue operation in single thread mode
14 class HdrTestQueue: public CppUnitMini::TestCase
17 template <class Queue>
25 template <class Queue>
26 void test_with( Queue& q )
32 for ( size_t i = 0; i < 3; ++i ) {
33 CPPUNIT_ASSERT( q.empty() );
35 CPPUNIT_ASSERT( q.size() == 0 );
37 CPPUNIT_ASSERT( q.enqueue( 1 ) );
38 CPPUNIT_ASSERT( !q.empty() );
39 CPPUNIT_ASSERT( q.push( 10 ) );
40 CPPUNIT_ASSERT( !q.empty() );
42 CPPUNIT_ASSERT( q.size() == 0 ) ; // no queue's item counter!
46 CPPUNIT_ASSERT( q.pop( it ) );
47 CPPUNIT_ASSERT( it == 1 );
48 CPPUNIT_ASSERT( !q.empty() );
49 CPPUNIT_ASSERT( q.dequeue( it ) );
50 CPPUNIT_ASSERT( it == 10 );
52 CPPUNIT_ASSERT( q.size() == 0 );
54 CPPUNIT_ASSERT( q.empty() );
57 CPPUNIT_ASSERT( !q.dequeue( it ) );
58 CPPUNIT_ASSERT( it == nPrev ) ; // it must not be changed!
62 for ( size_t i = 0; i < 3; ++i ) {
63 CPPUNIT_ASSERT( q.empty() );
65 CPPUNIT_ASSERT( q.size() == 0 );
67 CPPUNIT_ASSERT( q.enqueue_with( []( int& dest ) { dest = 1; } ));
68 CPPUNIT_ASSERT( !q.empty() );
69 CPPUNIT_ASSERT( q.push_with( []( int& dest ) { dest = 10; } ));
70 CPPUNIT_ASSERT( !q.empty() );
72 CPPUNIT_ASSERT( q.size() == 0 ); // no queue's item counter!
76 CPPUNIT_ASSERT( q.pop_with( [&it]( int src ) { it = src; } ));
77 CPPUNIT_ASSERT( it == 1 );
78 CPPUNIT_ASSERT( !q.empty() );
79 CPPUNIT_ASSERT( q.dequeue_with( [&it]( int src ) { it = src; } ));
80 CPPUNIT_ASSERT( it == 10 );
82 CPPUNIT_ASSERT( q.size() == 0 );
84 CPPUNIT_ASSERT( q.empty() );
87 CPPUNIT_ASSERT( !q.dequeue_with( [&it]( int src ) { it = src; } ));
88 CPPUNIT_ASSERT( it == nPrev ); // it must not be changed!
92 template <class Queue>
93 void test_emplace( Queue& q )
96 for ( size_t i = 0; i < 3; ++i ) {
97 CPPUNIT_ASSERT( q.emplace( static_cast<int>( i * 42 )) );
98 CPPUNIT_ASSERT( !q.empty() );
100 CPPUNIT_ASSERT( q.pop( it ));
101 CPPUNIT_ASSERT( it == static_cast<int>( i * 42 ));
102 CPPUNIT_ASSERT( q.empty() );
106 template <class Queue>
111 test_emplace_ic( q );
114 template <class Queue>
121 template <class Queue>
122 void test_ic_with( Queue& q )
128 for ( size_t i = 0; i < 3; ++i ) {
129 CPPUNIT_ASSERT( q.empty() );
130 CPPUNIT_ASSERT( q.size() == 0 );
131 CPPUNIT_ASSERT( q.enqueue( 1 ) );
132 CPPUNIT_ASSERT( q.size() == 1 );
133 CPPUNIT_ASSERT( !q.empty() );
134 CPPUNIT_ASSERT( q.push( 10 ) );
135 CPPUNIT_ASSERT( !q.empty() );
136 CPPUNIT_ASSERT( q.size() == 2 );
139 CPPUNIT_ASSERT( q.pop( it ) );
140 CPPUNIT_ASSERT( it == 1 );
141 CPPUNIT_ASSERT( !q.empty() );
142 CPPUNIT_ASSERT( q.size() == 1 );
143 CPPUNIT_ASSERT( q.dequeue( it ) );
144 CPPUNIT_ASSERT( it == 10 );
145 CPPUNIT_ASSERT( q.size() == 0 );
146 CPPUNIT_ASSERT( q.empty() );
147 CPPUNIT_ASSERT( q.size() == 0 );
150 CPPUNIT_ASSERT( !q.dequeue( it ) );
151 CPPUNIT_ASSERT( it == nPrev ) ; // it must not be changed!
153 CPPUNIT_ASSERT( q.empty() );
154 CPPUNIT_ASSERT( q.size() == 0 );
157 // push_with/pop_with
158 for ( size_t i = 0; i < 3; ++i ) {
159 CPPUNIT_ASSERT( q.empty() );
160 CPPUNIT_ASSERT( q.size() == 0 );
161 CPPUNIT_ASSERT( q.enqueue_with( []( int& dest ) { dest = 1; } ) );
162 CPPUNIT_ASSERT( !q.empty() );
163 CPPUNIT_ASSERT( q.size() == 1 );
164 CPPUNIT_ASSERT( q.push_with( []( int& dest ) { dest = 10; } ) );
165 CPPUNIT_ASSERT( !q.empty() );
166 CPPUNIT_ASSERT( q.size() == 2 );
169 CPPUNIT_ASSERT( q.pop_with( [&it]( int src ) { it = src; } ) );
170 CPPUNIT_ASSERT( it == 1 );
171 CPPUNIT_ASSERT( !q.empty() );
172 CPPUNIT_ASSERT( q.size() == 1 );
173 CPPUNIT_ASSERT( q.dequeue_with( [&it]( int src ) { it = src; } ) );
174 CPPUNIT_ASSERT( it == 10 );
175 CPPUNIT_ASSERT( q.size() == 0 );
176 CPPUNIT_ASSERT( q.empty() );
179 CPPUNIT_ASSERT( !q.dequeue_with( [&it]( int src ) { it = src; } ) );
180 CPPUNIT_ASSERT( it == nPrev ); // it must not be changed!
182 CPPUNIT_ASSERT( q.size() == 0 );
183 CPPUNIT_ASSERT( q.empty() );
187 template <class Queue>
188 void test_emplace_ic( Queue& q )
191 for ( size_t i = 0; i < 3; ++i ) {
192 CPPUNIT_ASSERT( q.emplace( (int) i * 10 ) );
193 CPPUNIT_ASSERT( !q.empty() );
194 CPPUNIT_ASSERT( q.size() == 1 );
195 CPPUNIT_ASSERT( q.pop( it ));
196 CPPUNIT_ASSERT( it == (int) i * 10 );
197 CPPUNIT_ASSERT( q.empty() );
198 CPPUNIT_ASSERT( q.size() == 0 );
202 template <class Queue>
203 void test_bounded_no_ic()
209 CPPUNIT_ASSERT( q.empty() );
210 size_t nCapacity = q.capacity();
211 for ( size_t i = 0; i < nCapacity; ++i ) {
212 CPPUNIT_CHECK_EX( q.push( static_cast<int>(i) ), "capacity=" << nCapacity << ", i=" << i );
215 CPPUNIT_CHECK( !q.empty() );
216 CPPUNIT_ASSERT( !q.push_with( [nCapacity]( int& itm ) { itm = static_cast<int>(nCapacity); } ) );
218 CPPUNIT_CHECK( q.pop(n) );
219 CPPUNIT_CHECK( n == 0 );
220 CPPUNIT_ASSERT( q.push( static_cast<int>(nCapacity) ) );
221 CPPUNIT_ASSERT( !q.push( static_cast<int>(nCapacity) ) );
224 template <class Queue>
225 void test_bounded_ic()
229 test_emplace_ic( q );
231 CPPUNIT_ASSERT( q.empty() );
232 size_t nCapacity = q.capacity();
233 for ( size_t i = 0; i < nCapacity; ++i ) {
234 CPPUNIT_CHECK_EX( q.push( static_cast<int>(i) ), "capacity=" << nCapacity << ", i=" << i );
237 CPPUNIT_CHECK( !q.empty() );
238 CPPUNIT_CHECK( q.size() == nCapacity );
239 CPPUNIT_ASSERT( !q.push_with( [nCapacity]( int& itm ) { itm = static_cast<int>(nCapacity); } ));
241 CPPUNIT_CHECK( q.pop( n ) );
242 CPPUNIT_CHECK( n == 0 );
243 CPPUNIT_ASSERT( q.push( static_cast<int>(nCapacity) ) );
244 CPPUNIT_CHECK( q.size() == nCapacity );
245 CPPUNIT_ASSERT( !q.push( static_cast<int>(nCapacity) ) );
246 CPPUNIT_CHECK( q.size() == nCapacity );
251 void MSQueue_HP_relax();
252 void MSQueue_HP_seqcst();
253 void MSQueue_HP_relax_align();
254 void MSQueue_HP_seqcst_align();
255 void MSQueue_HP_Counted();
256 void MSQueue_HP_Counted_relax();
257 void MSQueue_HP_Counted_seqcst();
258 void MSQueue_HP_Counted_relax_align();
259 void MSQueue_HP_Counted_seqcst_align();
262 void MSQueue_DHP_relax();
263 void MSQueue_DHP_seqcst();
264 void MSQueue_DHP_relax_align();
265 void MSQueue_DHP_seqcst_align();
266 void MSQueue_DHP_Counted();
267 void MSQueue_DHP_Counted_relax();
268 void MSQueue_DHP_Counted_seqcst();
269 void MSQueue_DHP_Counted_relax_align();
270 void MSQueue_DHP_Counted_seqcst_align();
273 void MoirQueue_HP_relax();
274 void MoirQueue_HP_seqcst();
275 void MoirQueue_HP_relax_align();
276 void MoirQueue_HP_seqcst_align();
277 void MoirQueue_HP_Counted();
278 void MoirQueue_HP_Counted_relax();
279 void MoirQueue_HP_Counted_seqcst();
280 void MoirQueue_HP_Counted_relax_align();
281 void MoirQueue_HP_Counted_seqcst_align();
283 void MoirQueue_DHP();
284 void MoirQueue_DHP_relax();
285 void MoirQueue_DHP_seqcst();
286 void MoirQueue_DHP_relax_align();
287 void MoirQueue_DHP_seqcst_align();
288 void MoirQueue_DHP_Counted();
289 void MoirQueue_DHP_Counted_relax();
290 void MoirQueue_DHP_Counted_seqcst();
291 void MoirQueue_DHP_Counted_relax_align();
292 void MoirQueue_DHP_Counted_seqcst_align();
294 void OptimisticQueue_HP();
295 void OptimisticQueue_HP_relax();
296 void OptimisticQueue_HP_seqcst();
297 void OptimisticQueue_HP_relax_align();
298 void OptimisticQueue_HP_seqcst_align();
299 void OptimisticQueue_HP_Counted();
300 void OptimisticQueue_HP_Counted_relax();
301 void OptimisticQueue_HP_Counted_seqcst();
302 void OptimisticQueue_HP_Counted_relax_align();
303 void OptimisticQueue_HP_Counted_seqcst_align();
305 void OptimisticQueue_DHP();
306 void OptimisticQueue_DHP_relax();
307 void OptimisticQueue_DHP_seqcst();
308 void OptimisticQueue_DHP_relax_align();
309 void OptimisticQueue_DHP_seqcst_align();
310 void OptimisticQueue_DHP_Counted();
311 void OptimisticQueue_DHP_Counted_relax();
312 void OptimisticQueue_DHP_Counted_seqcst();
313 void OptimisticQueue_DHP_Counted_relax_align();
314 void OptimisticQueue_DHP_Counted_seqcst_align();
316 void BasketQueue_HP();
317 void BasketQueue_HP_relax();
318 void BasketQueue_HP_seqcst();
319 void BasketQueue_HP_relax_align();
320 void BasketQueue_HP_seqcst_align();
321 void BasketQueue_HP_Counted();
322 void BasketQueue_HP_Counted_relax();
323 void BasketQueue_HP_Counted_seqcst();
324 void BasketQueue_HP_Counted_relax_align();
325 void BasketQueue_HP_Counted_seqcst_align();
327 void BasketQueue_DHP();
328 void BasketQueue_DHP_relax();
329 void BasketQueue_DHP_seqcst();
330 void BasketQueue_DHP_relax_align();
331 void BasketQueue_DHP_seqcst_align();
332 void BasketQueue_DHP_Counted();
333 void BasketQueue_DHP_Counted_relax();
334 void BasketQueue_DHP_Counted_seqcst();
335 void BasketQueue_DHP_Counted_relax_align();
336 void BasketQueue_DHP_Counted_seqcst_align();
338 void RWQueue_default();
339 void RWQueue_mutex();
341 void RWQueue_ic_mutex();
343 void TsigasCycleQueue_static();
344 void TsigasCycleQueue_static_ic();
345 void TsigasCycleQueue_dyn();
346 void TsigasCycleQueue_dyn_ic();
348 void VyukovMPMCCycleQueue_static();
349 void VyukovMPMCCycleQueue_static_ic();
350 void VyukovMPMCCycleQueue_dyn();
351 void VyukovMPMCCycleQueue_dyn_ic();
353 CPPUNIT_TEST_SUITE( HdrTestQueue )
354 CPPUNIT_TEST(MSQueue_HP);
355 CPPUNIT_TEST(MSQueue_HP_relax);
356 CPPUNIT_TEST(MSQueue_HP_seqcst);
357 CPPUNIT_TEST(MSQueue_HP_relax_align);
358 CPPUNIT_TEST(MSQueue_HP_seqcst_align);
359 CPPUNIT_TEST(MSQueue_HP_Counted);
360 CPPUNIT_TEST(MSQueue_HP_Counted_relax);
361 CPPUNIT_TEST(MSQueue_HP_Counted_seqcst);
362 CPPUNIT_TEST(MSQueue_HP_Counted_relax_align);
363 CPPUNIT_TEST(MSQueue_HP_Counted_seqcst_align);
365 CPPUNIT_TEST(MSQueue_DHP);
366 CPPUNIT_TEST(MSQueue_DHP_relax);
367 CPPUNIT_TEST(MSQueue_DHP_seqcst);
368 CPPUNIT_TEST(MSQueue_DHP_relax_align);
369 CPPUNIT_TEST(MSQueue_DHP_seqcst_align);
370 CPPUNIT_TEST(MSQueue_DHP_Counted);
371 CPPUNIT_TEST(MSQueue_DHP_Counted_relax);
372 CPPUNIT_TEST(MSQueue_DHP_Counted_seqcst);
373 CPPUNIT_TEST(MSQueue_DHP_Counted_relax_align);
374 CPPUNIT_TEST(MSQueue_DHP_Counted_seqcst_align);
376 CPPUNIT_TEST(MoirQueue_HP);
377 CPPUNIT_TEST(MoirQueue_HP_relax);
378 CPPUNIT_TEST(MoirQueue_HP_seqcst);
379 CPPUNIT_TEST(MoirQueue_HP_relax_align);
380 CPPUNIT_TEST(MoirQueue_HP_seqcst_align);
381 CPPUNIT_TEST(MoirQueue_HP_Counted);
382 CPPUNIT_TEST(MoirQueue_HP_Counted_relax);
383 CPPUNIT_TEST(MoirQueue_HP_Counted_seqcst);
384 CPPUNIT_TEST(MoirQueue_HP_Counted_relax_align);
385 CPPUNIT_TEST(MoirQueue_HP_Counted_seqcst_align);
387 CPPUNIT_TEST(MoirQueue_DHP);
388 CPPUNIT_TEST(MoirQueue_DHP_relax);
389 CPPUNIT_TEST(MoirQueue_DHP_seqcst);
390 CPPUNIT_TEST(MoirQueue_DHP_relax_align);
391 CPPUNIT_TEST(MoirQueue_DHP_seqcst_align);
392 CPPUNIT_TEST(MoirQueue_DHP_Counted);
393 CPPUNIT_TEST(MoirQueue_DHP_Counted_relax);
394 CPPUNIT_TEST(MoirQueue_DHP_Counted_seqcst);
395 CPPUNIT_TEST(MoirQueue_DHP_Counted_relax_align);
396 CPPUNIT_TEST(MoirQueue_DHP_Counted_seqcst_align);
398 CPPUNIT_TEST(OptimisticQueue_HP);
399 CPPUNIT_TEST(OptimisticQueue_HP_relax);
400 CPPUNIT_TEST(OptimisticQueue_HP_seqcst);
401 CPPUNIT_TEST(OptimisticQueue_HP_relax_align);
402 CPPUNIT_TEST(OptimisticQueue_HP_seqcst_align);
403 CPPUNIT_TEST(OptimisticQueue_HP_Counted);
404 CPPUNIT_TEST(OptimisticQueue_HP_Counted_relax);
405 CPPUNIT_TEST(OptimisticQueue_HP_Counted_seqcst);
406 CPPUNIT_TEST(OptimisticQueue_HP_Counted_relax_align);
407 CPPUNIT_TEST(OptimisticQueue_HP_Counted_seqcst_align);
409 CPPUNIT_TEST(OptimisticQueue_DHP);
410 CPPUNIT_TEST(OptimisticQueue_DHP_relax);
411 CPPUNIT_TEST(OptimisticQueue_DHP_seqcst);
412 CPPUNIT_TEST(OptimisticQueue_DHP_relax_align);
413 CPPUNIT_TEST(OptimisticQueue_DHP_seqcst_align);
414 CPPUNIT_TEST(OptimisticQueue_DHP_Counted);
415 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_relax);
416 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_seqcst);
417 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_relax_align);
418 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_seqcst_align);
420 CPPUNIT_TEST(BasketQueue_HP);
421 CPPUNIT_TEST(BasketQueue_HP_relax);
422 CPPUNIT_TEST(BasketQueue_HP_seqcst);
423 CPPUNIT_TEST(BasketQueue_HP_relax_align);
424 CPPUNIT_TEST(BasketQueue_HP_seqcst_align);
425 CPPUNIT_TEST(BasketQueue_HP_Counted);
426 CPPUNIT_TEST(BasketQueue_HP_Counted_relax);
427 CPPUNIT_TEST(BasketQueue_HP_Counted_seqcst);
428 CPPUNIT_TEST(BasketQueue_HP_Counted_relax_align);
429 CPPUNIT_TEST(BasketQueue_HP_Counted_seqcst_align);
431 CPPUNIT_TEST(BasketQueue_DHP);
432 CPPUNIT_TEST(BasketQueue_DHP_relax);
433 CPPUNIT_TEST(BasketQueue_DHP_seqcst);
434 CPPUNIT_TEST(BasketQueue_DHP_relax_align);
435 CPPUNIT_TEST(BasketQueue_DHP_seqcst_align);
436 CPPUNIT_TEST(BasketQueue_DHP_Counted);
437 CPPUNIT_TEST(BasketQueue_DHP_Counted_relax);
438 CPPUNIT_TEST(BasketQueue_DHP_Counted_seqcst);
439 CPPUNIT_TEST(BasketQueue_DHP_Counted_relax_align);
440 CPPUNIT_TEST(BasketQueue_DHP_Counted_seqcst_align);
442 CPPUNIT_TEST( TsigasCycleQueue_static )
443 CPPUNIT_TEST( TsigasCycleQueue_static_ic )
444 CPPUNIT_TEST( TsigasCycleQueue_dyn )
445 CPPUNIT_TEST( TsigasCycleQueue_dyn_ic )
447 CPPUNIT_TEST( VyukovMPMCCycleQueue_static )
448 CPPUNIT_TEST( VyukovMPMCCycleQueue_static_ic )
449 CPPUNIT_TEST( VyukovMPMCCycleQueue_dyn )
450 CPPUNIT_TEST( VyukovMPMCCycleQueue_dyn_ic )
452 CPPUNIT_TEST( RWQueue_default)
453 CPPUNIT_TEST( RWQueue_mutex )
454 CPPUNIT_TEST( RWQueue_ic )
456 CPPUNIT_TEST_SUITE_END();
461 #endif // #ifndef CDSTEST_HDR_QUEUE_H