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