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