Issue #48: added std::move for pop() function of stack/queue/pqueue
[libcds.git] / tests / test-hdr / stack / hdr_intrusive_treiber_stack.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8     
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
29 */
30
31 #ifndef CDSTEST_HDR_INTRUSIVE_TREIBER_STACK_H
32 #define CDSTEST_HDR_INTRUSIVE_TREIBER_STACK_H
33
34 #include "cppunit/cppunit_proxy.h"
35 #include <cds/intrusive/details/single_link_struct.h>
36
37 namespace stack {
38
39     namespace ci = cds::intrusive;
40
41     class TestIntrusiveStack: public CppUnitMini::TestCase
42     {
43     public:
44         template <typename GC>
45         struct base_hook_item: public ci::single_link::node< GC >
46         {
47             int nVal;
48             int nDisposeCount;
49
50             base_hook_item()
51                 : nDisposeCount(0)
52             {}
53         };
54
55         template <typename GC>
56         struct member_hook_item
57         {
58             int nVal;
59             int nDisposeCount;
60             ci::single_link::node< GC > hMember;
61
62             member_hook_item()
63                 : nDisposeCount(0)
64             {}
65         };
66
67         struct faked_disposer
68         {
69             template <typename T>
70             void operator ()( T * p )
71             {
72                 ++p->nDisposeCount;
73             }
74         };
75
76         template <class Stack>
77         void test_elimination()
78         {
79             Stack stack( 2 );
80             test_with( stack );
81         }
82
83         template <class Stack>
84         void test()
85         {
86             Stack stack;
87             test_with(stack);
88         }
89
90
91         template <class Stack>
92         void test_with( Stack& stack )
93         {
94             typedef typename Stack::value_type  value_type;
95
96             CPPUNIT_ASSERT( stack.empty() );
97
98             value_type v1, v2, v3;
99             v1.nVal = 1;
100             v2.nVal = 2;
101             v3.nVal = 3;
102             CPPUNIT_ASSERT( stack.push(v1));
103             CPPUNIT_ASSERT( !stack.empty() );
104             CPPUNIT_ASSERT( stack.push(v2));
105             CPPUNIT_ASSERT( !stack.empty() );
106             CPPUNIT_ASSERT( stack.push(v3));
107             CPPUNIT_ASSERT( !stack.empty() );
108
109             value_type * pv;
110             pv = stack.pop();
111             CPPUNIT_ASSERT( pv != nullptr );
112             CPPUNIT_ASSERT( pv->nVal == 3 );
113             CPPUNIT_ASSERT( !stack.empty() );
114             pv = stack.pop();
115             CPPUNIT_ASSERT( pv != nullptr );
116             CPPUNIT_ASSERT( pv->nVal == 2 );
117             CPPUNIT_ASSERT( !stack.empty() );
118             pv = stack.pop();
119             CPPUNIT_ASSERT( pv != nullptr );
120             CPPUNIT_ASSERT( pv->nVal == 1 );
121             CPPUNIT_ASSERT( stack.empty() );
122             pv = stack.pop();
123             CPPUNIT_ASSERT( pv == nullptr );
124
125             CPPUNIT_ASSERT( v1.nDisposeCount == 0 );
126             CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
127             CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
128
129             stack.push(v1);
130             stack.push(v2);
131             stack.push(v3);
132
133             stack.clear();
134             CPPUNIT_ASSERT( stack.empty() );
135
136             Stack::gc::scan();
137             if ( !std::is_same<typename Stack::disposer, ci::opt::v::empty_disposer>::value ) {
138                 CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
139                 CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
140                 CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
141             }
142         }
143
144         void Treiber_HP_default();
145         void Treiber_HP_base();
146         void Treiber_HP_base_disposer();
147         void Treiber_HP_member();
148         void Treiber_HP_member_disposer();
149         void Treiber_DHP_base();
150         void Treiber_DHP_base_disposer();
151         void Treiber_DHP_member();
152         void Treiber_DHP_member_disposer();
153
154         void Treiber_HP_default_relaxed();
155         void Treiber_HP_base_relaxed();
156         void Treiber_HP_base_disposer_relaxed();
157         void Treiber_HP_member_relaxed();
158         void Treiber_HP_member_disposer_relaxed();
159         void Treiber_DHP_base_relaxed();
160         void Treiber_DHP_base_disposer_relaxed();
161         void Treiber_DHP_member_relaxed();
162         void Treiber_DHP_member_disposer_relaxed();
163
164         void Elimination_HP_default();
165         void Elimination_HP_base();
166         void Elimination_HP_base_dyn();
167         void Elimination_HP_base_disposer();
168         void Elimination_HP_member();
169         void Elimination_HP_member_dyn();
170         void Elimination_HP_member_disposer();
171         void Elimination_DHP_base();
172         void Elimination_DHP_base_dyn();
173         void Elimination_DHP_base_disposer();
174         void Elimination_DHP_member();
175         void Elimination_DHP_member_dyn();
176         void Elimination_DHP_member_disposer();
177
178         void Elimination_HP_default_relaxed();
179         void Elimination_HP_base_relaxed();
180         void Elimination_HP_base_disposer_relaxed();
181         void Elimination_HP_member_relaxed();
182         void Elimination_HP_member_disposer_relaxed();
183         void Elimination_DHP_base_relaxed();
184         void Elimination_DHP_base_disposer_relaxed();
185         void Elimination_DHP_member_relaxed();
186         void Elimination_DHP_member_disposer_relaxed();
187
188         CPPUNIT_TEST_SUITE(TestIntrusiveStack)
189             CPPUNIT_TEST(Treiber_HP_default)
190             CPPUNIT_TEST(Treiber_HP_default_relaxed)
191             CPPUNIT_TEST(Treiber_HP_base)
192             CPPUNIT_TEST(Treiber_HP_base_relaxed)
193             CPPUNIT_TEST(Treiber_HP_base_disposer)
194             CPPUNIT_TEST(Treiber_HP_base_disposer_relaxed)
195             CPPUNIT_TEST(Treiber_HP_member)
196             CPPUNIT_TEST(Treiber_HP_member_relaxed)
197             CPPUNIT_TEST(Treiber_HP_member_disposer)
198             CPPUNIT_TEST(Treiber_HP_member_disposer_relaxed)
199             CPPUNIT_TEST(Treiber_DHP_base)
200             CPPUNIT_TEST(Treiber_DHP_base_relaxed)
201             CPPUNIT_TEST(Treiber_DHP_base_disposer)
202             CPPUNIT_TEST(Treiber_DHP_base_disposer_relaxed)
203             CPPUNIT_TEST(Treiber_DHP_member)
204             CPPUNIT_TEST(Treiber_DHP_member_relaxed)
205             CPPUNIT_TEST(Treiber_DHP_member_disposer)
206             CPPUNIT_TEST(Treiber_DHP_member_disposer_relaxed)
207
208             CPPUNIT_TEST(Elimination_HP_default)
209             CPPUNIT_TEST(Elimination_HP_default_relaxed)
210             CPPUNIT_TEST(Elimination_HP_base)
211             CPPUNIT_TEST(Elimination_HP_base_dyn)
212             CPPUNIT_TEST(Elimination_HP_base_relaxed)
213             CPPUNIT_TEST(Elimination_HP_base_disposer)
214             CPPUNIT_TEST(Elimination_HP_base_disposer_relaxed)
215             CPPUNIT_TEST(Elimination_HP_member)
216             CPPUNIT_TEST(Elimination_HP_member_dyn)
217             CPPUNIT_TEST(Elimination_HP_member_relaxed)
218             CPPUNIT_TEST(Elimination_HP_member_disposer)
219             CPPUNIT_TEST(Elimination_HP_member_disposer_relaxed)
220             CPPUNIT_TEST(Elimination_DHP_base)
221             CPPUNIT_TEST(Elimination_DHP_base_dyn)
222             CPPUNIT_TEST(Elimination_DHP_base_relaxed)
223             CPPUNIT_TEST(Elimination_DHP_base_disposer)
224             CPPUNIT_TEST(Elimination_DHP_base_disposer_relaxed)
225             CPPUNIT_TEST(Elimination_DHP_member)
226             CPPUNIT_TEST(Elimination_DHP_member_dyn)
227             CPPUNIT_TEST(Elimination_DHP_member_relaxed)
228             CPPUNIT_TEST(Elimination_DHP_member_disposer)
229             CPPUNIT_TEST(Elimination_DHP_member_disposer_relaxed)
230         CPPUNIT_TEST_SUITE_END()
231     };
232
233 } // namespace stack
234
235 #endif // #ifndef CDSTEST_HDR_INTRUSIVE_TREIBER_STACK_H