RWQueue refactoring
[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, Value > OptimisticQueue_HP;
153         typedef cds::container::OptimisticQueue< cds::gc::PTB, Value > OptimisticQueue_PTB;
154
155         struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
156         {
157             typedef memory::MichaelAllocator<int> allocator;
158         };
159         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_HP_michaelAlloc;
160         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_DHP_michaelAlloc;
161
162         struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
163         {
164             typedef cds::opt::v::sequential_consistent memory_model;
165         };
166         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
167         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
168
169         struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
170         {
171             typedef cds::atomicity::item_counter item_counter;
172         };
173         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
174         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
175
176         struct traits_OptimisticQueue_stat : public
177             cds::container::optimistic_queue::make_traits <
178                 cds::opt::stat < cds::intrusive::queue_stat<> >
179             > ::type
180         {};
181         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
182         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
183
184
185         // TsigasCycleQueue
186         class TsigasCycleQueue_dyn
187             : public cds::container::TsigasCycleQueue<
188                 Value
189                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
190             >
191         {
192             typedef cds::container::TsigasCycleQueue<
193                 Value
194                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
195             > base_class;
196         public:
197             TsigasCycleQueue_dyn()
198                 : base_class( 1024 * 64 )
199             {}
200
201             TsigasCycleQueue_dyn( size_t nCapacity )
202                 : base_class( nCapacity )
203             {}
204
205             cds::opt::none statistics() const
206             {
207                 return cds::opt::none();
208             }
209         };
210
211         class TsigasCycleQueue_dyn_michaelAlloc
212             : public cds::container::TsigasCycleQueue<
213                 Value
214                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
215                 ,cds::opt::allocator< memory::MichaelAllocator<int> >
216             >
217         {
218             typedef cds::container::TsigasCycleQueue<
219                 Value
220                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
221                 ,cds::opt::allocator< memory::MichaelAllocator<int> >
222             > base_class;
223         public:
224             TsigasCycleQueue_dyn_michaelAlloc()
225                 : base_class( 1024 * 64 )
226             {}
227
228             TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
229                 : base_class( nCapacity )
230             {}
231
232             cds::opt::none statistics() const
233             {
234                 return cds::opt::none();
235             }
236         };
237
238         class TsigasCycleQueue_dyn_ic
239             : public cds::container::TsigasCycleQueue<
240                 Value
241                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
242                 ,cds::opt::item_counter< cds::atomicity::item_counter >
243             >
244         {
245             typedef cds::container::TsigasCycleQueue<
246                 Value
247                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
248                 ,cds::opt::item_counter< cds::atomicity::item_counter >
249             > base_class;
250         public:
251             TsigasCycleQueue_dyn_ic()
252                 : base_class( 1024 * 64 )
253             {}
254             TsigasCycleQueue_dyn_ic( size_t nCapacity )
255                 : base_class( nCapacity )
256             {}
257
258             cds::opt::none statistics() const
259             {
260                 return cds::opt::none();
261             }
262         };
263
264         // VyukovMPMCCycleQueue
265         class VyukovMPMCCycleQueue_dyn
266             : public cds::container::VyukovMPMCCycleQueue<
267                 Value
268                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
269             >
270         {
271             typedef cds::container::VyukovMPMCCycleQueue<
272                 Value
273                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
274             > base_class;
275         public:
276             VyukovMPMCCycleQueue_dyn()
277                 : base_class( 1024 * 64 )
278             {}
279             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
280                 : base_class( nCapacity )
281             {}
282
283             cds::opt::none statistics() const
284             {
285                 return cds::opt::none();
286             }
287         };
288
289         class VyukovMPMCCycleQueue_dyn_michaelAlloc
290             : public cds::container::VyukovMPMCCycleQueue<
291             Value
292             ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
293             >
294         {
295             typedef cds::container::VyukovMPMCCycleQueue<
296                 Value
297                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
298             > base_class;
299         public:
300             VyukovMPMCCycleQueue_dyn_michaelAlloc()
301                 : base_class( 1024 * 64 )
302             {}
303             VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
304                 : base_class( nCapacity )
305             {}
306
307             cds::opt::none statistics() const
308             {
309                 return cds::opt::none();
310             }
311         };
312
313         class VyukovMPMCCycleQueue_dyn_ic
314             : public cds::container::VyukovMPMCCycleQueue<
315                 Value
316                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
317                 ,cds::opt::item_counter< cds::atomicity::item_counter >
318             >
319         {
320             typedef cds::container::VyukovMPMCCycleQueue<
321                 Value
322                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
323                 ,cds::opt::item_counter< cds::atomicity::item_counter >
324             > base_class;
325         public:
326             VyukovMPMCCycleQueue_dyn_ic()
327                 : base_class( 1024 * 64 )
328             {}
329             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
330                 : base_class( nCapacity )
331             {}
332
333             cds::opt::none statistics() const
334             {
335                 return cds::opt::none();
336             }
337         };
338
339         // BasketQueue
340
341         typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
342         typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
343
344         struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
345         {
346             typedef memory::MichaelAllocator<int> allocator;
347         };
348         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
349         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
350
351         struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
352         {
353             typedef cds::opt::v::sequential_consistent mamory_model;
354         };
355         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
356         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
357
358         struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
359         {
360             typedef cds::atomicity::item_counter item_counter;
361         };
362         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
363         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
364
365         struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
366         {
367             typedef cds::container::basket_queue::stat<> stat;
368         };
369         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
370         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
371
372
373         // RWQueue
374         typedef cds::container::RWQueue< Value > RWQueue_Spin;
375
376         struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
377         {
378             typedef cds::atomicity::item_counter item_counter;
379         };
380         typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
381
382         struct traits_RWQueue_mutex : public 
383             cds::container::rwqueue::make_traits<
384                 cds::opt::lock_type< std::mutex >
385             >::type
386         {};
387         typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > traits_RWQueue_mutex;
388
389         // FCQueue
390         class traits_FCQueue_elimination:
391             public cds::container::fcqueue::make_traits<
392                 cds::opt::enable_elimination< true >
393             >::type
394         {};
395         class traits_FCQueue_elimination_stat:
396             public cds::container::fcqueue::make_traits<
397                 cds::opt::enable_elimination< true >
398                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
399             >::type
400         {};
401
402         typedef cds::container::FCQueue< Value > FCQueue_deque;
403         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
404         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
405
406         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
407         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
408         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
409
410
411    // FCDeque
412         struct traits_FCDeque_stat:
413             public cds::container::fcdeque::make_traits<
414                 cds::opt::stat< cds::container::fcdeque::stat<> >
415             >::type
416         {};
417         struct traits_FCDeque_elimination:
418             public cds::container::fcdeque::make_traits<
419                 cds::opt::enable_elimination< true >
420             >::type
421         {};
422         struct traits_FCDeque_elimination_stat:
423             public cds::container::fcdeque::make_traits<
424                 cds::opt::stat< cds::container::fcdeque::stat<> >,
425                 cds::opt::enable_elimination< true >
426             >::type
427         {};
428         struct traits_FCDeque_mutex:
429             public cds::container::fcdeque::make_traits<
430                 cds::opt::lock_type< std::mutex >
431             >::type
432         {};
433
434         typedef details::FCDequeL< Value > FCDequeL_default;
435         typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
436         typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
437         typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
438         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
439
440         typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
441         typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
442         typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
443         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
444
445         typedef details::FCDequeR< Value > FCDequeR_default;
446         typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
447         typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
448         typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
449         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
450
451         typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
452         typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
453         typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
454         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
455
456         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
457         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
458         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_BoostMutex;
459         typedef StdQueue_list<Value, std::mutex>    StdQueue_list_BoostMutex;
460 #ifdef UNIT_LOCK_WIN_CS
461         typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
462         typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
463         typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
464         typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
465 #endif
466
467         // SegmentedQueue
468         class traits_SegmentedQueue_spin_stat:
469             public cds::container::segmented_queue::make_traits<
470                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
471             >::type
472         {};
473         class traits_SegmentedQueue_mutex_stat:
474             public cds::container::segmented_queue::make_traits<
475                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
476                 ,cds::opt::lock_type< std::mutex >
477             >::type
478         {};
479         class traits_SegmentedQueue_mutex:
480             public cds::container::segmented_queue::make_traits<
481                 cds::opt::lock_type< std::mutex >
482             >::type
483         {};
484
485         typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
486         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
487         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
488         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
489
490         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value >  SegmentedQueue_PTB_spin;
491         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
492         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
493         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
494
495
496     };
497 }
498
499
500 // *********************************************
501 // Queue statistics
502 namespace std {
503
504     template <typename Counter>
505     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
506     {
507         return o
508             << "\tStatistics:\n"
509             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
510             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
511             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
512             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
513             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
514             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n";
515     }
516     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
517     {
518         return o;
519     }
520
521     template <typename Counter>
522     static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_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             << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
533             << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
534     }
535     static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::empty_stat const& s)
536     {
537         return o;
538     }
539
540     template <typename Counter>
541     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
542     {
543         return o
544             << "\tStatistics:\n"
545             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
546             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
547             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
548             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
549             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
550             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
551     }
552
553     static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
554     {
555         return o;
556     }
557
558     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
559     {
560         return o;
561     }
562
563     // cds::intrusive::optimistic_queue::stat
564     template <typename Counter>
565     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_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\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
574             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n"
575             << "\t\t      fix list call: " << s.m_FixListCount.get() << "\n";
576     }
577
578     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
579     {
580         return o;
581     }
582
583     // cds::container::fcqueue::stat
584     template <typename Counter>
585     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
586     {
587             return o << "\tStatistics:\n"
588                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
589                 << "\t                PushMove: " << s.m_nEnqMove.get()           << "\n"
590                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
591                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
592                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
593                 << "\tFlat combining statistics:\n"
594                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
595                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
596                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
597                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
598                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
599                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
600                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
601                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
602                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
603                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
604     }
605
606     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
607     {
608         return o;
609     }
610
611     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
612     {
613         return o;
614     }
615
616     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
617     {
618         return o << "\tStatistics:\n"
619             << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
620             << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
621             << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
622             << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
623             << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
624             << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
625             << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
626             << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
627             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
628             << "\tFlat combining statistics:\n"
629             << "\t        Combining factor: " << s.combining_factor()         << "\n"
630             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
631             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
632             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
633             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
634             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
635             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
636             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
637             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
638             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
639     }
640
641 }
642
643 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H