Remove stack test for MichaelDeque
[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/fcstack.h>
8
9 #include <cds/gc/hp.h>
10 #include <cds/gc/ptb.h>
11 #include <cds/gc/hrc.h>
12
13 #include <mutex>
14 #include <cds/lock/spinlock.h>
15 #include <stack>
16 #include <list>
17 #include <vector>
18 #include <boost/intrusive/list.hpp>
19
20 namespace istack {
21
22     namespace details {
23
24         template < typename T, typename Stack, typename Lock>
25         class StdStack
26         {
27             Stack   m_Impl;
28             mutable Lock    m_Lock;
29             cds::intrusive::treiber_stack::empty_stat m_stat;
30
31             typedef std::unique_lock<Lock>  unique_lock;
32
33         public:
34             typedef T value_type;
35
36             bool push( T& v )
37             {
38                 unique_lock l( m_Lock );
39                 m_Impl.push( &v );
40                 return true;
41             }
42
43             T * pop()
44             {
45                 unique_lock l( m_Lock );
46                 if ( !m_Impl.empty() ) {
47                      T * v = m_Impl.top();
48                     m_Impl.pop();
49                     return v;
50                 }
51                 return nullptr;
52             }
53
54             bool empty() const
55             {
56                 unique_lock l( m_Lock );
57                 return m_Impl.empty();
58             }
59
60             cds::intrusive::treiber_stack::empty_stat const& statistics() const
61             {
62                 return m_stat;
63             }
64         };
65     }
66
67     template <typename T>
68     struct Types {
69
70     // TreiberStack
71         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
72         >       Treiber_HP;
73
74         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
75             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
76             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
77         >       Treiber_HP_seqcst;
78
79         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
80             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
81             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
82         >       Treiber_HP_stat;
83
84         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
85             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
86         >       Treiber_HRC;
87
88         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
89             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
90             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
91         >       Treiber_HRC_stat;
92
93         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
94             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
95         > Treiber_PTB;
96
97         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
98             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
99             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
100         >       Treiber_PTB_stat;
101
102         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
103             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
104             ,cds::opt::back_off<cds::backoff::yield>
105             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
106         > Treiber_HP_yield;
107
108         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
109             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
110             ,cds::opt::back_off<cds::backoff::pause>
111         > Treiber_HP_pause;
112
113         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
114             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
115             ,cds::opt::back_off<
116                 cds::backoff::exponential<
117                     cds::backoff::pause,
118                     cds::backoff::yield
119                 >
120             >
121         > Treiber_HP_exp;
122
123         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
124             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
125             ,cds::opt::back_off<cds::backoff::yield>
126         >  Treiber_HRC_yield;
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::back_off<cds::backoff::pause>
131             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
132         > Treiber_HRC_pause;
133
134         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
135             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
136             ,cds::opt::back_off<
137                 cds::backoff::exponential<
138                     cds::backoff::pause,
139                     cds::backoff::yield
140                 >
141             >
142         > Treiber_HRC_exp;
143
144         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
145             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
146             ,cds::opt::back_off<cds::backoff::yield>
147         >  Treiber_PTB_yield;
148
149         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
150             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
151             ,cds::opt::back_off<cds::backoff::pause>
152         > Treiber_PTB_pause;
153
154         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
155             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
156             ,cds::opt::back_off<
157                 cds::backoff::exponential<
158                     cds::backoff::pause,
159                     cds::backoff::yield
160                 >
161             >
162             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
163         > Treiber_PTB_exp;
164
165
166     // Elimination stack
167         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
168             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
169             ,cds::opt::enable_elimination<true>
170         >       Elimination_HP;
171
172         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
173             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
174             ,cds::opt::enable_elimination<true>
175             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
176         >       Elimination_HP_2ms;
177
178         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
179             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
180             ,cds::opt::enable_elimination<true>
181             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
182             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
183         >       Elimination_HP_2ms_stat;
184
185         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
186             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
187             ,cds::opt::enable_elimination<true>
188             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
189         >       Elimination_HP_5ms;
190
191         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
192             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
193             ,cds::opt::enable_elimination<true>
194             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
195             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
196         >       Elimination_HP_5ms_stat;
197
198         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
199             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
200             ,cds::opt::enable_elimination<true>
201             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
202         >       Elimination_HP_10ms;
203
204         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
205             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
206             ,cds::opt::enable_elimination<true>
207             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
208             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
209         >       Elimination_HP_10ms_stat;
210
211         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
212             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
213             ,cds::opt::enable_elimination<true>
214             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
215         >       Elimination_HP_dyn;
216
217         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
218             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
219             ,cds::opt::enable_elimination<true>
220             ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
221         >       Elimination_HP_seqcst;
222
223         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
224             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
225             ,cds::opt::enable_elimination<true>
226             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
227         >       Elimination_HP_stat;
228
229         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
230             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
231             ,cds::opt::enable_elimination<true>
232             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
233             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
234         >       Elimination_HP_dyn_stat;
235
236         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
237             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
238             ,cds::opt::enable_elimination<true>
239         >       Elimination_HRC;
240
241         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
242             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
243             ,cds::opt::enable_elimination<true>
244             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
245         >       Elimination_HRC_dyn;
246
247         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
248             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
249             ,cds::opt::enable_elimination<true>
250             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
251         >       Elimination_HRC_stat;
252
253         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
254             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
255             ,cds::opt::enable_elimination<true>
256             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
257             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
258         >       Elimination_HRC_dyn_stat;
259
260         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
261             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
262             ,cds::opt::enable_elimination<true>
263             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
264         > Elimination_PTB_2ms;
265
266         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
267             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
268             ,cds::opt::enable_elimination<true>
269             ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
270             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
271         > Elimination_PTB_2ms_stat;
272
273         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
274             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
275             ,cds::opt::enable_elimination<true>
276             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
277         > Elimination_PTB_5ms;
278
279         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
280             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
281             ,cds::opt::enable_elimination<true>
282             ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
283             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
284         > Elimination_PTB_5ms_stat;
285
286         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
287             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
288             ,cds::opt::enable_elimination<true>
289             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
290         > Elimination_PTB_10ms;
291
292         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
293             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
294             ,cds::opt::enable_elimination<true>
295             ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
296             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
297         > Elimination_PTB_10ms_stat;
298
299         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
300             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
301             ,cds::opt::enable_elimination<true>
302         > Elimination_PTB;
303
304         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
305             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
306             ,cds::opt::enable_elimination<true>
307             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
308         > Elimination_PTB_dyn;
309
310         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
311             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
312             ,cds::opt::enable_elimination<true>
313             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
314         >       Elimination_PTB_stat;
315
316         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
317             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
318             ,cds::opt::enable_elimination<true>
319             ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
320             ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
321         >       Elimination_PTB_dyn_stat;
322
323         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
324             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
325             ,cds::opt::enable_elimination<true>
326             ,cds::opt::back_off<cds::backoff::yield>
327             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
328         > Elimination_HP_yield;
329
330         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
331             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
332             ,cds::opt::enable_elimination<true>
333             ,cds::opt::back_off<cds::backoff::pause>
334         > Elimination_HP_pause;
335
336         typedef cds::intrusive::TreiberStack< cds::gc::HP, T
337             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
338             ,cds::opt::enable_elimination<true>
339             ,cds::opt::back_off<
340                 cds::backoff::exponential<
341                     cds::backoff::pause,
342                     cds::backoff::yield
343                 >
344             >
345         > Elimination_HP_exp;
346
347         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
348             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
349             ,cds::opt::enable_elimination<true>
350             ,cds::opt::back_off<cds::backoff::yield>
351         >  Elimination_HRC_yield;
352
353         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
354             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
355             ,cds::opt::enable_elimination<true>
356             ,cds::opt::back_off<cds::backoff::pause>
357             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
358         > Elimination_HRC_pause;
359
360         typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
361             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
362             ,cds::opt::enable_elimination<true>
363             ,cds::opt::back_off<
364                 cds::backoff::exponential<
365                     cds::backoff::pause,
366                     cds::backoff::yield
367                 >
368             >
369         > Elimination_HRC_exp;
370
371         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
372             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
373             ,cds::opt::enable_elimination<true>
374             ,cds::opt::back_off<cds::backoff::yield>
375         >  Elimination_PTB_yield;
376
377         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
378             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
379             ,cds::opt::enable_elimination<true>
380             ,cds::opt::back_off<cds::backoff::pause>
381         > Elimination_PTB_pause;
382
383         typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
384             ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
385             ,cds::opt::enable_elimination<true>
386             ,cds::opt::back_off<
387                 cds::backoff::exponential<
388                     cds::backoff::pause,
389                     cds::backoff::yield
390                 >
391             >
392             ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
393         > Elimination_PTB_exp;
394
395     // FCStack
396         typedef cds::intrusive::FCStack< T > FCStack_slist;
397
398         struct traits_FCStack_stat:
399             public cds::intrusive::fcstack::make_traits<
400                 cds::opt::stat< cds::intrusive::fcstack::stat<> >
401             >::type
402         {};
403         struct traits_FCStack_elimination:
404             public cds::intrusive::fcstack::make_traits<
405             cds::opt::enable_elimination< true >
406             >::type
407         {};
408         struct traits_FCStack_elimination_stat:
409             public cds::intrusive::fcstack::make_traits<
410                 cds::opt::stat< cds::intrusive::fcstack::stat<> >,
411                 cds::opt::enable_elimination< true >
412             >::type
413         {};
414
415         struct traits_FCStack_mutex_stat:
416             public cds::intrusive::fcstack::make_traits<
417                 cds::opt::stat< cds::intrusive::fcstack::stat<> >
418                 ,cds::opt::lock_type< std::mutex >
419             >::type
420         {};
421         struct traits_FCStack_mutex_elimination:
422             public cds::intrusive::fcstack::make_traits<
423                 cds::opt::enable_elimination< true >
424                 ,cds::opt::lock_type< std::mutex >
425             >::type
426         {};
427         struct traits_FCStack_mutex_elimination_stat:
428             public cds::intrusive::fcstack::make_traits<
429                 cds::opt::stat< cds::intrusive::fcstack::stat<> >
430                 ,cds::opt::enable_elimination< true >
431                 ,cds::opt::lock_type< std::mutex >
432             >::type
433         {};
434
435         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_stat > FCStack_slist_stat;
436         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination > FCStack_slist_elimination;
437         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination_stat > FCStack_slist_elimination_stat;
438         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_stat > FCStack_slist_mutex_stat;
439         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination > FCStack_slist_mutex_elimination;
440         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination_stat > FCStack_slist_mutex_elimination_stat;
441         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T > > FCStack_list;
442         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_stat > FCStack_list_stat;
443         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination > FCStack_list_elimination;
444         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
445         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_stat > FCStack_list_mutex_stat;
446         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination > FCStack_list_mutex_elimination;
447         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination_stat > FCStack_list_mutex_elimination_stat;
448
449
450         // std::stack
451         typedef details::StdStack< T, std::stack< T* >, std::mutex >  StdStack_Deque_Mutex;
452         typedef details::StdStack< T, std::stack< T* >, cds::lock::Spin > StdStack_Deque_Spin;
453         typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, std::mutex >  StdStack_Vector_Mutex;
454         typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds::lock::Spin > StdStack_Vector_Spin;
455         typedef details::StdStack< T, std::stack< T*, std::list<T*> >, std::mutex >  StdStack_List_Mutex;
456         typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds::lock::Spin > StdStack_List_Spin;
457
458     };
459 } // namespace istack
460
461 namespace std {
462     static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
463     {
464         return o << "\tStatistics:\n"
465             << "\t                    Push: " << s.m_PushCount.get()              << "\n"
466             << "\t                     Pop: " << s.m_PopCount.get()               << "\n"
467             << "\t         Push contention: " << s.m_PushRace.get()               << "\n"
468             << "\t          Pop contention: " << s.m_PopRace.get()                << "\n"
469             << "\t   m_ActivePushCollision: " << s.m_ActivePushCollision.get()    << "\n"
470             << "\t   m_PassivePopCollision: " << s.m_PassivePopCollision.get()    << "\n"
471             << "\t    m_ActivePopCollision: " << s.m_ActivePopCollision.get()     << "\n"
472             << "\t  m_PassivePushCollision: " << s.m_PassivePushCollision.get()   << "\n"
473             << "\t     m_EliminationFailed: " << s.m_EliminationFailed.get()      << "\n";
474     }
475
476     static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
477     {
478         return o;
479     }
480
481     static inline ostream& operator <<( ostream& o, cds::intrusive::fcstack::empty_stat const& s )
482     {
483         return o;
484     }
485
486     static inline ostream& operator <<( ostream& o, cds::intrusive::fcstack::stat<> const& s )
487     {
488         return o << "\tStatistics:\n"
489             << "\t                    Push: " << s.m_nPush.get()              << "\n"
490             << "\t                     Pop: " << s.m_nPop.get()               << "\n"
491             << "\t               FailedPop: " << s.m_nFailedPop.get()         << "\n"
492             << "\t  Collided push/pop pair: " << s.m_nCollided.get()          << "\n"
493             << "\tFlat combining statistics:\n"
494             << "\t        Combining factor: " << s.combining_factor()         << "\n"
495             << "\t         Operation count: " << s.m_nOperationCount.get()    << "\n"
496             << "\t      Combine call count: " << s.m_nCombiningCount.get()    << "\n"
497             << "\t        Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
498             << "\t   Deactivate pub-record: " << s.m_nDeactivatePubRecord.get()    << "\n"
499             << "\t     Activate pub-record: " << s.m_nActivatePubRecord.get()    << "\n"
500             << "\t       Create pub-record: " << s.m_nPubRecordCreated.get()  << "\n"
501             << "\t       Delete pub-record: " << s.m_nPubRecordDeteted.get()  << "\n"
502             << "\t      Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
503             << "\t      Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
504     }
505
506 } // namespace std
507
508 #endif // #ifndef __CDSUNIT_INTRUSIVE_STACK_TYPES_H