MSQueue, MoirQueue refactoring (not completed)
[libcds.git] / tests / unit / queue / queue_type.h
1 //$$CDS-header$$
2
3 #ifndef __CDSUNIT_QUEUE_TYPES_H
4 #define __CDSUNIT_QUEUE_TYPES_H
5
6 #include <cds/container/msqueue.h>
7 #include <cds/container/moir_queue.h>
8 #include <cds/container/rwqueue.h>
9 #include <cds/container/optimistic_queue.h>
10 #include <cds/container/tsigas_cycle_queue.h>
11 #include <cds/container/vyukov_mpmc_cycle_queue.h>
12 #include <cds/container/basket_queue.h>
13 #include <cds/container/fcqueue.h>
14 #include <cds/container/fcdeque.h>
15 #include <cds/container/segmented_queue.h>
16
17 #include <cds/gc/hp.h>
18 #include <cds/gc/hrc.h>
19 #include <cds/gc/ptb.h>
20
21 #include "queue/std_queue.h"
22 #include "lock/win32_lock.h"
23 #include "michael_alloc.h"
24 #include "print_segmentedqueue_stat.h"
25
26 #include <boost/container/deque.hpp>
27
28 namespace queue {
29     namespace details {
30         template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque=std::deque<T> >
31         class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
32         {
33             typedef cds::container::FCDeque<T, Deque, Traits > base_class;
34         public:
35             FCDequeL()
36             {}
37
38             FCDequeL(
39                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
40                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
41                 )
42                 : base_class( nCompactFactor, nCombinePassCount )
43             {}
44
45             bool push( T const& v )
46             {
47                 return base_class::push_front( v );
48             }
49             bool enqueue( T const& v )
50             {
51                 return push( v );
52             }
53
54             bool pop( T& v )
55             {
56                 return base_class::pop_back( v );
57             }
58             bool deque( T& v )
59             {
60                 return pop(v);
61             }
62         };
63
64         template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque = std::deque<T> >
65         class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
66         {
67             typedef cds::container::FCDeque<T, Deque, Traits > base_class;
68         public:
69             FCDequeR()
70             {}
71
72             FCDequeR(
73                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
74                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
75                 )
76                 : base_class( nCompactFactor, nCombinePassCount )
77             {}
78
79             bool push( T const& v )
80             {
81                 return base_class::push_back( v );
82             }
83             bool enqueue( T const& v )
84             {
85                 return push( v );
86             }
87
88             bool pop( T& v )
89             {
90                 return base_class::pop_front( v );
91             }
92             bool deque( T& v )
93             {
94                 return pop(v);
95             }
96         };
97
98     } // namespace details
99
100     template <typename Value>
101     struct Types {
102
103         // MSQueue
104         typedef cds::container::MSQueue<
105             cds::gc::HP , Value
106         >   MSQueue_HP;
107
108         typedef cds::container::MSQueue<
109             cds::gc::HP , Value
110             ,cds::opt::allocator< memory::MichaelAllocator<int> >
111         >   MSQueue_HP_michaelAlloc;
112
113         typedef cds::container::MSQueue<
114             cds::gc::HP, Value
115             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
116         >   MSQueue_HP_seqcst;
117
118         typedef cds::container::MSQueue< cds::gc::HRC,
119             Value
120         >   MSQueue_HRC;
121
122         typedef cds::container::MSQueue< cds::gc::HRC,
123             Value
124             ,cds::opt::allocator< memory::MichaelAllocator<int> >
125         >   MSQueue_HRC_michaelAlloc;
126
127         typedef cds::container::MSQueue< cds::gc::HRC,
128             Value
129             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
130         >   MSQueue_HRC_seqcst;
131
132         typedef cds::container::MSQueue< cds::gc::PTB,
133             Value
134         >   MSQueue_PTB;
135
136         typedef cds::container::MSQueue< cds::gc::PTB,
137             Value
138             ,cds::opt::allocator< memory::MichaelAllocator<int> >
139         >   MSQueue_PTB_michaelAlloc;
140
141         typedef cds::container::MSQueue< cds::gc::PTB,
142             Value
143             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
144         >   MSQueue_PTB_seqcst;
145
146         // MSQueue + item counter
147         typedef cds::container::MSQueue< cds::gc::HP,
148             Value
149             ,cds::opt::item_counter< cds::atomicity::item_counter >
150         >   MSQueue_HP_ic;
151
152         typedef cds::container::MSQueue< cds::gc::HRC,
153             Value
154             ,cds::opt::item_counter< cds::atomicity::item_counter >
155         >   MSQueue_HRC_ic;
156
157         typedef cds::container::MSQueue< cds::gc::PTB,
158             Value
159             ,cds::opt::item_counter< cds::atomicity::item_counter >
160         >   MSQueue_PTB_ic;
161
162         // MSQueue + stat
163         typedef cds::container::MSQueue< cds::gc::HP,
164             Value
165             ,cds::opt::stat< cds::intrusive::queue_stat<> >
166         >   MSQueue_HP_stat;
167
168         typedef cds::container::MSQueue< cds::gc::HRC,
169             Value
170             ,cds::opt::stat< cds::intrusive::queue_stat<> >
171         >   MSQueue_HRC_stat;
172
173         typedef cds::container::MSQueue< cds::gc::PTB,
174             Value
175             ,cds::opt::stat< cds::intrusive::queue_stat<> >
176         >   MSQueue_PTB_stat;
177
178
179         // MoirQueue
180         typedef cds::container::MoirQueue< cds::gc::HP,
181             Value
182         >   MoirQueue_HP;
183
184         typedef cds::container::MoirQueue< cds::gc::HP,
185             Value
186             ,cds::opt::allocator< memory::MichaelAllocator<int> >
187         >   MoirQueue_HP_michaelAlloc;
188
189         typedef cds::container::MoirQueue< cds::gc::HP,
190             Value
191             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
192         >   MoirQueue_HP_seqcst;
193
194         typedef cds::container::MoirQueue< cds::gc::HRC,
195             Value
196         >   MoirQueue_HRC;
197
198         typedef cds::container::MoirQueue< cds::gc::HRC,
199             Value
200             ,cds::opt::allocator< memory::MichaelAllocator<int> >
201         >   MoirQueue_HRC_michaelAlloc;
202
203         typedef cds::container::MoirQueue< cds::gc::HRC,
204             Value
205             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
206         >   MoirQueue_HRC_seqcst;
207
208         typedef cds::container::MoirQueue< cds::gc::PTB,
209             Value
210         >   MoirQueue_PTB;
211
212         typedef cds::container::MoirQueue< cds::gc::PTB,
213             Value
214             ,cds::opt::allocator< memory::MichaelAllocator<int> >
215         >   MoirQueue_PTB_michaelAlloc;
216
217         typedef cds::container::MoirQueue< cds::gc::PTB,
218             Value
219             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
220         >   MoirQueue_PTB_seqcst;
221
222         // MoirQueue + item counter
223         typedef cds::container::MoirQueue< cds::gc::HP,
224             Value
225             ,cds::opt::item_counter< cds::atomicity::item_counter >
226         >   MoirQueue_HP_ic;
227
228         typedef cds::container::MoirQueue< cds::gc::HRC,
229             Value
230             ,cds::opt::item_counter< cds::atomicity::item_counter >
231         >   MoirQueue_HRC_ic;
232
233         typedef cds::container::MoirQueue< cds::gc::PTB,
234             Value
235             ,cds::opt::item_counter< cds::atomicity::item_counter >
236         >   MoirQueue_PTB_ic;
237
238         // MoirQueue + stat
239         typedef cds::container::MoirQueue< cds::gc::HP,
240             Value
241             ,cds::opt::stat< cds::intrusive::queue_stat<> >
242         >   MoirQueue_HP_stat;
243
244         typedef cds::container::MoirQueue< cds::gc::HRC,
245             Value
246             ,cds::opt::stat< cds::intrusive::queue_stat<> >
247         >   MoirQueue_HRC_stat;
248
249         typedef cds::container::MoirQueue< cds::gc::PTB,
250             Value
251             ,cds::opt::stat< cds::intrusive::queue_stat<> >
252         >   MoirQueue_PTB_stat;
253
254         // OptimisticQueue
255         typedef cds::container::OptimisticQueue< cds::gc::HP,
256             Value
257         >   OptimisticQueue_HP;
258
259         typedef cds::container::OptimisticQueue< cds::gc::HP,
260             Value
261             ,cds::opt::allocator< memory::MichaelAllocator<int> >
262         >   OptimisticQueue_HP_michaelAlloc;
263
264         typedef cds::container::OptimisticQueue< cds::gc::HP,
265             Value
266             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
267         >   OptimisticQueue_HP_seqcst;
268
269         typedef cds::container::OptimisticQueue< cds::gc::PTB,
270             Value
271         >   OptimisticQueue_PTB;
272
273         typedef cds::container::OptimisticQueue< cds::gc::PTB,
274             Value
275             ,cds::opt::allocator< memory::MichaelAllocator<int> >
276         >   OptimisticQueue_PTB_michaelAlloc;
277
278         typedef cds::container::OptimisticQueue< cds::gc::PTB,
279             Value
280             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
281         >   OptimisticQueue_PTB_seqcst;
282
283
284         // OptimisticQueue + item counter
285         typedef cds::container::OptimisticQueue< cds::gc::HP,
286             Value
287             ,cds::opt::item_counter< cds::atomicity::item_counter >
288         >   OptimisticQueue_HP_ic;
289
290         typedef cds::container::OptimisticQueue< cds::gc::PTB,
291             Value
292             ,cds::opt::item_counter< cds::atomicity::item_counter >
293         >   OptimisticQueue_PTB_ic;
294
295         // OptimisticQueue + stat
296         typedef cds::container::OptimisticQueue< cds::gc::HP,
297             Value
298             ,cds::opt::stat< cds::intrusive::queue_stat<> >
299         >   OptimisticQueue_HP_stat;
300
301         typedef cds::container::OptimisticQueue< cds::gc::PTB,
302             Value
303             ,cds::opt::stat< cds::intrusive::queue_stat<> >
304         >   OptimisticQueue_PTB_stat;
305
306         // TsigasCycleQueue
307         class TsigasCycleQueue_dyn
308             : public cds::container::TsigasCycleQueue<
309                 Value
310                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
311             >
312         {
313             typedef cds::container::TsigasCycleQueue<
314                 Value
315                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
316             > base_class;
317         public:
318             TsigasCycleQueue_dyn()
319                 : base_class( 1024 * 64 )
320             {}
321
322             TsigasCycleQueue_dyn( size_t nCapacity )
323                 : base_class( nCapacity )
324             {}
325
326             cds::opt::none statistics() const
327             {
328                 return cds::opt::none();
329             }
330         };
331
332         class TsigasCycleQueue_dyn_michaelAlloc
333             : public cds::container::TsigasCycleQueue<
334                 Value
335                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
336                 ,cds::opt::allocator< memory::MichaelAllocator<int> >
337             >
338         {
339             typedef cds::container::TsigasCycleQueue<
340                 Value
341                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
342                 ,cds::opt::allocator< memory::MichaelAllocator<int> >
343             > base_class;
344         public:
345             TsigasCycleQueue_dyn_michaelAlloc()
346                 : base_class( 1024 * 64 )
347             {}
348
349             TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
350                 : base_class( nCapacity )
351             {}
352
353             cds::opt::none statistics() const
354             {
355                 return cds::opt::none();
356             }
357         };
358
359         class TsigasCycleQueue_dyn_ic
360             : public cds::container::TsigasCycleQueue<
361                 Value
362                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
363                 ,cds::opt::item_counter< cds::atomicity::item_counter >
364             >
365         {
366             typedef cds::container::TsigasCycleQueue<
367                 Value
368                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
369                 ,cds::opt::item_counter< cds::atomicity::item_counter >
370             > base_class;
371         public:
372             TsigasCycleQueue_dyn_ic()
373                 : base_class( 1024 * 64 )
374             {}
375             TsigasCycleQueue_dyn_ic( size_t nCapacity )
376                 : base_class( nCapacity )
377             {}
378
379             cds::opt::none statistics() const
380             {
381                 return cds::opt::none();
382             }
383         };
384
385         // VyukovMPMCCycleQueue
386         class VyukovMPMCCycleQueue_dyn
387             : public cds::container::VyukovMPMCCycleQueue<
388                 Value
389                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
390             >
391         {
392             typedef cds::container::VyukovMPMCCycleQueue<
393                 Value
394                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
395             > base_class;
396         public:
397             VyukovMPMCCycleQueue_dyn()
398                 : base_class( 1024 * 64 )
399             {}
400             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
401                 : base_class( nCapacity )
402             {}
403
404             cds::opt::none statistics() const
405             {
406                 return cds::opt::none();
407             }
408         };
409
410         class VyukovMPMCCycleQueue_dyn_michaelAlloc
411             : public cds::container::VyukovMPMCCycleQueue<
412             Value
413             ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
414             >
415         {
416             typedef cds::container::VyukovMPMCCycleQueue<
417                 Value
418                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
419             > base_class;
420         public:
421             VyukovMPMCCycleQueue_dyn_michaelAlloc()
422                 : base_class( 1024 * 64 )
423             {}
424             VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
425                 : base_class( nCapacity )
426             {}
427
428             cds::opt::none statistics() const
429             {
430                 return cds::opt::none();
431             }
432         };
433
434         class VyukovMPMCCycleQueue_dyn_ic
435             : public cds::container::VyukovMPMCCycleQueue<
436                 Value
437                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
438                 ,cds::opt::item_counter< cds::atomicity::item_counter >
439             >
440         {
441             typedef cds::container::VyukovMPMCCycleQueue<
442                 Value
443                 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
444                 ,cds::opt::item_counter< cds::atomicity::item_counter >
445             > base_class;
446         public:
447             VyukovMPMCCycleQueue_dyn_ic()
448                 : base_class( 1024 * 64 )
449             {}
450             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
451                 : base_class( nCapacity )
452             {}
453
454             cds::opt::none statistics() const
455             {
456                 return cds::opt::none();
457             }
458         };
459
460         // BasketQueue
461         typedef cds::container::BasketQueue<
462             cds::gc::HP , Value
463         >   BasketQueue_HP;
464
465         typedef cds::container::BasketQueue<
466             cds::gc::HP , Value
467             ,cds::opt::allocator< memory::MichaelAllocator<int> >
468         >   BasketQueue_HP_michaelAlloc;
469
470         typedef cds::container::BasketQueue<
471             cds::gc::HP, Value
472             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
473         >   BasketQueue_HP_seqcst;
474
475         typedef cds::container::BasketQueue< cds::gc::HRC,
476             Value
477         >   BasketQueue_HRC;
478
479         typedef cds::container::BasketQueue< cds::gc::HRC,
480             Value
481             ,cds::opt::allocator< memory::MichaelAllocator<int> >
482         >   BasketQueue_HRC_michaelAlloc;
483
484         typedef cds::container::BasketQueue< cds::gc::HRC,
485             Value
486             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
487         >   BasketQueue_HRC_seqcst;
488
489         typedef cds::container::BasketQueue< cds::gc::PTB,
490             Value
491         >   BasketQueue_PTB;
492
493         typedef cds::container::BasketQueue< cds::gc::PTB,
494             Value
495             ,cds::opt::allocator< memory::MichaelAllocator<int> >
496         >   BasketQueue_PTB_michaelAlloc;
497
498         typedef cds::container::BasketQueue< cds::gc::PTB,
499             Value
500             ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
501         >   BasketQueue_PTB_seqcst;
502
503         // BasketQueue + item counter
504         typedef cds::container::BasketQueue< cds::gc::HP,
505             Value
506             ,cds::opt::item_counter< cds::atomicity::item_counter >
507         >   BasketQueue_HP_ic;
508
509         typedef cds::container::BasketQueue< cds::gc::HRC,
510             Value
511             ,cds::opt::item_counter< cds::atomicity::item_counter >
512         >   BasketQueue_HRC_ic;
513
514         typedef cds::container::BasketQueue< cds::gc::PTB,
515             Value
516             ,cds::opt::item_counter< cds::atomicity::item_counter >
517         >   BasketQueue_PTB_ic;
518
519         // BasketQueue + stat
520         typedef cds::container::BasketQueue< cds::gc::HP,
521             Value
522             ,cds::opt::stat< cds::intrusive::queue_stat<> >
523         >   BasketQueue_HP_stat;
524
525         typedef cds::container::BasketQueue< cds::gc::HRC,
526             Value
527             ,cds::opt::stat< cds::intrusive::queue_stat<> >
528         >   BasketQueue_HRC_stat;
529
530         typedef cds::container::BasketQueue< cds::gc::PTB,
531             Value
532             ,cds::opt::stat< cds::intrusive::queue_stat<> >
533         >   BasketQueue_PTB_stat;
534
535
536         // RWQueue
537         typedef cds::container::RWQueue<
538             Value
539         > RWQueue_Spin;
540
541         typedef cds::container::RWQueue<
542             Value
543             ,cds::opt::item_counter< cds::atomicity::item_counter >
544         > RWQueue_Spin_ic;
545
546         typedef cds::container::RWQueue<
547             Value
548             ,cds::opt::stat< cds::intrusive::queue_stat<> >
549         > RWQueue_Spin_stat;
550
551         // FCQueue
552         class traits_FCQueue_elimination:
553             public cds::container::fcqueue::make_traits<
554                 cds::opt::enable_elimination< true >
555             >::type
556         {};
557         class traits_FCQueue_elimination_stat:
558             public cds::container::fcqueue::make_traits<
559                 cds::opt::enable_elimination< true >
560                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
561             >::type
562         {};
563
564         typedef cds::container::FCQueue< Value > FCQueue_deque;
565         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
566         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
567
568         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
569         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
570         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
571
572
573    // FCDeque
574         struct traits_FCDeque_stat:
575             public cds::container::fcdeque::make_traits<
576                 cds::opt::stat< cds::container::fcdeque::stat<> >
577             >::type
578         {};
579         struct traits_FCDeque_elimination:
580             public cds::container::fcdeque::make_traits<
581                 cds::opt::enable_elimination< true >
582             >::type
583         {};
584         struct traits_FCDeque_elimination_stat:
585             public cds::container::fcdeque::make_traits<
586                 cds::opt::stat< cds::container::fcdeque::stat<> >,
587                 cds::opt::enable_elimination< true >
588             >::type
589         {};
590         struct traits_FCDeque_mutex:
591             public cds::container::fcdeque::make_traits<
592                 cds::opt::lock_type< std::mutex >
593             >::type
594         {};
595
596         typedef details::FCDequeL< Value > FCDequeL_default;
597         typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
598         typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
599         typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
600         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
601
602         typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
603         typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
604         typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
605         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
606
607         typedef details::FCDequeR< Value > FCDequeR_default;
608         typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
609         typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
610         typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
611         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
612
613         typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
614         typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
615         typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
616         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
617
618         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
619         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
620         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_BoostMutex;
621         typedef StdQueue_list<Value, std::mutex>    StdQueue_list_BoostMutex;
622 #ifdef UNIT_LOCK_WIN_CS
623         typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
624         typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
625         typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
626         typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
627 #endif
628
629         // SegmentedQueue
630         class traits_SegmentedQueue_spin_stat:
631             public cds::container::segmented_queue::make_traits<
632                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
633             >::type
634         {};
635         class traits_SegmentedQueue_mutex_stat:
636             public cds::container::segmented_queue::make_traits<
637                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
638                 ,cds::opt::lock_type< std::mutex >
639             >::type
640         {};
641         class traits_SegmentedQueue_mutex:
642             public cds::container::segmented_queue::make_traits<
643                 cds::opt::lock_type< std::mutex >
644             >::type
645         {};
646
647         typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
648         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
649         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
650         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
651
652         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value >  SegmentedQueue_PTB_spin;
653         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_PTB_spin_stat;
654         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_PTB_mutex;
655         typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_PTB_mutex_stat;
656
657
658     };
659 }
660
661
662 // *********************************************
663 // Queue statistics
664 namespace std {
665
666     // cds::intrusive::queue_stat
667     template <typename Counter>
668     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
669     {
670         return o
671             << "\tStatistics:\n"
672             << "\t\t     Enqueue count: " << s.m_EnqueueCount.get() << "\n"
673             << "\t\t      Enqueue race: " << s.m_EnqueueRace.get()  << "\n"
674             << "\t\t     Dequeue count: " << s.m_DequeueCount.get() << "\n"
675             << "\t\t      Dequeue race: " << s.m_DequeueRace.get()  << "\n"
676             << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
677             << "\t\t          Bad tail: " << s.m_BadTail.get() << "\n"
678 ;
679     }
680
681     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
682     {
683         return o;
684     }
685
686     static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
687     {
688         return o;
689     }
690
691     // cds::intrusive::optimistic_queue::stat
692     template <typename Counter>
693     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
694     {
695         return o
696             << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
697             << "\t\t"
698             << "\t\t    fix list call: " << s.m_FixListCount.get() << "\n";
699     }
700
701     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
702     {
703         return o;
704     }
705
706     // cds::intrusive::basket_queue::stat
707     template <typename Counter>
708     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
709     {
710         return o
711             << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
712             << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
713             << "\t\t    Add basket count: " << s.m_AddBasketCount.get() << "\n";
714     }
715
716     static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
717     {
718         return o;
719     }
720
721     // cds::container::fcqueue::stat
722     template <typename Counter>
723     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
724     {
725             return o << "\tStatistics:\n"
726                 << "\t                    Push: " << s.m_nEnqueue.get()           << "\n"
727                 << "\t                PushMove: " << s.m_nEnqMove.get()           << "\n"
728                 << "\t                     Pop: " << s.m_nDequeue.get()           << "\n"
729                 << "\t               FailedPop: " << s.m_nFailedDeq.get()         << "\n"
730                 << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
731                 << "\tFlat combining statistics:\n"
732                 << "\t        Combining factor: " << s.combining_factor()         << "\n"
733                 << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
734                 << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
735                 << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
736                 << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
737                 << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
738                 << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
739                 << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
740                 << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
741                 << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
742     }
743
744     static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
745     {
746         return o;
747     }
748
749     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
750     {
751         return o;
752     }
753
754     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
755     {
756         return o << "\tStatistics:\n"
757             << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
758             << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
759             << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
760             << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
761             << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
762             << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
763             << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
764             << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
765             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
766             << "\tFlat combining statistics:\n"
767             << "\t        Combining factor: " << s.combining_factor()         << "\n"
768             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
769             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
770             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
771             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
772             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
773             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
774             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
775             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
776             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
777     }
778
779 }
780
781 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H