issue#11: cds: changed __CDS_ guard prefix to CDSLIB_ for all .h files
[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_spin_padding :
429             public cds::intrusive::segmented_queue::make_traits<
430             cds::opt::padding< cds::opt::cache_line_padding >
431             >::type
432         {};
433         class traits_SegmentedQueue_mutex_stat :
434             public cds::intrusive::segmented_queue::make_traits<
435                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
436                 ,cds::opt::lock_type< std::mutex >
437             >::type
438         {};
439         class traits_SegmentedQueue_mutex:
440             public cds::intrusive::segmented_queue::make_traits<
441                 cds::opt::lock_type< std::mutex >
442             >::type
443         {};
444         class traits_SegmentedQueue_mutex_padding:
445             public cds::intrusive::segmented_queue::make_traits<
446                 cds::opt::lock_type< std::mutex >
447                 ,cds::opt::padding< cds::opt::cache_line_padding >
448             >::type
449         {};
450
451         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
452         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_padding >  SegmentedQueue_HP_spin_padding;
453         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
454         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
455         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_HP_mutex_padding;
456         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
457
458         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T >  SegmentedQueue_DHP_spin;
459         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_padding >  SegmentedQueue_DHP_spin_padding;
460         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_DHP_spin_stat;
461         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_DHP_mutex;
462         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_DHP_mutex_padding;
463         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_DHP_mutex_stat;
464
465         // Boost SList
466         typedef details::BoostSList< T, std::mutex >    BoostSList_mutex;
467         typedef details::BoostSList< T, cds::lock::Spin >   BoostSList_spin;
468     };
469 }
470
471
472 // *********************************************
473 // Queue statistics
474 namespace std {
475     /*
476     // cds::intrusive::queue_stat
477     template <typename Counter>
478     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
479     {
480         return o
481             << "\tStatistics:\n"
482             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
483             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
484             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
485             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
486             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
487             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
488     }
489     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
490     {
491         return o;
492     }
493     */
494
495
496     template <typename Counter>
497     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
498     {
499         return o
500             << "\tStatistics:\n"
501             << "\t\t      Enqueue count: " << s.m_EnqueueCount.get() << "\n"
502             << "\t\t       Enqueue race: " << s.m_EnqueueRace.get() << "\n"
503             << "\t\t      Dequeue count: " << s.m_DequeueCount.get() << "\n"
504             << "\t\t       Dequeue race: " << s.m_DequeueRace.get() << "\n"
505             << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
506             << "\t\t           Bad tail: " << s.m_BadTail.get() << "\n"
507             << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
508             << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
509     }
510     static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& /*s*/)
511     {
512         return o;
513     }
514
515     template <typename Counter>
516     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
517     {
518         return o
519             << "\tStatistics:\n"
520             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
521             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
522             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
523             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
524             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
525             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n";
526     }
527
528     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& /*s*/ )
529     {
530         return o;
531     }
532
533     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
534     {
535         return o;
536     }
537
538     // cds::intrusive::optimistic_queue::stat
539     template <typename Counter>
540     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
541     {
542         return o
543             << "\tStatistics:\n"
544             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
545             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get() << "\n"
546             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
547             << "\t\t      Dequeue race: " << s.m_DequeueRace.get() << "\n"
548             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
549             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
550             << "\t\t     fix list call: " << s.m_FixListCount.get() << "\n";
551     }
552
553     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& /*s*/ )
554     {
555         return o;
556     }
557
558     // cds::intrusive::fcqueue::stat
559     template <typename Counter>
560     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
561     {
562             return o << "\tStatistics:\n"
563                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
564                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
565                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
566                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
567                 << "\tFlat combining statistics:\n"
568                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
569                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
570                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
571                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
572                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
573                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
574                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
575                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
576                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
577                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
578     }
579
580     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )
581     {
582         return o;
583     }
584
585     static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& /*s*/ )
586     {
587         return o;
588     }
589
590 } // namespace std
591
592 #endif // #ifndef CDSUNIT_INTRUSIVE_QUEUE_TYPES_H