Changed cds_std namespace to std, removed cds/details/std directory, use STL headers...
[libcds.git] / tests / test-hdr / stack / hdr_intrusive_fcstack.cpp
1 //$$CDS-header$$
2
3 #include "cppunit/cppunit_proxy.h"
4 #include <cds/intrusive/fcstack.h>
5
6 #include <boost/intrusive/list.hpp>
7
8 namespace stack {
9
10     class TestIntrusiveFCStack: public CppUnitMini::TestCase
11     {
12     public:
13         template <typename Hook>
14         struct base_hook_item: public Hook
15         {
16             int nVal;
17             int nDisposeCount;
18
19             base_hook_item()
20                 : nDisposeCount(0)
21             {}
22         };
23
24         template <typename Hook>
25         struct member_hook_item
26         {
27             int nVal;
28             int nDisposeCount;
29             Hook hMember;
30
31             member_hook_item()
32                 : nDisposeCount(0)
33             {}
34         };
35
36         struct faked_disposer
37         {
38             template <typename T>
39             void operator ()( T * p )
40             {
41                 ++p->nDisposeCount;
42             }
43         };
44
45         template <class Stack>
46         void test()
47         {
48             Stack stack;
49             test_with(stack);
50         }
51
52         template <class Stack>
53         void test_with( Stack& stack )
54         {
55             typedef typename Stack::value_type  value_type;
56
57             CPPUNIT_ASSERT( stack.empty() );
58
59             value_type v1, v2, v3;
60             v1.nVal = 1;
61             v2.nVal = 2;
62             v3.nVal = 3;
63             CPPUNIT_ASSERT( stack.push(v1));
64             CPPUNIT_ASSERT( !stack.empty() );
65             CPPUNIT_ASSERT( stack.push(v2));
66             CPPUNIT_ASSERT( !stack.empty() );
67             CPPUNIT_ASSERT( stack.push(v3));
68             CPPUNIT_ASSERT( !stack.empty() );
69
70             value_type * pv;
71             pv = stack.pop();
72             CPPUNIT_ASSERT( pv != NULL );
73             CPPUNIT_ASSERT( pv->nVal == 3 );
74             CPPUNIT_ASSERT( !stack.empty() );
75             pv = stack.pop();
76             CPPUNIT_ASSERT( pv != NULL );
77             CPPUNIT_ASSERT( pv->nVal == 2 );
78             CPPUNIT_ASSERT( !stack.empty() );
79             pv = stack.pop();
80             CPPUNIT_ASSERT( pv != NULL );
81             CPPUNIT_ASSERT( pv->nVal == 1 );
82             CPPUNIT_ASSERT( stack.empty() );
83             pv = stack.pop();
84             CPPUNIT_ASSERT( pv == NULL );
85
86             CPPUNIT_ASSERT( v1.nDisposeCount == 0 );
87             CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
88             CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
89
90             stack.push(v1);
91             stack.push(v2);
92             stack.push(v3);
93
94             stack.clear();
95             CPPUNIT_ASSERT( stack.empty() );
96
97             if ( !std::is_same<typename Stack::disposer, cds::intrusive::opt::v::empty_disposer>::value ) {
98                 CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
99                 CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
100                 CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
101             }
102         }
103
104         void FCStack_slist();
105         void FCStack_slist_mutex();
106         void FCStack_slist_elimination();
107         void FCStack_slist_elimination_stat();
108         void FCStack_slist_member();
109         void FCStack_slist_member_elimination();
110         void FCStack_slist_member_elimination_stat();
111         void FCStack_list();
112         void FCStack_list_mutex();
113         void FCStack_list_elimination();
114         void FCStack_list_elimination_stat();
115         void FCStack_list_member();
116         void FCStack_list_member_elimination();
117         void FCStack_list_member_elimination_stat();
118
119         CPPUNIT_TEST_SUITE(TestIntrusiveFCStack)
120             CPPUNIT_TEST(FCStack_slist)
121             CPPUNIT_TEST(FCStack_slist_mutex)
122             CPPUNIT_TEST(FCStack_slist_elimination)
123             CPPUNIT_TEST(FCStack_slist_elimination_stat)
124             CPPUNIT_TEST(FCStack_slist_member)
125             CPPUNIT_TEST(FCStack_slist_member_elimination)
126             CPPUNIT_TEST(FCStack_slist_member_elimination_stat)
127             CPPUNIT_TEST(FCStack_list)
128             CPPUNIT_TEST(FCStack_list_mutex)
129             CPPUNIT_TEST(FCStack_list_elimination)
130             CPPUNIT_TEST(FCStack_list_elimination_stat)
131             CPPUNIT_TEST(FCStack_list_member)
132             CPPUNIT_TEST(FCStack_list_member_elimination)
133             CPPUNIT_TEST(FCStack_list_member_elimination_stat)
134         CPPUNIT_TEST_SUITE_END()
135     };
136
137     void TestIntrusiveFCStack::FCStack_slist()
138     {
139         typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
140         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type > > stack_type;
141         test<stack_type>();
142     }
143
144     void TestIntrusiveFCStack::FCStack_slist_mutex()
145     {
146         typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
147         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type >,
148             cds::intrusive::fcstack::make_traits<
149                 cds::opt::lock_type< std::mutex >
150             >::type
151         > stack_type;
152         test<stack_type>();
153     }
154
155     void TestIntrusiveFCStack::FCStack_slist_elimination()
156     {
157         typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
158         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type >,
159             cds::intrusive::fcstack::make_traits<
160                 cds::opt::enable_elimination< true >
161             >::type
162         > stack_type;
163         test<stack_type>();
164     }
165
166     void TestIntrusiveFCStack::FCStack_slist_elimination_stat()
167     {
168         typedef base_hook_item< boost::intrusive::slist_base_hook<> > value_type;
169         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type >,
170             cds::intrusive::fcstack::make_traits<
171                 cds::opt::enable_elimination< true >
172                 ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
173             >::type
174         > stack_type;
175         test<stack_type>();
176     }
177
178     void TestIntrusiveFCStack::FCStack_slist_member()
179     {
180         typedef member_hook_item< boost::intrusive::slist_member_hook<> > value_type;
181         typedef boost::intrusive::member_hook<value_type, boost::intrusive::slist_member_hook<>, &value_type::hMember> member_option;
182
183         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type, member_option > > stack_type;
184         test<stack_type>();
185     }
186
187     void TestIntrusiveFCStack::FCStack_slist_member_elimination()
188     {
189         typedef member_hook_item< boost::intrusive::slist_member_hook<> > value_type;
190         typedef boost::intrusive::member_hook<value_type, boost::intrusive::slist_member_hook<>, &value_type::hMember> member_option;
191
192         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type, member_option >,
193             cds::intrusive::fcstack::make_traits<
194                 cds::opt::enable_elimination< true >
195             >::type
196         > stack_type;
197         test<stack_type>();
198     }
199
200     void TestIntrusiveFCStack::FCStack_slist_member_elimination_stat()
201     {
202         typedef member_hook_item< boost::intrusive::slist_member_hook<> > value_type;
203         typedef boost::intrusive::member_hook<value_type, boost::intrusive::slist_member_hook<>, &value_type::hMember> member_option;
204
205         typedef cds::intrusive::FCStack< value_type, boost::intrusive::slist< value_type, member_option >,
206             cds::intrusive::fcstack::make_traits<
207                 cds::opt::enable_elimination< true >
208                 ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
209             >::type
210         > stack_type;
211         test<stack_type>();
212     }
213
214     void TestIntrusiveFCStack::FCStack_list()
215     {
216         typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
217         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type > > stack_type;
218         test<stack_type>();
219     }
220
221     void TestIntrusiveFCStack::FCStack_list_mutex()
222     {
223         typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
224         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type >,
225             cds::intrusive::fcstack::make_traits<
226                 cds::opt::lock_type< std::mutex >
227             >::type
228         > stack_type;
229         test<stack_type>();
230     }
231
232
233     void TestIntrusiveFCStack::FCStack_list_elimination()
234     {
235         typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
236         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type >,
237             cds::intrusive::fcstack::make_traits<
238                 cds::opt::enable_elimination< true >
239             >::type
240         > stack_type;
241         test<stack_type>();
242     }
243
244     void TestIntrusiveFCStack::FCStack_list_elimination_stat()
245     {
246         typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
247         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type >,
248             cds::intrusive::fcstack::make_traits<
249                 cds::opt::enable_elimination< true >
250                 ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
251             >::type
252         > stack_type;
253         test<stack_type>();
254     }
255
256     void TestIntrusiveFCStack::FCStack_list_member()
257     {
258         typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
259         typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
260
261         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type, member_option > > stack_type;
262         test<stack_type>();
263     }
264
265     void TestIntrusiveFCStack::FCStack_list_member_elimination()
266     {
267         typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
268         typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
269
270         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type, member_option >,
271             cds::intrusive::fcstack::make_traits<
272                 cds::opt::enable_elimination< true >
273             >::type
274         > stack_type;
275         test<stack_type>();
276     }
277
278     void TestIntrusiveFCStack::FCStack_list_member_elimination_stat()
279     {
280         typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
281         typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
282
283         typedef cds::intrusive::FCStack< value_type, boost::intrusive::list< value_type, member_option >,
284             cds::intrusive::fcstack::make_traits<
285                 cds::opt::enable_elimination< true >
286                 ,cds::opt::stat< cds::intrusive::fcstack::stat<> >
287             >::type
288         > stack_type;
289         test<stack_type>();
290     }
291
292     CPPUNIT_TEST_SUITE_REGISTRATION(stack::TestIntrusiveFCStack);
293 }   // namespace stack
294