6cc4526c8d2a2c39d1aa4dcaffdfe89d84d531ce
[libcds.git] / tests / unit / stack / stack_type.h
1 //$$CDS-header$$
2
3 #ifndef __CDSUNIT_STACK_TYPES_H
4 #define __CDSUNIT_STACK_TYPES_H
5
6 #include <cds/container/treiber_stack.h>
7 #include <cds/container/fcstack.h>
8 #include <cds/container/fcdeque.h>
9
10 #include <cds/gc/hp.h>
11 #include <cds/gc/ptb.h>
12 #include <cds/gc/hrc.h>
13
14 #include <mutex>
15 #include <cds/lock/spinlock.h>
16 #include <stack>
17 #include <list>
18 #include <vector>
19
20 namespace stack {
21
22     namespace details {
23         template <typename GC, typename T, CDS_DECL_OPTIONS7>
24         class MichaelDequeL: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
25         {
26             typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
27         public:
28             MichaelDequeL( size_t nMaxItemCount )
29                 : base_class( (unsigned int) nMaxItemCount, 4 )
30                 {}
31
32             bool push( T const& v )
33             {
34                 return base_class::push_front( v );
35             }
36
37             bool pop( T& v )
38             {
39                 return base_class::pop_front( v );
40             }
41         };
42
43         template <typename GC, typename T, CDS_DECL_OPTIONS7>
44         class MichaelDequeR: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
45         {
46             typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
47         public:
48             MichaelDequeR( size_t nMaxItemCount )
49                 : base_class( (unsigned int) nMaxItemCount, 4 )
50             {}
51
52             bool push( T const& v )
53             {
54                 return base_class::push_back( v );
55             }
56
57             bool pop( T& v )
58             {
59                 return base_class::pop_back( v );
60             }
61         };
62
63         template <typename T, typename Traits=cds::container::fcdeque::type_traits>
64         class FCDequeL: public cds::container::FCDeque<T, std::deque<T>, Traits >
65         {
66             typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
67         public:
68             FCDequeL()
69             {}
70
71             FCDequeL(
72                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
73                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
74                 )
75                 : base_class( nCompactFactor, nCombinePassCount )
76             {}
77
78             bool push( T const& v )
79             {
80                 return base_class::push_front( v );
81             }
82
83             bool pop( T& v )
84             {
85                 return base_class::pop_front( v );
86             }
87         };
88
89         template <typename T, typename Traits=cds::container::fcdeque::type_traits>
90         class FCDequeR: public cds::container::FCDeque<T, std::deque<T>, Traits >
91         {
92             typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
93         public:
94             FCDequeR()
95             {}
96
97             FCDequeR(
98                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
99                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
100                 )
101                 : base_class( nCompactFactor, nCombinePassCount )
102             {}
103
104             bool push( T const& v )
105             {
106                 return base_class::push_back( v );
107             }
108
109             bool pop( T& v )
110             {
111                 return base_class::pop_back( v );
112             }
113         };
114
115         template < typename T, typename Stack, typename Lock>
116         class StdStack
117         {
118             Stack   m_Impl;
119             mutable Lock    m_Lock;
120             cds::container::treiber_stack::empty_stat m_stat;
121
122             typedef std::unique_lock<Lock>  unique_lock;
123
124         public:
125             bool push( T const& v )
126             {
127                 unique_lock l( m_Lock );
128                 m_Impl.push( v );
129                 return true;
130             }
131
132             bool pop( T& v )
133             {
134                 unique_lock l( m_Lock );
135                 if ( !m_Impl.empty() ) {
136                     v = m_Impl.top();
137                     m_Impl.pop();
138                     return true;
139                 }
140                 return false;
141             }
142
143             bool empty() const
144             {
145                 unique_lock l( m_Lock );
146                 return m_Impl.empty();
147             }
148
149             cds::container::treiber_stack::empty_stat const& statistics() const
150             {
151                 return m_stat;
152             }
153         };
154     }
155
156     template <typename T>
157     struct Types {
158
159     // TreiberStack
160         typedef cds::container::TreiberStack< cds::gc::HP, T
161         >       Treiber_HP;
162
163         typedef cds::container::TreiberStack< cds::gc::HP, T
164             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
165         >       Treiber_HP_seqcst;
166
167         typedef cds::container::TreiberStack< cds::gc::HP, T
168             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
169         >       Treiber_HP_stat;
170
171         typedef cds::container::TreiberStack< cds::gc::HRC, T
172         >       Treiber_HRC;
173
174         typedef cds::container::TreiberStack< cds::gc::HRC, T
175             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
176         >       Treiber_HRC_stat;
177
178         typedef cds::container::TreiberStack< cds::gc::PTB, T
179         > Treiber_PTB;
180
181         typedef cds::container::TreiberStack< cds::gc::PTB, T
182             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
183         >       Treiber_PTB_stat;
184
185         typedef cds::container::TreiberStack< cds::gc::HP, T
186             ,cds::opt::back_off<cds::backoff::yield>
187             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
188         > Treiber_HP_yield;
189         typedef cds::container::TreiberStack< cds::gc::HP, T
190             ,cds::opt::back_off<cds::backoff::pause>
191         > Treiber_HP_pause;
192         typedef cds::container::TreiberStack< cds::gc::HP, T,
193             cds::opt::back_off<
194                 cds::backoff::exponential<
195                     cds::backoff::pause,
196                     cds::backoff::yield
197                 >
198             >
199         > Treiber_HP_exp;
200
201         typedef cds::container::TreiberStack< cds::gc::HRC, T
202             ,cds::opt::back_off<cds::backoff::yield>
203         >  Treiber_HRC_yield;
204         typedef cds::container::TreiberStack< cds::gc::HRC, T
205             ,cds::opt::back_off<cds::backoff::pause>
206             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
207         > Treiber_HRC_pause;
208         typedef cds::container::TreiberStack< cds::gc::HRC, T
209             ,cds::opt::back_off<
210                 cds::backoff::exponential<
211                     cds::backoff::pause,
212                     cds::backoff::yield
213                 >
214             >
215         > Treiber_HRC_exp;
216
217         typedef cds::container::TreiberStack< cds::gc::PTB, T
218             ,cds::opt::back_off<cds::backoff::yield>
219         >  Treiber_PTB_yield;
220         typedef cds::container::TreiberStack< cds::gc::PTB, T
221             ,cds::opt::back_off<cds::backoff::pause>
222         > Treiber_PTB_pause;
223         typedef cds::container::TreiberStack< cds::gc::PTB, T
224             ,cds::opt::back_off<
225                 cds::backoff::exponential<
226                     cds::backoff::pause,
227                     cds::backoff::yield
228                 >
229             >
230             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
231         > Treiber_PTB_exp;
232
233
234     // Elimination stack
235         typedef cds::container::TreiberStack< cds::gc::HP, T
236             ,cds::opt::enable_elimination<true>
237         >       Elimination_HP;
238
239         typedef cds::container::TreiberStack< cds::gc::HP, T
240             ,cds::opt::enable_elimination<true>
241             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
242         >       Elimination_HP_2ms;
243
244         typedef cds::container::TreiberStack< cds::gc::HP, T
245             ,cds::opt::enable_elimination<true>
246             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
247             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
248         >       Elimination_HP_2ms_stat;
249
250         typedef cds::container::TreiberStack< cds::gc::HP, T
251             ,cds::opt::enable_elimination<true>
252             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
253         >       Elimination_HP_5ms;
254
255         typedef cds::container::TreiberStack< cds::gc::HP, T
256             ,cds::opt::enable_elimination<true>
257             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
258             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
259         >       Elimination_HP_5ms_stat;
260
261         typedef cds::container::TreiberStack< cds::gc::HP, T
262             ,cds::opt::enable_elimination<true>
263             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
264         >       Elimination_HP_10ms;
265
266         typedef cds::container::TreiberStack< cds::gc::HP, T
267             ,cds::opt::enable_elimination<true>
268             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
269             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
270         >       Elimination_HP_10ms_stat;
271
272         typedef cds::container::TreiberStack< cds::gc::HP, T
273             ,cds::opt::enable_elimination<true>
274             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
275         >       Elimination_HP_dyn;
276
277         typedef cds::container::TreiberStack< cds::gc::HP, T
278             ,cds::opt::enable_elimination<true>
279             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
280         >       Elimination_HP_seqcst;
281
282         typedef cds::container::TreiberStack< cds::gc::HP, T
283             ,cds::opt::enable_elimination<true>
284             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
285         >       Elimination_HP_stat;
286
287         typedef cds::container::TreiberStack< cds::gc::HP, T
288             ,cds::opt::enable_elimination<true>
289             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
290             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
291         >       Elimination_HP_dyn_stat;
292
293         typedef cds::container::TreiberStack< cds::gc::HRC, T
294             ,cds::opt::enable_elimination<true>
295         >       Elimination_HRC;
296
297         typedef cds::container::TreiberStack< cds::gc::HRC, T
298             ,cds::opt::enable_elimination<true>
299             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
300         >       Elimination_HRC_dyn;
301
302         typedef cds::container::TreiberStack< cds::gc::HRC, T
303             ,cds::opt::enable_elimination<true>
304             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
305         >       Elimination_HRC_stat;
306
307         typedef cds::container::TreiberStack< cds::gc::HRC, T
308             ,cds::opt::enable_elimination<true>
309             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
310             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
311         >       Elimination_HRC_dyn_stat;
312
313         typedef cds::container::TreiberStack< cds::gc::PTB, T
314             ,cds::opt::enable_elimination<true>
315             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
316         > Elimination_PTB_2ms;
317
318         typedef cds::container::TreiberStack< cds::gc::PTB, T
319             ,cds::opt::enable_elimination<true>
320             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
321             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
322         > Elimination_PTB_2ms_stat;
323
324         typedef cds::container::TreiberStack< cds::gc::PTB, T
325             ,cds::opt::enable_elimination<true>
326             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
327         > Elimination_PTB_5ms;
328
329         typedef cds::container::TreiberStack< cds::gc::PTB, T
330             ,cds::opt::enable_elimination<true>
331             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
332             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
333         > Elimination_PTB_5ms_stat;
334
335         typedef cds::container::TreiberStack< cds::gc::PTB, T
336             ,cds::opt::enable_elimination<true>
337             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
338         > Elimination_PTB_10ms;
339
340         typedef cds::container::TreiberStack< cds::gc::PTB, T
341             ,cds::opt::enable_elimination<true>
342             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
343             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
344         > Elimination_PTB_10ms_stat;
345
346         typedef cds::container::TreiberStack< cds::gc::PTB, T
347             ,cds::opt::enable_elimination<true>
348         > Elimination_PTB;
349
350         typedef cds::container::TreiberStack< cds::gc::PTB, T
351             ,cds::opt::enable_elimination<true>
352             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
353         > Elimination_PTB_dyn;
354
355         typedef cds::container::TreiberStack< cds::gc::PTB, T
356             ,cds::opt::enable_elimination<true>
357             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
358         >       Elimination_PTB_stat;
359
360         typedef cds::container::TreiberStack< cds::gc::PTB, T
361             ,cds::opt::enable_elimination<true>
362             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
363             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
364         >       Elimination_PTB_dyn_stat;
365
366         typedef cds::container::TreiberStack< cds::gc::HP, T
367             ,cds::opt::enable_elimination<true>
368             ,cds::opt::back_off<cds::backoff::yield>
369             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
370         > Elimination_HP_yield;
371
372         typedef cds::container::TreiberStack< cds::gc::HP, T
373             ,cds::opt::enable_elimination<true>
374             ,cds::opt::back_off<cds::backoff::pause>
375         > Elimination_HP_pause;
376
377         typedef cds::container::TreiberStack< cds::gc::HP, T
378             ,cds::opt::enable_elimination<true>
379             ,cds::opt::back_off<
380                 cds::backoff::exponential<
381                     cds::backoff::pause,
382                     cds::backoff::yield
383                 >
384             >
385         > Elimination_HP_exp;
386
387         typedef cds::container::TreiberStack< cds::gc::HRC, T
388             ,cds::opt::enable_elimination<true>
389             ,cds::opt::back_off<cds::backoff::yield>
390         >  Elimination_HRC_yield;
391
392         typedef cds::container::TreiberStack< cds::gc::HRC, T
393             ,cds::opt::enable_elimination<true>
394             ,cds::opt::back_off<cds::backoff::pause>
395             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
396         > Elimination_HRC_pause;
397
398         typedef cds::container::TreiberStack< cds::gc::HRC, T
399             ,cds::opt::enable_elimination<true>
400             ,cds::opt::back_off<
401                 cds::backoff::exponential<
402                     cds::backoff::pause,
403                     cds::backoff::yield
404                 >
405             >
406         > Elimination_HRC_exp;
407
408         typedef cds::container::TreiberStack< cds::gc::PTB, T
409             ,cds::opt::enable_elimination<true>
410             ,cds::opt::back_off<cds::backoff::yield>
411         >  Elimination_PTB_yield;
412
413         typedef cds::container::TreiberStack< cds::gc::PTB, T
414             ,cds::opt::enable_elimination<true>
415             ,cds::opt::back_off<cds::backoff::pause>
416         > Elimination_PTB_pause;
417
418         typedef cds::container::TreiberStack< cds::gc::PTB, T
419             ,cds::opt::enable_elimination<true>
420             ,cds::opt::back_off<
421                 cds::backoff::exponential<
422                     cds::backoff::pause,
423                     cds::backoff::yield
424                 >
425             >
426             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
427         > Elimination_PTB_exp;
428
429     // FCStack
430         typedef cds::container::FCStack< T > FCStack_deque;
431
432         struct traits_FCStack_stat:
433             public cds::container::fcstack::make_traits<
434                 cds::opt::stat< cds::container::fcstack::stat<> >
435             >::type
436         {};
437         struct traits_FCStack_elimination:
438             public cds::container::fcstack::make_traits<
439             cds::opt::enable_elimination< true >
440             >::type
441         {};
442         struct traits_FCStack_elimination_stat:
443             public cds::container::fcstack::make_traits<
444                 cds::opt::stat< cds::container::fcstack::stat<> >,
445                 cds::opt::enable_elimination< true >
446             >::type
447         {};
448         struct traits_FCStack_mutex:
449             public cds::container::fcstack::make_traits<
450                 cds::opt::lock_type< std::mutex >
451             >::type
452         {};
453
454         typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_mutex > FCStack_deque_mutex;
455         typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_stat > FCStack_deque_stat;
456         typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination > FCStack_deque_elimination;
457         typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination_stat > FCStack_deque_elimination_stat;
458         typedef cds::container::FCStack< T, std::stack<T, std::vector<T> > > FCStack_vector;
459         typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_mutex > FCStack_vector_mutex;
460         typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_stat > FCStack_vector_stat;
461         typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination > FCStack_vector_elimination;
462         typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination_stat > FCStack_vector_elimination_stat;
463         typedef cds::container::FCStack< T, std::stack<T, std::list<T> > > FCStack_list;
464         typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_mutex > FCStack_list_mutex;
465         typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_stat > FCStack_list_stat;
466         typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination > FCStack_list_elimination;
467         typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
468
469    // FCDeque
470         struct traits_FCDeque_stat:
471             public cds::container::fcdeque::make_traits<
472                 cds::opt::stat< cds::container::fcdeque::stat<> >
473             >::type
474         {};
475         struct traits_FCDeque_elimination:
476             public cds::container::fcdeque::make_traits<
477                 cds::opt::enable_elimination< true >
478             >::type
479         {};
480         struct traits_FCDeque_elimination_stat:
481             public cds::container::fcdeque::make_traits<
482                 cds::opt::stat< cds::container::fcdeque::stat<> >,
483                 cds::opt::enable_elimination< true >
484             >::type
485         {};
486         struct traits_FCDeque_mutex:
487             public cds::container::fcdeque::make_traits<
488                 cds::opt::lock_type< std::mutex >
489             >::type
490         {};
491
492
493         typedef details::FCDequeL< T > FCDequeL_default;
494         typedef details::FCDequeL< T, traits_FCDeque_mutex > FCDequeL_mutex;
495         typedef details::FCDequeL< T, traits_FCDeque_stat > FCDequeL_stat;
496         typedef details::FCDequeL< T, traits_FCDeque_elimination > FCDequeL_elimination;
497         typedef details::FCDequeL< T, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
498
499         typedef details::FCDequeR< T > FCDequeR_default;
500         typedef details::FCDequeR< T, traits_FCDeque_mutex > FCDequeR_mutex;
501         typedef details::FCDequeR< T, traits_FCDeque_stat > FCDequeR_stat;
502         typedef details::FCDequeR< T, traits_FCDeque_elimination > FCDequeR_elimination;
503         typedef details::FCDequeR< T, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
504
505     // MichaelDeque, left side
506         typedef details::MichaelDequeL< cds::gc::HP, T> MichaelDequeL_HP;
507         typedef details::MichaelDequeL< cds::gc::HP, T
508             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
509         > MichaelDequeL_HP_seqcst;
510
511         typedef details::MichaelDequeL< cds::gc::HP, T
512             ,cds::opt::item_counter< cds::atomicity::item_counter >
513         > MichaelDequeL_HP_ic;
514
515         typedef details::MichaelDequeL< cds::gc::HP, T
516             ,cds::opt::back_off<
517                 cds::backoff::exponential<
518                     cds::backoff::pause,
519                     cds::backoff::yield
520                 >
521             >
522         > MichaelDequeL_HP_exp;
523
524         typedef details::MichaelDequeL< cds::gc::HP, T
525             ,cds::opt::back_off< cds::backoff::yield >
526         > MichaelDequeL_HP_yield;
527
528         typedef details::MichaelDequeL< cds::gc::HP, T
529             ,cds::opt::stat<cds::intrusive::deque_stat<> >
530         > MichaelDequeL_HP_stat;
531
532
533         typedef details::MichaelDequeL< cds::gc::PTB, T> MichaelDequeL_PTB;
534         typedef details::MichaelDequeL< cds::gc::PTB, T
535             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
536         > MichaelDequeL_PTB_seqcst;
537
538         typedef details::MichaelDequeL< cds::gc::PTB, T
539             ,cds::opt::item_counter< cds::atomicity::item_counter >
540         > MichaelDequeL_PTB_ic;
541
542         typedef details::MichaelDequeL< cds::gc::PTB, T
543             ,cds::opt::back_off<
544             cds::backoff::exponential<
545             cds::backoff::pause,
546             cds::backoff::yield
547             >
548             >
549         > MichaelDequeL_PTB_exp;
550
551         typedef details::MichaelDequeL< cds::gc::PTB, T
552             ,cds::opt::back_off< cds::backoff::yield >
553         > MichaelDequeL_PTB_yield;
554
555         typedef details::MichaelDequeL< cds::gc::PTB, T
556             ,cds::opt::stat<cds::intrusive::michael_deque::stat<> >
557         > MichaelDequeL_PTB_stat;
558
559
560     // MichaelDeque, right side
561         typedef details::MichaelDequeR< cds::gc::HP, T> MichaelDequeR_HP;
562         typedef details::MichaelDequeR< cds::gc::HP, T
563             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
564         > MichaelDequeR_HP_seqcst;
565
566         typedef details::MichaelDequeR< cds::gc::HP, T
567             ,cds::opt::item_counter< cds::atomicity::item_counter >
568         > MichaelDequeR_HP_ic;
569
570         typedef details::MichaelDequeR< cds::gc::HP, T
571             ,cds::opt::back_off<
572             cds::backoff::exponential<
573             cds::backoff::pause,
574             cds::backoff::yield
575             >
576             >
577         > MichaelDequeR_HP_exp;
578
579         typedef details::MichaelDequeR< cds::gc::HP, T
580             ,cds::opt::back_off< cds::backoff::yield >
581         > MichaelDequeR_HP_yield;
582
583         typedef details::MichaelDequeR< cds::gc::HP, T
584             ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
585         > MichaelDequeR_HP_stat;
586
587         typedef details::MichaelDequeR< cds::gc::PTB, T> MichaelDequeR_PTB;
588         typedef details::MichaelDequeR< cds::gc::PTB, T
589             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
590         > MichaelDequeR_PTB_seqcst;
591
592         typedef details::MichaelDequeR< cds::gc::PTB, T
593             ,cds::opt::item_counter< cds::atomicity::item_counter >
594         > MichaelDequeR_PTB_ic;
595
596         typedef details::MichaelDequeR< cds::gc::PTB, T
597             ,cds::opt::back_off<
598                 cds::backoff::exponential<
599                     cds::backoff::pause,
600                     cds::backoff::yield
601                 >
602             >
603         > MichaelDequeR_PTB_exp;
604
605         typedef details::MichaelDequeR< cds::gc::PTB, T
606             ,cds::opt::stat< cds::intrusive::deque_stat<> >
607         > MichaelDequeR_PTB_stat;
608
609         typedef details::MichaelDequeR< cds::gc::PTB, T
610             ,cds::opt::back_off< cds::backoff::yield >
611         > MichaelDequeR_PTB_yield;
612
613
614         // std::stack
615         typedef details::StdStack< T, std::stack< T >, std::mutex >  StdStack_Deque_Mutex;
616         typedef details::StdStack< T, std::stack< T >, cds::lock::Spin > StdStack_Deque_Spin;
617         typedef details::StdStack< T, std::stack< T, std::vector<T> >, std::mutex >  StdStack_Vector_Mutex;
618         typedef details::StdStack< T, std::stack< T, std::vector<T> >, cds::lock::Spin > StdStack_Vector_Spin;
619         typedef details::StdStack< T, std::stack< T, std::list<T> >, std::mutex >  StdStack_List_Mutex;
620         typedef details::StdStack< T, std::stack< T, std::list<T> >, cds::lock::Spin > StdStack_List_Spin;
621
622     };
623 } // namespace stack
624
625 namespace std {
626     static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
627     {
628         return o << "\tStatistics:\n"
629             << "\t                    Push: " << s.m_PushCount.get()              << "\n"
630             << "\t                     Pop: " << s.m_PopCount.get()               << "\n"
631             << "\t         Push contention: " << s.m_PushRace.get()               << "\n"
632             << "\t          Pop contention: " << s.m_PopRace.get()                << "\n"
633             << "\t   m_ActivePushCollision: " << s.m_ActivePushCollision.get()    << "\n"
634             << "\t   m_PassivePopCollision: " << s.m_PassivePopCollision.get()    << "\n"
635             << "\t    m_ActivePopCollision: " << s.m_ActivePopCollision.get()     << "\n"
636             << "\t  m_PassivePushCollision: " << s.m_PassivePushCollision.get()   << "\n"
637             << "\t     m_EliminationFailed: " << s.m_EliminationFailed.get()      << "\n";
638     }
639
640     static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
641     {
642         return o;
643     }
644
645     static inline ostream& operator <<( ostream& o, cds::container::fcstack::empty_stat const& s )
646     {
647         return o;
648     }
649
650     static inline ostream& operator <<( ostream& o, cds::container::fcstack::stat<> const& s )
651     {
652         return o << "\tStatistics:\n"
653             << "\t                    Push: " << s.m_nPush.get()              << "\n"
654             << "\t                PushMove: " << s.m_nPushMove.get()          << "\n"
655             << "\t                     Pop: " << s.m_nPop.get()               << "\n"
656             << "\t               FailedPop: " << s.m_nFailedPop.get()         << "\n"
657             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
658             << "\tFlat combining statistics:\n"
659             << "\t        Combining factor: " << s.combining_factor()         << "\n"
660             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
661             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
662             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
663             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
664             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
665             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
666             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
667             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
668             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
669     }
670
671     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
672     {
673         return o;
674     }
675
676     static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
677     {
678         return o << "\tStatistics:\n"
679             << "\t              Push front: " << s.m_nPushFront.get()         << "\n"
680             << "\t         Push front move: " << s.m_nPushFrontMove.get()     << "\n"
681             << "\t               Push back: " << s.m_nPushBack.get()          << "\n"
682             << "\t          Push back move: " << s.m_nPushBackMove.get()      << "\n"
683             << "\t               Pop front: " << s.m_nPopFront.get()          << "\n"
684             << "\t        Failed pop front: " << s.m_nFailedPopFront.get()    << "\n"
685             << "\t                Pop back: " << s.m_nPopBack.get()           << "\n"
686             << "\t         Failed pop back: " << s.m_nFailedPopBack.get()     << "\n"
687             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
688             << "\tFlat combining statistics:\n"
689             << "\t        Combining factor: " << s.combining_factor()         << "\n"
690             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
691             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
692             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
693             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
694             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
695             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
696             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
697             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
698             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
699     }
700
701 } // namespace std
702
703 #endif // #ifndef __CDSUNIT_STACK_TYPES_H