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