BasketQueue refactoring (issues #1, #2, #3)
[libcds.git] / tests / unit / queue / queue_type.h
1 //$$CDS-header$$
2
3 #ifndef __CDSUNIT_QUEUE_TYPES_H
4 #define __CDSUNIT_QUEUE_TYPES_H
5
6 #include <cds/container/msqueue.h>
7 #include <cds/container/moir_queue.h>
8 #include <cds/container/rwqueue.h>
9 #include <cds/container/optimistic_queue.h>
10 #include <cds/container/tsigas_cycle_queue.h>
11 #include <cds/container/vyukov_mpmc_cycle_queue.h>
12 #include <cds/container/basket_queue.h>
13 #include <cds/container/fcqueue.h>
14 #include <cds/container/fcdeque.h>
15 #include <cds/container/segmented_queue.h>
16
17 #include <cds/gc/hp.h>
18 #include <cds/gc/hrc.h> //TODO: remove this line!
19 #include <cds/gc/dhp.h>
20
21 #include "queue/std_queue.h"
22 #include "lock/win32_lock.h"
23 #include "michael_alloc.h"
24 #include "print_segmentedqueue_stat.h"
25
26 #include <boost/container/deque.hpp>
27
28 namespace queue {
29     namespace details {
30         template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque=std::deque<T> >
31         class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
32         {
33             typedef cds::container::FCDeque<T, Deque, Traits > base_class;
34         public:
35             FCDequeL()
36             {}
37
38             FCDequeL(
39                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
40                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
41                 )
42                 : base_class( nCompactFactor, nCombinePassCount )
43             {}
44
45             bool push( T const& v )
46             {
47                 return base_class::push_front( v );
48             }
49             bool enqueue( T const& v )
50             {
51                 return push( v );
52             }
53
54             bool pop( T& v )
55             {
56                 return base_class::pop_back( v );
57             }
58             bool deque( T& v )
59             {
60                 return pop(v);
61             }
62         };
63
64         template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque = std::deque<T> >
65         class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
66         {
67             typedef cds::container::FCDeque<T, Deque, Traits > base_class;
68         public:
69             FCDequeR()
70             {}
71
72             FCDequeR(
73                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
74                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
75                 )
76                 : base_class( nCompactFactor, nCombinePassCount )
77             {}
78
79             bool push( T const& v )
80             {
81                 return base_class::push_back( v );
82             }
83             bool enqueue( T const& v )
84             {
85                 return push( v );
86             }
87
88             bool pop( T& v )
89             {
90                 return base_class::pop_front( v );
91             }
92             bool deque( T& v )
93             {
94                 return pop(v);
95             }
96         };
97
98     } // namespace details
99
100     template <typename Value>
101     struct Types {
102
103         // MSQueue
104         typedef cds::container::MSQueue<cds::gc::HP,  Value > MSQueue_HP;
105         typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
106         typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
107         typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
108
109         struct traits_MSQueue_michaelAlloc : public cds::container::msqueue::traits
110         {
111             typedef memory::MichaelAllocator<int>  allocator;
112         };
113         typedef cds::container::MSQueue<cds::gc::HP,  Value, traits_MSQueue_michaelAlloc > MSQueue_HP_michaelAlloc;
114         typedef cds::container::MSQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MSQueue_DHP_michaelAlloc;
115         typedef cds::container::MoirQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MoirQueue_HP_michaelAlloc;
116         typedef cds::container::MoirQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MoirQueue_DHP_michaelAlloc;
117
118         struct traits_MSQueue_seqcst : public
119             cds::container::msqueue::make_traits <
120                 cds::opt::memory_model < cds::opt::v::sequential_consistent >
121             > ::type
122         {};
123         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
124         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
125         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
126         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
127
128         // MSQueue + item counter
129         struct traits_MSQueue_ic : public
130             cds::container::msqueue::make_traits <
131                 cds::opt::item_counter < cds::atomicity::item_counter >
132             >::type
133         {};
134         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_ic > MSQueue_HP_ic;
135         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
136         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
137         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
138
139         // MSQueue + stat
140         struct traits_MSQueue_stat: public 
141             cds::container::msqueue::make_traits <
142                 cds::opt::stat< cds::container::msqueue::stat<> >
143             >::type
144         {};
145         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_stat > MSQueue_HP_stat;
146         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
147         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
148         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
149
150
151         // OptimisticQueue
152         typedef cds::container::OptimisticQueue< cds::gc::HP,
153             Value
154         >   OptimisticQueue_HP;
155
156         typedef cds::container::OptimisticQueue< cds::gc::HP,
157             Value
158             ,cds::opt::allocator< memory::MichaelAllocator<int> >
159         >   OptimisticQueue_HP_michaelAlloc;
160
161         typedef cds::container::OptimisticQueue< cds::gc::HP,
162             Value
163             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
164         >   OptimisticQueue_HP_seqcst;
165
166         typedef cds::container::OptimisticQueue< cds::gc::PTB,
167             Value
168         >   OptimisticQueue_PTB;
169
170         typedef cds::container::OptimisticQueue< cds::gc::PTB,
171             Value
172             ,cds::opt::allocator< memory::MichaelAllocator<int> >
173         >   OptimisticQueue_PTB_michaelAlloc;
174
175         typedef cds::container::OptimisticQueue< cds::gc::PTB,
176             Value
177             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
178         >   OptimisticQueue_PTB_seqcst;
179
180
181         // OptimisticQueue + item counter
182         typedef cds::container::OptimisticQueue< cds::gc::HP,
183             Value
184             ,cds::opt::item_counter< cds::atomicity::item_counter >
185         >   OptimisticQueue_HP_ic;
186
187         typedef cds::container::OptimisticQueue< cds::gc::PTB,
188             Value
189             ,cds::opt::item_counter< cds::atomicity::item_counter >
190         >   OptimisticQueue_PTB_ic;
191
192         // OptimisticQueue + stat
193         typedef cds::container::OptimisticQueue< cds::gc::HP,
194             Value
195             ,cds::opt::stat< cds::intrusive::queue_stat<> >
196         >   OptimisticQueue_HP_stat;
197
198         typedef cds::container::OptimisticQueue< cds::gc::PTB,
199             Value
200             ,cds::opt::stat< cds::intrusive::queue_stat<> >
201         >   OptimisticQueue_PTB_stat;
202
203         // TsigasCycleQueue
204         class TsigasCycleQueue_dyn
205             : public cds::container::TsigasCycleQueue<
206                 Value
207                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
208             >
209         {
210             typedef cds::container::TsigasCycleQueue<
211                 Value
212                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
213             > base_class;
214         public:
215             TsigasCycleQueue_dyn()
216                 : base_class( 1024 * 64 )
217             {}
218
219             TsigasCycleQueue_dyn( size_t nCapacity )
220                 : base_class( nCapacity )
221             {}
222
223             cds::opt::none statistics() const
224             {
225                 return cds::opt::none();
226             }
227         };
228
229         class TsigasCycleQueue_dyn_michaelAlloc
230             : public cds::container::TsigasCycleQueue<
231                 Value
232                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
233                 ,cds::opt::allocator< memory::MichaelAllocator<int> >
234             >
235         {
236             typedef cds::container::TsigasCycleQueue<
237                 Value
238                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
239                 ,cds::opt::allocator< memory::MichaelAllocator<int> >
240             > base_class;
241         public:
242             TsigasCycleQueue_dyn_michaelAlloc()
243                 : base_class( 1024 * 64 )
244             {}
245
246             TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
247                 : base_class( nCapacity )
248             {}
249
250             cds::opt::none statistics() const
251             {
252                 return cds::opt::none();
253             }
254         };
255
256         class TsigasCycleQueue_dyn_ic
257             : public cds::container::TsigasCycleQueue<
258                 Value
259                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
260                 ,cds::opt::item_counter< cds::atomicity::item_counter >
261             >
262         {
263             typedef cds::container::TsigasCycleQueue<
264                 Value
265                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
266                 ,cds::opt::item_counter< cds::atomicity::item_counter >
267             > base_class;
268         public:
269             TsigasCycleQueue_dyn_ic()
270                 : base_class( 1024 * 64 )
271             {}
272             TsigasCycleQueue_dyn_ic( size_t nCapacity )
273                 : base_class( nCapacity )
274             {}
275
276             cds::opt::none statistics() const
277             {
278                 return cds::opt::none();
279             }
280         };
281
282         // VyukovMPMCCycleQueue
283         class VyukovMPMCCycleQueue_dyn
284             : public cds::container::VyukovMPMCCycleQueue<
285                 Value
286                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
287             >
288         {
289             typedef cds::container::VyukovMPMCCycleQueue<
290                 Value
291                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
292             > base_class;
293         public:
294             VyukovMPMCCycleQueue_dyn()
295                 : base_class( 1024 * 64 )
296             {}
297             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
298                 : base_class( nCapacity )
299             {}
300
301             cds::opt::none statistics() const
302             {
303                 return cds::opt::none();
304             }
305         };
306
307         class VyukovMPMCCycleQueue_dyn_michaelAlloc
308             : public cds::container::VyukovMPMCCycleQueue<
309             Value
310             ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
311             >
312         {
313             typedef cds::container::VyukovMPMCCycleQueue<
314                 Value
315                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
316             > base_class;
317         public:
318             VyukovMPMCCycleQueue_dyn_michaelAlloc()
319                 : base_class( 1024 * 64 )
320             {}
321             VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
322                 : base_class( nCapacity )
323             {}
324
325             cds::opt::none statistics() const
326             {
327                 return cds::opt::none();
328             }
329         };
330
331         class VyukovMPMCCycleQueue_dyn_ic
332             : public cds::container::VyukovMPMCCycleQueue<
333                 Value
334                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
335                 ,cds::opt::item_counter< cds::atomicity::item_counter >
336             >
337         {
338             typedef cds::container::VyukovMPMCCycleQueue<
339                 Value
340                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
341                 ,cds::opt::item_counter< cds::atomicity::item_counter >
342             > base_class;
343         public:
344             VyukovMPMCCycleQueue_dyn_ic()
345                 : base_class( 1024 * 64 )
346             {}
347             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
348                 : base_class( nCapacity )
349             {}
350
351             cds::opt::none statistics() const
352             {
353                 return cds::opt::none();
354             }
355         };
356
357         // BasketQueue
358
359         typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
360         typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
361
362         struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
363         {
364             typedef memory::MichaelAllocator<int> allocator;
365         };
366         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
367         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
368
369         struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
370         {
371             typedef cds::opt::v::sequential_consistent mamory_model;
372         };
373         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
374         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
375
376         struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
377         {
378             typedef cds::atomicity::item_counter item_counter;
379         };
380         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
381         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
382
383         struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
384         {
385             typedef cds::container::basket_queue::stat<> stat;
386         };
387         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
388         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
389
390
391         // RWQueue
392         typedef cds::container::RWQueue<
393             Value
394         > RWQueue_Spin;
395
396         typedef cds::container::RWQueue<
397             Value
398             ,cds::opt::item_counter< cds::atomicity::item_counter >
399         > RWQueue_Spin_ic;
400
401         typedef cds::container::RWQueue<
402             Value
403             ,cds::opt::stat< cds::intrusive::queue_stat<> >
404         > RWQueue_Spin_stat;
405
406         // FCQueue
407         class traits_FCQueue_elimination:
408             public cds::container::fcqueue::make_traits<
409                 cds::opt::enable_elimination< true >
410             >::type
411         {};
412         class traits_FCQueue_elimination_stat:
413             public cds::container::fcqueue::make_traits<
414                 cds::opt::enable_elimination< true >
415                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
416             >::type
417         {};
418
419         typedef cds::container::FCQueue< Value > FCQueue_deque;
420         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
421         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
422
423         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
424         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
425         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
426
427
428    // FCDeque
429         struct traits_FCDeque_stat:
430             public cds::container::fcdeque::make_traits<
431                 cds::opt::stat< cds::container::fcdeque::stat<> >
432             >::type
433         {};
434         struct traits_FCDeque_elimination:
435             public cds::container::fcdeque::make_traits<
436                 cds::opt::enable_elimination< true >
437             >::type
438         {};
439         struct traits_FCDeque_elimination_stat:
440             public cds::container::fcdeque::make_traits<
441                 cds::opt::stat< cds::container::fcdeque::stat<> >,
442                 cds::opt::enable_elimination< true >
443             >::type
444         {};
445         struct traits_FCDeque_mutex:
446             public cds::container::fcdeque::make_traits<
447                 cds::opt::lock_type< std::mutex >
448             >::type
449         {};
450
451         typedef details::FCDequeL< Value > FCDequeL_default;
452         typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
453         typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
454         typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
455         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
456
457         typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
458         typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
459         typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
460         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
461
462         typedef details::FCDequeR< Value > FCDequeR_default;
463         typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
464         typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
465         typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
466         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
467
468         typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
469         typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
470         typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
471         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
472
473         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
474         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
475         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_BoostMutex;
476         typedef StdQueue_list<Value, std::mutex>    StdQueue_list_BoostMutex;
477 #ifdef UNIT_LOCK_WIN_CS
478         typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
479         typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
480         typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
481         typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
482 #endif
483
484         // SegmentedQueue
485         class traits_SegmentedQueue_spin_stat:
486             public cds::container::segmented_queue::make_traits<
487                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
488             >::type
489         {};
490         class traits_SegmentedQueue_mutex_stat:
491             public cds::container::segmented_queue::make_traits<
492                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
493                 ,cds::opt::lock_type< std::mutex >
494             >::type
495         {};
496         class traits_SegmentedQueue_mutex:
497             public cds::container::segmented_queue::make_traits<
498                 cds::opt::lock_type< std::mutex >
499             >::type
500         {};
501
502         typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
503         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
504         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
505         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
506
507         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value >  SegmentedQueue_PTB_spin;
508         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
509         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
510         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
511
512
513     };
514 }
515
516
517 // *********************************************
518 // Queue statistics
519 namespace std {
520
521     template <typename Counter>
522     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
523     {
524         return o
525             << "\tStatistics:\n"
526             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
527             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
528             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
529             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
530             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
531             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n";
532     }
533     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
534     {
535         return o;
536     }
537
538     template <typename Counter>
539     static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)
540     {
541         return o
542             << "\tStatistics:\n"
543             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
544             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
545             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
546             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
547             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
548             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n"
549             << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
550             << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
551     }
552     static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::empty_stat const& s)
553     {
554         return o;
555     }
556
557     template <typename Counter>
558     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
559     {
560         return o
561             << "\tStatistics:\n"
562             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
563             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
564             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
565             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
566             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
567             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
568     }
569
570     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
571     {
572         return o;
573     }
574
575     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
576     {
577         return o;
578     }
579
580     // cds::intrusive::optimistic_queue::stat
581     template <typename Counter>
582     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
583     {
584         return o
585             << "\tStatistics:\n"
586             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
587             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
588             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
589             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
590             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
591             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n"
592             << "\t\t      fix list call: " << s.m_FixListCount.get() << "\n";
593     }
594
595     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
596     {
597         return o;
598     }
599
600     // cds::container::fcqueue::stat
601     template <typename Counter>
602     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
603     {
604             return o << "\tStatistics:\n"
605                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
606                 << "\t                PushMove: " << s.m_nEnqMove.get()           << "\n"
607                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
608                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
609                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
610                 << "\tFlat combining statistics:\n"
611                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
612                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
613                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
614                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
615                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
616                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
617                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
618                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
619                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
620                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
621     }
622
623     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
624     {
625         return o;
626     }
627
628     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
629     {
630         return o;
631     }
632
633     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
634     {
635         return o << "\tStatistics:\n"
636             << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
637             << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
638             << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
639             << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
640             << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
641             << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
642             << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
643             << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
644             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
645             << "\tFlat combining statistics:\n"
646             << "\t        Combining factor: " << s.combining_factor()         << "\n"
647             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
648             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
649             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
650             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
651             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
652             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
653             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
654             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
655             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
656     }
657
658 }
659
660 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H