MSQueue, MoirQueue refactoring done (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         typedef cds::container::BasketQueue<
359             cds::gc::HP , Value
360         >   BasketQueue_HP;
361
362         typedef cds::container::BasketQueue<
363             cds::gc::HP , Value
364             ,cds::opt::allocator< memory::MichaelAllocator<int> >
365         >   BasketQueue_HP_michaelAlloc;
366
367         typedef cds::container::BasketQueue<
368             cds::gc::HP, Value
369             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
370         >   BasketQueue_HP_seqcst;
371
372         typedef cds::container::BasketQueue< cds::gc::HRC,
373             Value
374         >   BasketQueue_HRC;
375
376         typedef cds::container::BasketQueue< cds::gc::HRC,
377             Value
378             ,cds::opt::allocator< memory::MichaelAllocator<int> >
379         >   BasketQueue_HRC_michaelAlloc;
380
381         typedef cds::container::BasketQueue< cds::gc::HRC,
382             Value
383             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
384         >   BasketQueue_HRC_seqcst;
385
386         typedef cds::container::BasketQueue< cds::gc::PTB,
387             Value
388         >   BasketQueue_PTB;
389
390         typedef cds::container::BasketQueue< cds::gc::PTB,
391             Value
392             ,cds::opt::allocator< memory::MichaelAllocator<int> >
393         >   BasketQueue_PTB_michaelAlloc;
394
395         typedef cds::container::BasketQueue< cds::gc::PTB,
396             Value
397             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
398         >   BasketQueue_PTB_seqcst;
399
400         // BasketQueue + item counter
401         typedef cds::container::BasketQueue< cds::gc::HP,
402             Value
403             ,cds::opt::item_counter< cds::atomicity::item_counter >
404         >   BasketQueue_HP_ic;
405
406         typedef cds::container::BasketQueue< cds::gc::HRC,
407             Value
408             ,cds::opt::item_counter< cds::atomicity::item_counter >
409         >   BasketQueue_HRC_ic;
410
411         typedef cds::container::BasketQueue< cds::gc::PTB,
412             Value
413             ,cds::opt::item_counter< cds::atomicity::item_counter >
414         >   BasketQueue_PTB_ic;
415
416         // BasketQueue + stat
417         typedef cds::container::BasketQueue< cds::gc::HP,
418             Value
419             ,cds::opt::stat< cds::intrusive::queue_stat<> >
420         >   BasketQueue_HP_stat;
421
422         typedef cds::container::BasketQueue< cds::gc::HRC,
423             Value
424             ,cds::opt::stat< cds::intrusive::queue_stat<> >
425         >   BasketQueue_HRC_stat;
426
427         typedef cds::container::BasketQueue< cds::gc::PTB,
428             Value
429             ,cds::opt::stat< cds::intrusive::queue_stat<> >
430         >   BasketQueue_PTB_stat;
431
432
433         // RWQueue
434         typedef cds::container::RWQueue<
435             Value
436         > RWQueue_Spin;
437
438         typedef cds::container::RWQueue<
439             Value
440             ,cds::opt::item_counter< cds::atomicity::item_counter >
441         > RWQueue_Spin_ic;
442
443         typedef cds::container::RWQueue<
444             Value
445             ,cds::opt::stat< cds::intrusive::queue_stat<> >
446         > RWQueue_Spin_stat;
447
448         // FCQueue
449         class traits_FCQueue_elimination:
450             public cds::container::fcqueue::make_traits<
451                 cds::opt::enable_elimination< true >
452             >::type
453         {};
454         class traits_FCQueue_elimination_stat:
455             public cds::container::fcqueue::make_traits<
456                 cds::opt::enable_elimination< true >
457                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
458             >::type
459         {};
460
461         typedef cds::container::FCQueue< Value > FCQueue_deque;
462         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
463         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
464
465         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
466         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
467         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
468
469
470    // FCDeque
471         struct traits_FCDeque_stat:
472             public cds::container::fcdeque::make_traits<
473                 cds::opt::stat< cds::container::fcdeque::stat<> >
474             >::type
475         {};
476         struct traits_FCDeque_elimination:
477             public cds::container::fcdeque::make_traits<
478                 cds::opt::enable_elimination< true >
479             >::type
480         {};
481         struct traits_FCDeque_elimination_stat:
482             public cds::container::fcdeque::make_traits<
483                 cds::opt::stat< cds::container::fcdeque::stat<> >,
484                 cds::opt::enable_elimination< true >
485             >::type
486         {};
487         struct traits_FCDeque_mutex:
488             public cds::container::fcdeque::make_traits<
489                 cds::opt::lock_type< std::mutex >
490             >::type
491         {};
492
493         typedef details::FCDequeL< Value > FCDequeL_default;
494         typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
495         typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
496         typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
497         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
498
499         typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
500         typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
501         typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
502         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
503
504         typedef details::FCDequeR< Value > FCDequeR_default;
505         typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
506         typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
507         typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
508         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
509
510         typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
511         typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
512         typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
513         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
514
515         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
516         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
517         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_BoostMutex;
518         typedef StdQueue_list<Value, std::mutex>    StdQueue_list_BoostMutex;
519 #ifdef UNIT_LOCK_WIN_CS
520         typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
521         typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
522         typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
523         typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
524 #endif
525
526         // SegmentedQueue
527         class traits_SegmentedQueue_spin_stat:
528             public cds::container::segmented_queue::make_traits<
529                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
530             >::type
531         {};
532         class traits_SegmentedQueue_mutex_stat:
533             public cds::container::segmented_queue::make_traits<
534                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
535                 ,cds::opt::lock_type< std::mutex >
536             >::type
537         {};
538         class traits_SegmentedQueue_mutex:
539             public cds::container::segmented_queue::make_traits<
540                 cds::opt::lock_type< std::mutex >
541             >::type
542         {};
543
544         typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
545         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
546         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
547         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
548
549         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value >  SegmentedQueue_PTB_spin;
550         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
551         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
552         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
553
554
555     };
556 }
557
558
559 // *********************************************
560 // Queue statistics
561 namespace std {
562
563     // cds::intrusive::queue_stat
564     template <typename Counter>
565     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
566     {
567         return o
568             << "\tStatistics:\n"
569             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
570             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
571             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
572             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
573             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
574             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
575     }
576     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
577     {
578         return o;
579     }
580
581
582     template <typename Counter>
583     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
584     {
585         return o
586             << "\tStatistics:\n"
587             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
588             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
589             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
590             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
591             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
592             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
593     }
594
595     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
596     {
597         return o;
598     }
599
600     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
601     {
602         return o;
603     }
604
605     // cds::intrusive::optimistic_queue::stat
606     template <typename Counter>
607     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
608     {
609         return o
610             << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
611             << "\t\t"
612             << "\t\t    fix list call: " << s.m_FixListCount.get() << "\n";
613     }
614
615     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
616     {
617         return o;
618     }
619
620     // cds::intrusive::basket_queue::stat
621     template <typename Counter>
622     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
623     {
624         return o
625             << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
626             << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
627             << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
628     }
629
630     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
631     {
632         return o;
633     }
634
635     // cds::container::fcqueue::stat
636     template <typename Counter>
637     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
638     {
639             return o << "\tStatistics:\n"
640                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
641                 << "\t                PushMove: " << s.m_nEnqMove.get()           << "\n"
642                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
643                 << "\t               FailedPop: " << s.m_nFailedDeq.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     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
659     {
660         return o;
661     }
662
663     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
664     {
665         return o;
666     }
667
668     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
669     {
670         return o << "\tStatistics:\n"
671             << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
672             << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
673             << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
674             << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
675             << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
676             << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
677             << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
678             << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
679             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
680             << "\tFlat combining statistics:\n"
681             << "\t        Combining factor: " << s.combining_factor()         << "\n"
682             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
683             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
684             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
685             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
686             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
687             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
688             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
689             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
690             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
691     }
692
693 }
694
695 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H