TsigasCycleQueue 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                 typename cds::intrusive::tsigas_queue::make_traits<
221                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
222                 >::type
223             >
224         {
225             typedef cds::intrusive::TsigasCycleQueue< T,
226                 typename cds::intrusive::tsigas_queue::make_traits<
227                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
228                 >::type
229             > base_class;
230         public:
231             TsigasCycleQueue_dyn()
232                 : base_class( 1024 * 64 )
233             {}
234
235             TsigasCycleQueue_dyn( size_t nCapacity )
236                 : base_class( nCapacity )
237             {}
238
239             cds::opt::none statistics() const
240             {
241                 return cds::opt::none();
242             }
243         };
244
245         class TsigasCycleQueue_dyn_ic
246             : public cds::intrusive::TsigasCycleQueue< T,
247                 typename cds::intrusive::tsigas_queue::make_traits<
248                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
249                     ,cds::opt::item_counter< cds::atomicity::item_counter >
250                 >::type
251             >
252         {
253             typedef cds::intrusive::TsigasCycleQueue< T,
254                 typename cds::intrusive::tsigas_queue::make_traits<
255                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
256                     ,cds::opt::item_counter< cds::atomicity::item_counter >
257                 >::type
258             > base_class;
259         public:
260             TsigasCycleQueue_dyn_ic()
261                 : base_class( 1024 * 64 )
262             {}
263             TsigasCycleQueue_dyn_ic( size_t nCapacity )
264                 : base_class( nCapacity )
265             {}
266
267             cds::opt::none statistics() const
268             {
269                 return cds::opt::none();
270             }
271         };
272
273         // VyukovMPMCCycleQueue
274         class VyukovMPMCCycleQueue_dyn
275             : public cds::intrusive::VyukovMPMCCycleQueue< T,
276                 typename cds::intrusive::tsigas_queue::make_traits<
277                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
278                 >::type
279             >
280         {
281             typedef cds::intrusive::VyukovMPMCCycleQueue< T,
282                 typename cds::intrusive::tsigas_queue::make_traits<
283                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
284                 >::type
285             > base_class;
286         public:
287             VyukovMPMCCycleQueue_dyn()
288                 : base_class( 1024 * 64 )
289             {}
290             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
291                 : base_class( nCapacity )
292             {}
293
294             cds::opt::none statistics() const
295             {
296                 return cds::opt::none();
297             }
298         };
299
300         class VyukovMPMCCycleQueue_dyn_ic
301             : public cds::intrusive::VyukovMPMCCycleQueue< T,
302                 typename cds::intrusive::tsigas_queue::make_traits<
303                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
304                     ,cds::opt::item_counter< cds::atomicity::item_counter >
305                 >::type
306             >
307         {
308             typedef cds::intrusive::VyukovMPMCCycleQueue< T,
309                 typename cds::intrusive::tsigas_queue::make_traits<
310                     cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
311                     ,cds::opt::item_counter< cds::atomicity::item_counter >
312                 >::type
313             > base_class;
314         public:
315             VyukovMPMCCycleQueue_dyn_ic()
316                 : base_class( 1024 * 64 )
317             {}
318             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
319                 : base_class( nCapacity )
320             {}
321
322             cds::opt::none statistics() const
323             {
324                 return cds::opt::none();
325             }
326         };
327
328         // BasketQueue
329         struct traits_BasketQueue_HP : public
330             cds::intrusive::basket_queue::make_traits <
331                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
332             > ::type
333         {};
334         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
335
336         struct traits_BasketQueue_HP_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::HP > > >
339                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
340             > ::type
341         {};
342         typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
343
344         struct traits_BasketQueue_DHP : public
345             cds::intrusive::basket_queue::make_traits <
346                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
347             > ::type
348         {};
349         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
350
351         struct traits_BasketQueue_DHP_seqcst: public 
352             cds::intrusive::basket_queue::make_traits <
353                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
354                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
355             > ::type
356         {};
357         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
358
359         // BasketQueue + item counter
360         struct traits_BasketQueue_HP_ic : public
361             cds::intrusive::basket_queue::make_traits <
362                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
363                 ,cds::opt::item_counter< cds::atomicity::item_counter >
364             > ::type
365         {};
366         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
367
368         struct traits_BasketQueue_DHP_ic : public
369             cds::intrusive::basket_queue::make_traits <
370                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
371                 ,cds::opt::item_counter< cds::atomicity::item_counter >
372             > ::type
373         {};
374         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
375
376         // BasketQueue + stat
377         struct traits_BasketQueue_HP_stat : public
378             cds::intrusive::basket_queue::make_traits <
379                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
380                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
381             > ::type
382         {};
383         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
384
385         struct traits_BasketQueue_DHP_stat : public
386             cds::intrusive::basket_queue::make_traits <
387                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
388                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
389             > ::type
390         {};
391         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
392
393         // FCQueue
394         class traits_FCQueue_delay2:
395             public cds::intrusive::fcqueue::make_traits<
396                 cds::opt::back_off< cds::backoff::delay_of<2> >
397             >::type
398         {};
399         class traits_FCQueue_delay2_elimination:
400             public cds::intrusive::fcqueue::make_traits<
401                 cds::opt::back_off< cds::backoff::delay_of<2> >
402                 ,cds::opt::enable_elimination< true >
403             >::type
404         {};
405         class traits_FCQueue_delay2_elimination_stat:
406             public cds::intrusive::fcqueue::make_traits<
407                 cds::opt::back_off< cds::backoff::delay_of<2> >
408                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
409                 ,cds::opt::enable_elimination< true >
410             >::type
411         {};
412         class traits_FCQueue_expbackoff_elimination:
413             public cds::intrusive::fcqueue::make_traits<
414                 cds::opt::enable_elimination< true >
415                 ,cds::opt::elimination_backoff< cds::backoff::Default >
416             >::type
417         {};
418         class traits_FCQueue_expbackoff_elimination_stat:
419             public cds::intrusive::fcqueue::make_traits<
420                 cds::opt::enable_elimination< true >
421                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
422                 ,cds::opt::elimination_backoff< cds::backoff::Default >
423             >::type
424         {};
425
426         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
427         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
428         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
429         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
430         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
431
432         // SegmentedQueue
433         class traits_SegmentedQueue_spin_stat:
434             public cds::intrusive::segmented_queue::make_traits<
435                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
436             >::type
437         {};
438         class traits_SegmentedQueue_mutex_stat:
439             public cds::intrusive::segmented_queue::make_traits<
440                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
441                 ,cds::opt::lock_type< std::mutex >
442             >::type
443         {};
444         class traits_SegmentedQueue_mutex:
445             public cds::intrusive::segmented_queue::make_traits<
446                 cds::opt::lock_type< std::mutex >
447             >::type
448         {};
449
450         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
451         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
452         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
453         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
454
455         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T >  SegmentedQueue_PTB_spin;
456         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
457         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
458         typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
459
460         // Boost SList
461         typedef details::BoostSList< T, std::mutex >    BoostSList_mutex;
462         typedef details::BoostSList< T, cds::lock::Spin >   BoostSList_spin;
463     };
464 }
465
466
467 // *********************************************
468 // Queue statistics
469 namespace std {
470     /*
471     // cds::intrusive::queue_stat
472     template <typename Counter>
473     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
474     {
475         return o
476             << "\tStatistics:\n"
477             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
478             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
479             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
480             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
481             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
482             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
483     }
484     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
485     {
486         return o;
487     }
488     */
489
490
491     template <typename Counter>
492     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
493     {
494         return o
495             << "\tStatistics:\n"
496             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
497             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
498             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
499             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
500             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
501             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n"
502             << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
503             << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
504     }
505     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& s)
506     {
507         return o;
508     }
509
510     template <typename Counter>
511     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
512     {
513         return o
514             << "\tStatistics:\n"
515             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
516             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
517             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
518             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
519             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
520             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
521     }
522
523     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
524     {
525         return o;
526     }
527
528     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
529     {
530         return o;
531     }
532
533     // cds::intrusive::optimistic_queue::stat
534     template <typename Counter>
535     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
536     {
537         return o
538             << "\tStatistics:\n"
539             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
540             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
541             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
542             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
543             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
544             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
545             << "\t\t     fix list call: " << s.m_FixListCount.get() << "\n";
546     }
547
548     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
549     {
550         return o;
551     }
552
553     // cds::intrusive::fcqueue::stat
554     template <typename Counter>
555     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
556     {
557             return o << "\tStatistics:\n"
558                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
559                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
560                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
561                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
562                 << "\tFlat combining statistics:\n"
563                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
564                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
565                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
566                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
567                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
568                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
569                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
570                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
571                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
572                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
573     }
574
575     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
576     {
577         return o;
578     }
579
580     static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
581     {
582         return o;
583     }
584
585 } // namespace std
586
587 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H