Move libcds 1.6.0 from SVN
[libcds.git] / tests / unit / queue / intrusive_queue_type.h
1 //$$CDS-header$$
2
3 #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
4 #define __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
5
6 #include <cds/intrusive/msqueue.h>
7 #include <cds/intrusive/moir_queue.h>
8 #include <cds/intrusive/optimistic_queue.h>
9 #include <cds/intrusive/tsigas_cycle_queue.h>
10 #include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
11 #include <cds/intrusive/basket_queue.h>
12 #include <cds/intrusive/fcqueue.h>
13 #include <cds/intrusive/michael_deque.h>
14 #include <cds/intrusive/segmented_queue.h>
15
16 #include <cds/gc/hp.h>
17 #include <cds/gc/hrc.h>
18 #include <cds/gc/ptb.h>
19
20 #include <boost/intrusive/slist.hpp>
21
22 #include "print_deque_stat.h"
23 #include "print_segmentedqueue_stat.h"
24
25 namespace queue {
26
27     namespace details {
28         struct empty_stat {};
29
30         // MichaelDeque, push right/pop left
31         template <typename GC, typename T, CDS_DECL_OPTIONS10>
32         class MichaelDequeR: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
33         {
34             typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
35         public:
36             MichaelDequeR( size_t nMaxItemCount )
37                 : base_class( (unsigned int) nMaxItemCount, 4 )
38             {}
39             MichaelDequeR()
40                 : base_class( 64 * 1024, 4 )
41             {}
42
43             bool push( T& v )
44             {
45                 return base_class::push_back( v );
46             }
47             bool enqueue( T& v )
48             {
49                 return push( v );
50             }
51
52             T * pop()
53             {
54                 return base_class::pop_front();
55             }
56             T * deque()
57             {
58                 return pop();
59             }
60         };
61
62         // MichaelDeque, push left/pop right
63         template <typename GC, typename T, CDS_DECL_OPTIONS10>
64         class MichaelDequeL: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
65         {
66             typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
67         public:
68             MichaelDequeL( size_t nMaxItemCount )
69                 : base_class( (unsigned int) nMaxItemCount, 4 )
70             {}
71             MichaelDequeL()
72                 : base_class( 64 * 1024, 4 )
73             {}
74
75             bool push( T& v )
76             {
77                 return base_class::push_front( v );
78             }
79             bool enqueue( T& v )
80             {
81                 return push( v );
82             }
83
84             T * pop()
85             {
86                 return base_class::pop_back();
87             }
88             T * deque()
89             {
90                 return pop();
91             }
92         };
93
94         template <typename T, typename Lock=cds_std::mutex>
95         class BoostSList
96         {
97             typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> >    slist_type;
98             typedef Lock lock_type;
99             typedef cds_std::lock_guard<lock_type> lock_guard;
100
101             slist_type  m_List;
102             mutable lock_type m_Lock;
103         public:
104             typedef T value_type;
105
106         public:
107             bool push( value_type& v )
108             {
109                 lock_guard l( m_Lock );
110                 m_List.push_back( v );
111                 return true;
112             }
113
114             bool enqueue( value_type& v )
115             {
116                 return push( v );
117             }
118
119             value_type * pop()
120             {
121                 lock_guard l( m_Lock );
122                 if ( m_List.empty() )
123                     return cds::null_ptr<T *>();
124                 value_type& v = m_List.front();
125                 m_List.pop_front();
126                 return &v;
127             }
128             value_type * deque()
129             {
130                 return pop();
131             }
132
133             bool empty() const
134             {
135                 lock_guard l( m_Lock );
136                 return m_List.empty();
137             }
138
139             size_t size() const
140             {
141                 lock_guard l( m_Lock );
142                 return m_List.size();
143             }
144
145             empty_stat statistics() const
146             {
147                 return empty_stat();
148             }
149         };
150     }
151
152     template <typename T>
153     struct Types {
154
155         // MSQueue
156         typedef cds::intrusive::MSQueue< cds::gc::HP, T
157             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
158         >   MSQueue_HP;
159
160         typedef cds::intrusive::MSQueue< cds::gc::HP, T
161             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
162             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
163         >   MSQueue_HP_seqcst;
164
165         typedef cds::intrusive::MSQueue< cds::gc::HRC, T
166             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
167         >   MSQueue_HRC;
168
169         typedef cds::intrusive::MSQueue< cds::gc::HRC, T
170             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
171             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
172         >   MSQueue_HRC_seqcst;
173
174         typedef cds::intrusive::MSQueue< cds::gc::PTB, T
175             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
176         >   MSQueue_PTB;
177
178         typedef cds::intrusive::MSQueue< cds::gc::PTB, T
179             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
180             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
181         >   MSQueue_PTB_seqcst;
182
183         // MSQueue + item counter
184         typedef cds::intrusive::MSQueue< cds::gc::HP, T
185             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
186             ,cds::opt::item_counter< cds::atomicity::item_counter >
187         >   MSQueue_HP_ic;
188
189         typedef cds::intrusive::MSQueue< cds::gc::HRC, T
190             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
191             ,cds::opt::item_counter< cds::atomicity::item_counter >
192         >   MSQueue_HRC_ic;
193
194         typedef cds::intrusive::MSQueue< cds::gc::PTB, T
195             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
196             ,cds::opt::item_counter< cds::atomicity::item_counter >
197         >   MSQueue_PTB_ic;
198
199         // MSQueue + stat
200         typedef cds::intrusive::MSQueue< cds::gc::HP, T
201             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
202             ,cds::opt::stat< cds::intrusive::queue_stat<> >
203         >   MSQueue_HP_stat;
204
205         typedef cds::intrusive::MSQueue< cds::gc::HRC, T
206             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
207             ,cds::opt::stat< cds::intrusive::queue_stat<> >
208         >   MSQueue_HRC_stat;
209
210         typedef cds::intrusive::MSQueue< cds::gc::PTB, T
211             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
212             ,cds::opt::stat< cds::intrusive::queue_stat<> >
213         >   MSQueue_PTB_stat;
214
215
216         // MoirQueue
217         typedef cds::intrusive::MoirQueue< cds::gc::HP, T
218             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
219         >   MoirQueue_HP;
220
221         typedef cds::intrusive::MoirQueue< cds::gc::HP, T
222             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
223             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
224         >   MoirQueue_HP_seqcst;
225
226         typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
227             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
228         >   MoirQueue_HRC;
229
230         typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
231             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
232             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
233         >   MoirQueue_HRC_seqcst;
234
235         typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
236             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
237         >   MoirQueue_PTB;
238
239         typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
240             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
241             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
242         >   MoirQueue_PTB_seqcst;
243
244         // MoirQueue + item counter
245         typedef cds::intrusive::MoirQueue< cds::gc::HP, T
246             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
247             ,cds::opt::item_counter< cds::atomicity::item_counter >
248         >   MoirQueue_HP_ic;
249
250         typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
251             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
252             ,cds::opt::item_counter< cds::atomicity::item_counter >
253         >   MoirQueue_HRC_ic;
254
255         typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
256             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
257             ,cds::opt::item_counter< cds::atomicity::item_counter >
258         >   MoirQueue_PTB_ic;
259
260         // MoirQueue + stat
261         typedef cds::intrusive::MoirQueue< cds::gc::HP, T
262             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
263             ,cds::opt::stat< cds::intrusive::queue_stat<> >
264         >   MoirQueue_HP_stat;
265
266         typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
267             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
268             ,cds::opt::stat< cds::intrusive::queue_stat<> >
269         >   MoirQueue_HRC_stat;
270
271         typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
272             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
273             ,cds::opt::stat< cds::intrusive::queue_stat<> >
274         >   MoirQueue_PTB_stat;
275
276         // OptimisticQueue
277         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
278             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
279         >   OptimisticQueue_HP;
280
281         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
282             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
283             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
284         >   OptimisticQueue_HP_seqcst;
285
286         typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
287             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
288         >   OptimisticQueue_PTB;
289
290         typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
291             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
292             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
293         >   OptimisticQueue_PTB_seqcst;
294
295
296         // OptimisticQueue + item counter
297         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
298             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
299             ,cds::opt::item_counter< cds::atomicity::item_counter >
300         >   OptimisticQueue_HP_ic;
301
302         typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
303             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
304             ,cds::opt::item_counter< cds::atomicity::item_counter >
305         >   OptimisticQueue_PTB_ic;
306
307         // OptimisticQueue + stat
308         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
309             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
310             ,cds::opt::stat< cds::intrusive::queue_stat<> >
311         >   OptimisticQueue_HP_stat;
312
313         typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
314             ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
315             ,cds::opt::stat< cds::intrusive::queue_stat<> >
316         >   OptimisticQueue_PTB_stat;
317
318         // TsigasCycleQueue
319         class TsigasCycleQueue_dyn
320             : public cds::intrusive::TsigasCycleQueue< T
321                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
322             >
323         {
324             typedef cds::intrusive::TsigasCycleQueue< T
325                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
326             > base_class;
327         public:
328             TsigasCycleQueue_dyn()
329                 : base_class( 1024 * 64 )
330             {}
331
332             TsigasCycleQueue_dyn( size_t nCapacity )
333                 : base_class( nCapacity )
334             {}
335
336             cds::opt::none statistics() const
337             {
338                 return cds::opt::none();
339             }
340         };
341
342         class TsigasCycleQueue_dyn_ic
343             : public cds::intrusive::TsigasCycleQueue< T
344                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
345                 ,cds::opt::item_counter< cds::atomicity::item_counter >
346             >
347         {
348             typedef cds::intrusive::TsigasCycleQueue< T
349                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
350                 ,cds::opt::item_counter< cds::atomicity::item_counter >
351             > base_class;
352         public:
353             TsigasCycleQueue_dyn_ic()
354                 : base_class( 1024 * 64 )
355             {}
356             TsigasCycleQueue_dyn_ic( size_t nCapacity )
357                 : base_class( nCapacity )
358             {}
359
360             cds::opt::none statistics() const
361             {
362                 return cds::opt::none();
363             }
364         };
365
366         // VyukovMPMCCycleQueue
367         class VyukovMPMCCycleQueue_dyn
368             : public cds::intrusive::VyukovMPMCCycleQueue< T
369                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
370             >
371         {
372             typedef cds::intrusive::VyukovMPMCCycleQueue< T
373                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
374             > base_class;
375         public:
376             VyukovMPMCCycleQueue_dyn()
377                 : base_class( 1024 * 64 )
378             {}
379             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
380                 : base_class( nCapacity )
381             {}
382
383             cds::opt::none statistics() const
384             {
385                 return cds::opt::none();
386             }
387         };
388
389         class VyukovMPMCCycleQueue_dyn_ic
390             : public cds::intrusive::VyukovMPMCCycleQueue< T
391                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
392                 ,cds::opt::item_counter< cds::atomicity::item_counter >
393             >
394         {
395             typedef cds::intrusive::VyukovMPMCCycleQueue< T
396                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
397                 ,cds::opt::item_counter< cds::atomicity::item_counter >
398             > base_class;
399         public:
400             VyukovMPMCCycleQueue_dyn_ic()
401                 : base_class( 1024 * 64 )
402             {}
403             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
404                 : base_class( nCapacity )
405             {}
406
407             cds::opt::none statistics() const
408             {
409                 return cds::opt::none();
410             }
411         };
412
413
414         // MichaelDeque
415         typedef details::MichaelDequeR< cds::gc::HP, T
416             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
417         >    MichaelDequeR_HP;
418         typedef details::MichaelDequeR< cds::gc::HP, T
419             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
420             ,cds::opt::item_counter< cds::atomicity::item_counter >
421         >    MichaelDequeR_HP_ic;
422         typedef details::MichaelDequeR< cds::gc::HP, T
423             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
424             ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
425         >    MichaelDequeR_HP_stat;
426
427         typedef details::MichaelDequeR< cds::gc::PTB, T
428             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
429         >    MichaelDequeR_PTB;
430         typedef details::MichaelDequeR< cds::gc::PTB, T
431             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
432             ,cds::opt::item_counter< cds::atomicity::item_counter >
433         >    MichaelDequeR_PTB_ic;
434         typedef details::MichaelDequeR< cds::gc::PTB, T
435             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
436             ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
437         >    MichaelDequeR_PTB_stat;
438
439         typedef details::MichaelDequeL< cds::gc::HP, T
440             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
441         >    MichaelDequeL_HP;
442         typedef details::MichaelDequeL< cds::gc::HP, T
443             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
444             ,cds::opt::item_counter< cds::atomicity::item_counter >
445         >    MichaelDequeL_HP_ic;
446         typedef details::MichaelDequeL< cds::gc::HP, T
447             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
448             ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
449         >    MichaelDequeL_HP_stat;
450
451
452         typedef details::MichaelDequeL< cds::gc::PTB, T
453             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
454         >    MichaelDequeL_PTB;
455         typedef details::MichaelDequeL< cds::gc::PTB, T
456             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
457             ,cds::opt::item_counter< cds::atomicity::item_counter >
458         >    MichaelDequeL_PTB_ic;
459         typedef details::MichaelDequeL< cds::gc::PTB, T
460             ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
461             ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
462         >    MichaelDequeL_PTB_stat;
463
464         // BasketQueue
465         typedef cds::intrusive::BasketQueue< cds::gc::HP, T
466             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
467         >   BasketQueue_HP;
468
469         typedef cds::intrusive::BasketQueue<cds::gc::HP, T
470             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
471             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
472         >   BasketQueue_HP_seqcst;
473
474         typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
475             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
476         >   BasketQueue_HRC;
477
478         typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
479             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
480             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
481         >   BasketQueue_HRC_seqcst;
482
483         typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
484             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
485         >   BasketQueue_PTB;
486
487         typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
488             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
489             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
490         >   BasketQueue_PTB_seqcst;
491
492         // BasketQueue + item counter
493         typedef cds::intrusive::BasketQueue< cds::gc::HP, T
494             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
495             ,cds::opt::item_counter< cds::atomicity::item_counter >
496         >   BasketQueue_HP_ic;
497
498         typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
499             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
500             ,cds::opt::item_counter< cds::atomicity::item_counter >
501         >   BasketQueue_HRC_ic;
502
503         typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
504             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
505             ,cds::opt::item_counter< cds::atomicity::item_counter >
506         >   BasketQueue_PTB_ic;
507
508         // BasketQueue + stat
509         typedef cds::intrusive::BasketQueue< cds::gc::HP, T
510             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
511             ,cds::opt::stat< cds::intrusive::queue_stat<> >
512         >   BasketQueue_HP_stat;
513
514         typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
515             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
516             ,cds::opt::stat< cds::intrusive::queue_stat<> >
517         >   BasketQueue_HRC_stat;
518
519         typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
520             ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
521             ,cds::opt::stat< cds::intrusive::queue_stat<> >
522         >   BasketQueue_PTB_stat;
523
524         // FCQueue
525         class traits_FCQueue_delay2:
526             public cds::intrusive::fcqueue::make_traits<
527                 cds::opt::back_off< cds::backoff::delay_of<2> >
528             >::type
529         {};
530         class traits_FCQueue_delay2_elimination:
531             public cds::intrusive::fcqueue::make_traits<
532                 cds::opt::back_off< cds::backoff::delay_of<2> >
533                 ,cds::opt::enable_elimination< true >
534             >::type
535         {};
536         class traits_FCQueue_delay2_elimination_stat:
537             public cds::intrusive::fcqueue::make_traits<
538                 cds::opt::back_off< cds::backoff::delay_of<2> >
539                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
540                 ,cds::opt::enable_elimination< true >
541             >::type
542         {};
543         class traits_FCQueue_expbackoff_elimination:
544             public cds::intrusive::fcqueue::make_traits<
545                 cds::opt::enable_elimination< true >
546                 ,cds::opt::elimination_backoff< cds::backoff::Default >
547             >::type
548         {};
549         class traits_FCQueue_expbackoff_elimination_stat:
550             public cds::intrusive::fcqueue::make_traits<
551                 cds::opt::enable_elimination< true >
552                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
553                 ,cds::opt::elimination_backoff< cds::backoff::Default >
554             >::type
555         {};
556
557         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
558         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
559         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
560         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
561         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
562
563         // SegmentedQueue
564         class traits_SegmentedQueue_spin_stat:
565             public cds::intrusive::segmented_queue::make_traits<
566                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
567             >::type
568         {};
569         class traits_SegmentedQueue_mutex_stat:
570             public cds::intrusive::segmented_queue::make_traits<
571                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
572                 ,cds::opt::lock_type< cds_std::mutex >
573             >::type
574         {};
575         class traits_SegmentedQueue_mutex:
576             public cds::intrusive::segmented_queue::make_traits<
577                 cds::opt::lock_type< cds_std::mutex >
578             >::type
579         {};
580
581         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
582         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
583         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
584         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
585
586         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T >  SegmentedQueue_PTB_spin;
587         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
588         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
589         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
590
591         // Boost SList
592         typedef details::BoostSList< T, cds_std::mutex >    BoostSList_mutex;
593         typedef details::BoostSList< T, cds::lock::Spin >   BoostSList_spin;
594     };
595 }
596
597
598 // *********************************************
599 // Queue statistics
600 namespace std {
601
602     // cds::intrusive::queue_stat
603     template <typename Counter>
604     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
605     {
606         return o
607             << "\tStatistics:\n"
608             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
609             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
610             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
611             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
612             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
613             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
614 ;
615     }
616
617     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
618     {
619         return o;
620     }
621
622     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
623     {
624         return o;
625     }
626
627     // cds::intrusive::optimistic_queue::stat
628     template <typename Counter>
629     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
630     {
631         return o
632             << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
633             << "\t\t"
634             << "\t\t    fix list call: " << s.m_FixListCount.get() << "\n";
635     }
636
637     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
638     {
639         return o;
640     }
641
642     // cds::intrusive::basket_queue::stat
643     template <typename Counter>
644     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
645     {
646         return o
647             << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
648             << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
649             << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
650     }
651
652     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
653     {
654         return o;
655     }
656
657     // cds::intrusive::fcqueue::stat
658     template <typename Counter>
659     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
660     {
661             return o << "\tStatistics:\n"
662                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
663                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
664                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
665                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
666                 << "\tFlat combining statistics:\n"
667                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
668                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
669                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
670                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
671                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
672                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
673                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
674                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
675                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
676                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
677     }
678
679     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
680     {
681         return o;
682     }
683
684     static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
685     {
686         return o;
687     }
688
689 } // namespace std
690
691 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H