e073626cc87b5b1b02c59fc2aced74cbf3d6ce6a
[libcds.git] / tests / unit / queue / intrusive_queue_type.h
1 //$$CDS-header$$
2
3 #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
4 #define __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
5
6 #include <cds/intrusive/msqueue.h>
7 #include <cds/intrusive/moir_queue.h>
8 #include <cds/intrusive/optimistic_queue.h>
9 #include <cds/intrusive/tsigas_cycle_queue.h>
10 #include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
11 #include <cds/intrusive/basket_queue.h>
12 #include <cds/intrusive/fcqueue.h>
13 #include <cds/intrusive/segmented_queue.h>
14
15 #include <cds/gc/hp.h>
16 #include <cds/gc/hrc.h> //TODO: remove this line!
17 #include <cds/gc/dhp.h>
18
19 #include <boost/intrusive/slist.hpp>
20
21 #include "print_segmentedqueue_stat.h"
22
23 namespace queue {
24
25     namespace details {
26         struct empty_stat {};
27
28         template <typename T, typename Lock=std::mutex>
29         class BoostSList
30         {
31             typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> >    slist_type;
32             typedef Lock lock_type;
33             typedef std::lock_guard<lock_type> lock_guard;
34
35             slist_type  m_List;
36             mutable lock_type m_Lock;
37         public:
38             typedef T value_type;
39
40         public:
41             bool push( value_type& v )
42             {
43                 lock_guard l( m_Lock );
44                 m_List.push_back( v );
45                 return true;
46             }
47
48             bool enqueue( value_type& v )
49             {
50                 return push( v );
51             }
52
53             value_type * pop()
54             {
55                 lock_guard l( m_Lock );
56                 if ( m_List.empty() )
57                     return nullptr;
58                 value_type& v = m_List.front();
59                 m_List.pop_front();
60                 return &v;
61             }
62             value_type * deque()
63             {
64                 return pop();
65             }
66
67             bool empty() const
68             {
69                 lock_guard l( m_Lock );
70                 return m_List.empty();
71             }
72
73             size_t size() const
74             {
75                 lock_guard l( m_Lock );
76                 return m_List.size();
77             }
78
79             empty_stat statistics() const
80             {
81                 return empty_stat();
82             }
83         };
84     }
85
86     template <typename T>
87     struct Types {
88
89         // MSQueue, MoirQueue
90         struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
91         {
92             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
93         };
94         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP > MSQueue_HP;
95         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP > MoirQueue_HP;
96
97         struct traits_MSQueue_HP_seqcst : public cds::intrusive::msqueue::traits
98         {
99             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
100             typedef cds::opt::v::sequential_consistent memory_model;
101         };
102         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MSQueue_HP_seqcst;
103         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MoirQueue_HP_seqcst;
104
105         struct traits_MSQueue_DHP : public cds::intrusive::msqueue::traits
106         {
107             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
108         };
109         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MSQueue_DHP;
110         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MoirQueue_DHP;
111
112         struct traits_MSQueue_DHP_seqcst : public cds::intrusive::msqueue::traits
113         {
114             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
115             typedef cds::opt::v::sequential_consistent memory_model;
116         };
117         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MSQueue_DHP_seqcst;
118         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MoirQueue_DHP_seqcst;
119
120         // MSQueue + item counter
121         struct traits_MSQueue_HP_ic : public cds::intrusive::msqueue::traits
122         {
123             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
124             typedef cds::atomicity::item_counter item_counter;
125         };
126         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MSQueue_HP_ic;
127         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MoirQueue_HP_ic;
128
129         struct traits_MSQueue_DHP_ic : public cds::intrusive::msqueue::traits
130         {
131             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
132             typedef cds::atomicity::item_counter item_counter;
133         };
134         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MSQueue_DHP_ic;
135         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MoirQueue_DHP_ic;
136
137         // MSQueue + stat
138         struct traits_MSQueue_HP_stat : public cds::intrusive::msqueue::traits
139         {
140             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
141             typedef cds::intrusive::msqueue::stat<> stat;
142         };
143         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MSQueue_HP_stat;
144         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MoirQueue_HP_stat;
145
146         struct traits_MSQueue_DHP_stat : public cds::intrusive::msqueue::traits
147         {
148             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
149             typedef cds::intrusive::msqueue::stat<> stat;
150         };
151         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MSQueue_DHP_stat;
152         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MoirQueue_DHP_stat;
153
154
155         // OptimisticQueue
156         struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
157         {
158             typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
159         };
160         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
161
162         struct traits_OptimisticQueue_HP_seqcst : public
163             cds::intrusive::optimistic_queue::make_traits <
164                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
165                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
166             >::type
167         {};
168         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
169
170         struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
171         {
172             typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
173         };
174         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
175
176         struct traits_OptimisticQueue_DHP_seqcst: public
177             cds::intrusive::optimistic_queue::make_traits <
178                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
179                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
180             >::type
181         {};
182         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
183
184         // OptimisticQueue + item counter
185         struct traits_OptimisticQueue_HP_ic: public 
186             cds::intrusive::optimistic_queue::make_traits <
187                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
188                 , cds::opt::item_counter< cds::atomicity::item_counter >
189             >::type
190         {};
191         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
192
193         struct traits_OptimisticQueue_DHP_ic: public
194             cds::intrusive::optimistic_queue::make_traits <
195                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
196                 , cds::opt::item_counter< cds::atomicity::item_counter >
197             >::type
198         {};
199         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
200
201         // OptimisticQueue + stat
202         struct traits_OptimisticQueue_HP_stat: public 
203             cds::intrusive::optimistic_queue::make_traits <
204                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
205                 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
206             >::type
207         {};
208         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
209
210         struct traits_OptimisticQueue_DHP_stat: public 
211             cds::intrusive::optimistic_queue::make_traits <
212                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
213                 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
214             >::type
215         {};
216         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
217
218         // TsigasCycleQueue
219         class TsigasCycleQueue_dyn
220             : public cds::intrusive::TsigasCycleQueue< T
221                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
222             >
223         {
224             typedef cds::intrusive::TsigasCycleQueue< T
225                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
226             > base_class;
227         public:
228             TsigasCycleQueue_dyn()
229                 : base_class( 1024 * 64 )
230             {}
231
232             TsigasCycleQueue_dyn( size_t nCapacity )
233                 : base_class( nCapacity )
234             {}
235
236             cds::opt::none statistics() const
237             {
238                 return cds::opt::none();
239             }
240         };
241
242         class TsigasCycleQueue_dyn_ic
243             : public cds::intrusive::TsigasCycleQueue< T
244                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
245                 ,cds::opt::item_counter< cds::atomicity::item_counter >
246             >
247         {
248             typedef cds::intrusive::TsigasCycleQueue< T
249                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
250                 ,cds::opt::item_counter< cds::atomicity::item_counter >
251             > base_class;
252         public:
253             TsigasCycleQueue_dyn_ic()
254                 : base_class( 1024 * 64 )
255             {}
256             TsigasCycleQueue_dyn_ic( size_t nCapacity )
257                 : base_class( nCapacity )
258             {}
259
260             cds::opt::none statistics() const
261             {
262                 return cds::opt::none();
263             }
264         };
265
266         // VyukovMPMCCycleQueue
267         class VyukovMPMCCycleQueue_dyn
268             : public cds::intrusive::VyukovMPMCCycleQueue< T
269                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
270             >
271         {
272             typedef cds::intrusive::VyukovMPMCCycleQueue< T
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_ic
290             : public cds::intrusive::VyukovMPMCCycleQueue< T
291                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
292                 ,cds::opt::item_counter< cds::atomicity::item_counter >
293             >
294         {
295             typedef cds::intrusive::VyukovMPMCCycleQueue< T
296                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
297                 ,cds::opt::item_counter< cds::atomicity::item_counter >
298             > base_class;
299         public:
300             VyukovMPMCCycleQueue_dyn_ic()
301                 : base_class( 1024 * 64 )
302             {}
303             VyukovMPMCCycleQueue_dyn_ic( 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         // BasketQueue
314         struct traits_BasketQueue_HP : public
315             cds::intrusive::basket_queue::make_traits <
316                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
317             > ::type
318         {};
319         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
320
321         struct traits_BasketQueue_HP_seqcst: public 
322             cds::intrusive::basket_queue::make_traits <
323                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
324                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
325             > ::type
326         {};
327         typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
328
329         struct traits_BasketQueue_DHP : public
330             cds::intrusive::basket_queue::make_traits <
331                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
332             > ::type
333         {};
334         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
335
336         struct traits_BasketQueue_DHP_seqcst: public 
337             cds::intrusive::basket_queue::make_traits <
338                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
339                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
340             > ::type
341         {};
342         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
343
344         // BasketQueue + item counter
345         struct traits_BasketQueue_HP_ic : public
346             cds::intrusive::basket_queue::make_traits <
347                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
348                 ,cds::opt::item_counter< cds::atomicity::item_counter >
349             > ::type
350         {};
351         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
352
353         struct traits_BasketQueue_DHP_ic : public
354             cds::intrusive::basket_queue::make_traits <
355                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
356                 ,cds::opt::item_counter< cds::atomicity::item_counter >
357             > ::type
358         {};
359         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
360
361         // BasketQueue + stat
362         struct traits_BasketQueue_HP_stat : public
363             cds::intrusive::basket_queue::make_traits <
364                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
365                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
366             > ::type
367         {};
368         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
369
370         struct traits_BasketQueue_DHP_stat : public
371             cds::intrusive::basket_queue::make_traits <
372                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
373                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
374             > ::type
375         {};
376         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
377
378         // FCQueue
379         class traits_FCQueue_delay2:
380             public cds::intrusive::fcqueue::make_traits<
381                 cds::opt::back_off< cds::backoff::delay_of<2> >
382             >::type
383         {};
384         class traits_FCQueue_delay2_elimination:
385             public cds::intrusive::fcqueue::make_traits<
386                 cds::opt::back_off< cds::backoff::delay_of<2> >
387                 ,cds::opt::enable_elimination< true >
388             >::type
389         {};
390         class traits_FCQueue_delay2_elimination_stat:
391             public cds::intrusive::fcqueue::make_traits<
392                 cds::opt::back_off< cds::backoff::delay_of<2> >
393                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
394                 ,cds::opt::enable_elimination< true >
395             >::type
396         {};
397         class traits_FCQueue_expbackoff_elimination:
398             public cds::intrusive::fcqueue::make_traits<
399                 cds::opt::enable_elimination< true >
400                 ,cds::opt::elimination_backoff< cds::backoff::Default >
401             >::type
402         {};
403         class traits_FCQueue_expbackoff_elimination_stat:
404             public cds::intrusive::fcqueue::make_traits<
405                 cds::opt::enable_elimination< true >
406                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
407                 ,cds::opt::elimination_backoff< cds::backoff::Default >
408             >::type
409         {};
410
411         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
412         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
413         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
414         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
415         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
416
417         // SegmentedQueue
418         class traits_SegmentedQueue_spin_stat:
419             public cds::intrusive::segmented_queue::make_traits<
420                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
421             >::type
422         {};
423         class traits_SegmentedQueue_mutex_stat:
424             public cds::intrusive::segmented_queue::make_traits<
425                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
426                 ,cds::opt::lock_type< std::mutex >
427             >::type
428         {};
429         class traits_SegmentedQueue_mutex:
430             public cds::intrusive::segmented_queue::make_traits<
431                 cds::opt::lock_type< std::mutex >
432             >::type
433         {};
434
435         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
436         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
437         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
438         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
439
440         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T >  SegmentedQueue_PTB_spin;
441         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
442         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
443         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
444
445         // Boost SList
446         typedef details::BoostSList< T, std::mutex >    BoostSList_mutex;
447         typedef details::BoostSList< T, cds::lock::Spin >   BoostSList_spin;
448     };
449 }
450
451
452 // *********************************************
453 // Queue statistics
454 namespace std {
455     /*
456     // cds::intrusive::queue_stat
457     template <typename Counter>
458     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
459     {
460         return o
461             << "\tStatistics:\n"
462             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
463             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
464             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
465             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
466             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
467             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
468     }
469     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
470     {
471         return o;
472     }
473     */
474
475
476     template <typename Counter>
477     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
478     {
479         return o
480             << "\tStatistics:\n"
481             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
482             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
483             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
484             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
485             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
486             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n"
487             << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
488             << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
489     }
490     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& s)
491     {
492         return o;
493     }
494
495     template <typename Counter>
496     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
497     {
498         return o
499             << "\tStatistics:\n"
500             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
501             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
502             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
503             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
504             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
505             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
506     }
507
508     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
509     {
510         return o;
511     }
512
513     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
514     {
515         return o;
516     }
517
518     // cds::intrusive::optimistic_queue::stat
519     template <typename Counter>
520     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
521     {
522         return o
523             << "\tStatistics:\n"
524             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
525             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
526             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
527             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
528             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
529             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
530             << "\t\t     fix list call: " << s.m_FixListCount.get() << "\n";
531     }
532
533     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
534     {
535         return o;
536     }
537
538     // cds::intrusive::fcqueue::stat
539     template <typename Counter>
540     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
541     {
542             return o << "\tStatistics:\n"
543                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
544                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
545                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
546                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
547                 << "\tFlat combining statistics:\n"
548                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
549                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
550                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
551                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
552                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
553                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
554                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
555                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
556                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
557                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
558     }
559
560     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
561     {
562         return o;
563     }
564
565     static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
566     {
567         return o;
568     }
569
570 } // namespace std
571
572 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H