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