3 #ifndef __CDSUNIT_QUEUE_HDR_H
4 #define __CDSUNIT_QUEUE_HDR_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 );
204 void MSQueue_HP_relax();
205 void MSQueue_HP_seqcst();
206 void MSQueue_HP_relax_align();
207 void MSQueue_HP_seqcst_align();
208 void MSQueue_HP_Counted();
209 void MSQueue_HP_Counted_relax();
210 void MSQueue_HP_Counted_seqcst();
211 void MSQueue_HP_Counted_relax_align();
212 void MSQueue_HP_Counted_seqcst_align();
215 void MSQueue_DHP_relax();
216 void MSQueue_DHP_seqcst();
217 void MSQueue_DHP_relax_align();
218 void MSQueue_DHP_seqcst_align();
219 void MSQueue_DHP_Counted();
220 void MSQueue_DHP_Counted_relax();
221 void MSQueue_DHP_Counted_seqcst();
222 void MSQueue_DHP_Counted_relax_align();
223 void MSQueue_DHP_Counted_seqcst_align();
226 void MoirQueue_HP_relax();
227 void MoirQueue_HP_seqcst();
228 void MoirQueue_HP_relax_align();
229 void MoirQueue_HP_seqcst_align();
230 void MoirQueue_HP_Counted();
231 void MoirQueue_HP_Counted_relax();
232 void MoirQueue_HP_Counted_seqcst();
233 void MoirQueue_HP_Counted_relax_align();
234 void MoirQueue_HP_Counted_seqcst_align();
236 void MoirQueue_DHP();
237 void MoirQueue_DHP_relax();
238 void MoirQueue_DHP_seqcst();
239 void MoirQueue_DHP_relax_align();
240 void MoirQueue_DHP_seqcst_align();
241 void MoirQueue_DHP_Counted();
242 void MoirQueue_DHP_Counted_relax();
243 void MoirQueue_DHP_Counted_seqcst();
244 void MoirQueue_DHP_Counted_relax_align();
245 void MoirQueue_DHP_Counted_seqcst_align();
247 void OptimisticQueue_HP();
248 void OptimisticQueue_HP_relax();
249 void OptimisticQueue_HP_seqcst();
250 void OptimisticQueue_HP_relax_align();
251 void OptimisticQueue_HP_seqcst_align();
252 void OptimisticQueue_HP_Counted();
253 void OptimisticQueue_HP_Counted_relax();
254 void OptimisticQueue_HP_Counted_seqcst();
255 void OptimisticQueue_HP_Counted_relax_align();
256 void OptimisticQueue_HP_Counted_seqcst_align();
258 void OptimisticQueue_DHP();
259 void OptimisticQueue_DHP_relax();
260 void OptimisticQueue_DHP_seqcst();
261 void OptimisticQueue_DHP_relax_align();
262 void OptimisticQueue_DHP_seqcst_align();
263 void OptimisticQueue_DHP_Counted();
264 void OptimisticQueue_DHP_Counted_relax();
265 void OptimisticQueue_DHP_Counted_seqcst();
266 void OptimisticQueue_DHP_Counted_relax_align();
267 void OptimisticQueue_DHP_Counted_seqcst_align();
269 void BasketQueue_HP();
270 void BasketQueue_HP_relax();
271 void BasketQueue_HP_seqcst();
272 void BasketQueue_HP_relax_align();
273 void BasketQueue_HP_seqcst_align();
274 void BasketQueue_HP_Counted();
275 void BasketQueue_HP_Counted_relax();
276 void BasketQueue_HP_Counted_seqcst();
277 void BasketQueue_HP_Counted_relax_align();
278 void BasketQueue_HP_Counted_seqcst_align();
280 void BasketQueue_DHP();
281 void BasketQueue_DHP_relax();
282 void BasketQueue_DHP_seqcst();
283 void BasketQueue_DHP_relax_align();
284 void BasketQueue_DHP_seqcst_align();
285 void BasketQueue_DHP_Counted();
286 void BasketQueue_DHP_Counted_relax();
287 void BasketQueue_DHP_Counted_seqcst();
288 void BasketQueue_DHP_Counted_relax_align();
289 void BasketQueue_DHP_Counted_seqcst_align();
291 void RWQueue_default();
292 void RWQueue_mutex();
294 void RWQueue_ic_mutex();
297 void FCQueue_deque();
298 void FCQueue_deque_elimination();
299 void FCQueue_deque_mutex();
300 void FCQueue_deque_stat();
302 void FCQueue_list_elimination();
303 void FCQueue_list_mutex();
304 void FCQueue_list_stat();
306 void Vyukov_MPMCCyclicQueue();
307 void Vyukov_MPMCCyclicQueue_Counted();
311 CPPUNIT_TEST_SUITE( HdrTestQueue )
312 CPPUNIT_TEST(MSQueue_HP);
313 CPPUNIT_TEST(MSQueue_HP_relax);
314 CPPUNIT_TEST(MSQueue_HP_seqcst);
315 CPPUNIT_TEST(MSQueue_HP_relax_align);
316 CPPUNIT_TEST(MSQueue_HP_seqcst_align);
317 CPPUNIT_TEST(MSQueue_HP_Counted);
318 CPPUNIT_TEST(MSQueue_HP_Counted_relax);
319 CPPUNIT_TEST(MSQueue_HP_Counted_seqcst);
320 CPPUNIT_TEST(MSQueue_HP_Counted_relax_align);
321 CPPUNIT_TEST(MSQueue_HP_Counted_seqcst_align);
323 CPPUNIT_TEST(MSQueue_DHP);
324 CPPUNIT_TEST(MSQueue_DHP_relax);
325 CPPUNIT_TEST(MSQueue_DHP_seqcst);
326 CPPUNIT_TEST(MSQueue_DHP_relax_align);
327 CPPUNIT_TEST(MSQueue_DHP_seqcst_align);
328 CPPUNIT_TEST(MSQueue_DHP_Counted);
329 CPPUNIT_TEST(MSQueue_DHP_Counted_relax);
330 CPPUNIT_TEST(MSQueue_DHP_Counted_seqcst);
331 CPPUNIT_TEST(MSQueue_DHP_Counted_relax_align);
332 CPPUNIT_TEST(MSQueue_DHP_Counted_seqcst_align);
334 CPPUNIT_TEST(MoirQueue_HP);
335 CPPUNIT_TEST(MoirQueue_HP_relax);
336 CPPUNIT_TEST(MoirQueue_HP_seqcst);
337 CPPUNIT_TEST(MoirQueue_HP_relax_align);
338 CPPUNIT_TEST(MoirQueue_HP_seqcst_align);
339 CPPUNIT_TEST(MoirQueue_HP_Counted);
340 CPPUNIT_TEST(MoirQueue_HP_Counted_relax);
341 CPPUNIT_TEST(MoirQueue_HP_Counted_seqcst);
342 CPPUNIT_TEST(MoirQueue_HP_Counted_relax_align);
343 CPPUNIT_TEST(MoirQueue_HP_Counted_seqcst_align);
345 CPPUNIT_TEST(MoirQueue_DHP);
346 CPPUNIT_TEST(MoirQueue_DHP_relax);
347 CPPUNIT_TEST(MoirQueue_DHP_seqcst);
348 CPPUNIT_TEST(MoirQueue_DHP_relax_align);
349 CPPUNIT_TEST(MoirQueue_DHP_seqcst_align);
350 CPPUNIT_TEST(MoirQueue_DHP_Counted);
351 CPPUNIT_TEST(MoirQueue_DHP_Counted_relax);
352 CPPUNIT_TEST(MoirQueue_DHP_Counted_seqcst);
353 CPPUNIT_TEST(MoirQueue_DHP_Counted_relax_align);
354 CPPUNIT_TEST(MoirQueue_DHP_Counted_seqcst_align);
356 CPPUNIT_TEST(OptimisticQueue_HP);
357 CPPUNIT_TEST(OptimisticQueue_HP_relax);
358 CPPUNIT_TEST(OptimisticQueue_HP_seqcst);
359 CPPUNIT_TEST(OptimisticQueue_HP_relax_align);
360 CPPUNIT_TEST(OptimisticQueue_HP_seqcst_align);
361 CPPUNIT_TEST(OptimisticQueue_HP_Counted);
362 CPPUNIT_TEST(OptimisticQueue_HP_Counted_relax);
363 CPPUNIT_TEST(OptimisticQueue_HP_Counted_seqcst);
364 CPPUNIT_TEST(OptimisticQueue_HP_Counted_relax_align);
365 CPPUNIT_TEST(OptimisticQueue_HP_Counted_seqcst_align);
367 CPPUNIT_TEST(OptimisticQueue_DHP);
368 CPPUNIT_TEST(OptimisticQueue_DHP_relax);
369 CPPUNIT_TEST(OptimisticQueue_DHP_seqcst);
370 CPPUNIT_TEST(OptimisticQueue_DHP_relax_align);
371 CPPUNIT_TEST(OptimisticQueue_DHP_seqcst_align);
372 CPPUNIT_TEST(OptimisticQueue_DHP_Counted);
373 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_relax);
374 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_seqcst);
375 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_relax_align);
376 CPPUNIT_TEST(OptimisticQueue_DHP_Counted_seqcst_align);
378 CPPUNIT_TEST(BasketQueue_HP);
379 CPPUNIT_TEST(BasketQueue_HP_relax);
380 CPPUNIT_TEST(BasketQueue_HP_seqcst);
381 CPPUNIT_TEST(BasketQueue_HP_relax_align);
382 CPPUNIT_TEST(BasketQueue_HP_seqcst_align);
383 CPPUNIT_TEST(BasketQueue_HP_Counted);
384 CPPUNIT_TEST(BasketQueue_HP_Counted_relax);
385 CPPUNIT_TEST(BasketQueue_HP_Counted_seqcst);
386 CPPUNIT_TEST(BasketQueue_HP_Counted_relax_align);
387 CPPUNIT_TEST(BasketQueue_HP_Counted_seqcst_align);
389 CPPUNIT_TEST(BasketQueue_DHP);
390 CPPUNIT_TEST(BasketQueue_DHP_relax);
391 CPPUNIT_TEST(BasketQueue_DHP_seqcst);
392 CPPUNIT_TEST(BasketQueue_DHP_relax_align);
393 CPPUNIT_TEST(BasketQueue_DHP_seqcst_align);
394 CPPUNIT_TEST(BasketQueue_DHP_Counted);
395 CPPUNIT_TEST(BasketQueue_DHP_Counted_relax);
396 CPPUNIT_TEST(BasketQueue_DHP_Counted_seqcst);
397 CPPUNIT_TEST(BasketQueue_DHP_Counted_relax_align);
398 CPPUNIT_TEST(BasketQueue_DHP_Counted_seqcst_align);
400 CPPUNIT_TEST(FCQueue_deque)
401 CPPUNIT_TEST(FCQueue_deque_elimination)
402 CPPUNIT_TEST(FCQueue_deque_mutex)
403 CPPUNIT_TEST(FCQueue_deque_stat)
404 CPPUNIT_TEST(FCQueue_list)
405 CPPUNIT_TEST(FCQueue_list_elimination)
406 CPPUNIT_TEST(FCQueue_list_mutex)
407 CPPUNIT_TEST(FCQueue_list_stat)
409 CPPUNIT_TEST(Vyukov_MPMCCyclicQueue);
410 CPPUNIT_TEST(Vyukov_MPMCCyclicQueue_Counted);
412 CPPUNIT_TEST( RWQueue_default)
413 CPPUNIT_TEST( RWQueue_mutex )
414 CPPUNIT_TEST( RWQueue_ic )
416 CPPUNIT_TEST_SUITE_END();
421 #endif // #ifndef __CDSUNIT_QUEUE_HDR_H