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