RWQueue refactoring
[libcds.git] / tests / test-hdr / queue / hdr_queue_new.h
1 //$$CDS-header$$
2
3 #ifndef __CDSUNIT_QUEUE_HDR_H
4 #define __CDSUNIT_QUEUE_HDR_H
5
6 #include "cppunit/cppunit_proxy.h"
7 #include <cds/details/defs.h>
8
9 namespace queue {
10
11     //
12     // Test queue operation in single thread mode
13     //
14     class HdrTestQueue: public CppUnitMini::TestCase
15     {
16     protected:
17         template <class Queue>
18         void test_no_ic()
19         {
20             Queue   q;
21             test_with( q );
22             test_emplace( q );
23         }
24
25         template <class Queue>
26         void test_with( Queue& q )
27         {
28             int     it;
29             int     nPrev;
30
31             // push/pop
32             for ( size_t i = 0; i < 3; ++i ) {
33                 CPPUNIT_ASSERT( q.empty() );
34 #ifndef _DEBUG
35                 CPPUNIT_ASSERT( q.size() == 0 );
36 #endif
37                 CPPUNIT_ASSERT( q.enqueue( 1 ) );
38                 CPPUNIT_ASSERT( !q.empty() );
39                 CPPUNIT_ASSERT( q.push( 10 ) );
40                 CPPUNIT_ASSERT( !q.empty() );
41 #ifndef _DEBUG
42                 CPPUNIT_ASSERT( q.size() == 0 )     ;   // no queue's item counter!
43 #endif
44
45                 it = -1;
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 );
51 #ifndef _DEBUG
52                 CPPUNIT_ASSERT( q.size() == 0 );
53 #endif
54                 CPPUNIT_ASSERT( q.empty() );
55                 it += 2009;
56                 nPrev = it;
57                 CPPUNIT_ASSERT( !q.dequeue( it ) );
58                 CPPUNIT_ASSERT( it == nPrev )       ;   // it must not be changed!
59             }
60
61             // push_with/pop_with
62             for ( size_t i = 0; i < 3; ++i ) {
63                 CPPUNIT_ASSERT( q.empty() );
64 #ifndef _DEBUG
65                 CPPUNIT_ASSERT( q.size() == 0 );
66 #endif
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() );
71 #ifndef _DEBUG
72                 CPPUNIT_ASSERT( q.size() == 0 );   // no queue's item counter!
73 #endif
74
75                 it = -1;
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 );
81 #ifndef _DEBUG
82                 CPPUNIT_ASSERT( q.size() == 0 );
83 #endif
84                 CPPUNIT_ASSERT( q.empty() );
85                 it += 2009;
86                 nPrev = it;
87                 CPPUNIT_ASSERT( !q.dequeue_with( [&it]( int src ) { it = src; } ));
88                 CPPUNIT_ASSERT( it == nPrev );   // it must not be changed!
89             }
90         }
91
92         template <class Queue>
93         void test_emplace( Queue& q )
94         {
95             int     it;
96             for ( size_t i = 0; i < 3; ++i ) {
97                 CPPUNIT_ASSERT( q.emplace( static_cast<int>( i * 42 )) );
98                 CPPUNIT_ASSERT( !q.empty() );
99                 it = -1;
100                 CPPUNIT_ASSERT( q.pop( it ));
101                 CPPUNIT_ASSERT( it == static_cast<int>( i * 42 ));
102                 CPPUNIT_ASSERT( q.empty() );
103             }
104         }
105
106         template <class Queue>
107         void test_ic()
108         {
109             Queue   q;
110             test_ic_with( q );
111             test_emplace_ic( q );
112         }
113
114         template <class Queue>
115         void testFCQueue()
116         {
117             Queue   q;
118             test_ic_with( q );
119         }
120
121         template <class Queue>
122         void test_ic_with( Queue& q )
123         {
124             int     it;
125             int     nPrev;
126
127             // push/pop
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 );
137
138                 it = -1;
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 );
148                 it += 2009;
149                 nPrev = it;
150                 CPPUNIT_ASSERT( !q.dequeue( it ) );
151                 CPPUNIT_ASSERT( it == nPrev )       ;   // it must not be changed!
152
153                 CPPUNIT_ASSERT( q.empty() );
154                 CPPUNIT_ASSERT( q.size() == 0 );
155             }
156
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 );
167
168                 it = -1;
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() );
177                 it += 2009;
178                 nPrev = it;
179                 CPPUNIT_ASSERT( !q.dequeue_with( [&it]( int src ) { it = src; } ) );
180                 CPPUNIT_ASSERT( it == nPrev );   // it must not be changed!
181
182                 CPPUNIT_ASSERT( q.size() == 0 );
183                 CPPUNIT_ASSERT( q.empty() );
184             }
185         }
186
187         template <class Queue>
188         void test_emplace_ic( Queue& q )
189         {
190             int     it = 0;
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 );
199             }
200         }
201
202     public:
203         void MSQueue_HP();
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();
213
214         void MSQueue_DHP();
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();
224
225         void MoirQueue_HP();
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();
235
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();
246
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();
257
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();
268
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();
279
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();
290
291         void RWQueue_default();
292         void RWQueue_mutex();
293         void RWQueue_ic();
294         void RWQueue_ic_mutex();
295
296         /*
297         void FCQueue_deque();
298         void FCQueue_deque_elimination();
299         void FCQueue_deque_mutex();
300         void FCQueue_deque_stat();
301         void FCQueue_list();
302         void FCQueue_list_elimination();
303         void FCQueue_list_mutex();
304         void FCQueue_list_stat();
305
306         void Vyukov_MPMCCyclicQueue();
307         void Vyukov_MPMCCyclicQueue_Counted();
308
309 */
310
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);
322
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);
333
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);
344
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);
355
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);
366
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);
377
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);
388
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);
399 /*
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)
408
409             CPPUNIT_TEST(Vyukov_MPMCCyclicQueue);
410             CPPUNIT_TEST(Vyukov_MPMCCyclicQueue_Counted);
411 */
412             CPPUNIT_TEST( RWQueue_default)
413             CPPUNIT_TEST( RWQueue_mutex )
414             CPPUNIT_TEST( RWQueue_ic )
415
416         CPPUNIT_TEST_SUITE_END();
417
418     };
419 } // namespace queue
420
421 #endif // #ifndef __CDSUNIT_QUEUE_HDR_H