Replace NULL with nullptr
[libcds.git] / tests / test-hdr / stack / hdr_intrusive_treiber_stack.h
1 //$$CDS-header$$
2
3 #include "cppunit/cppunit_proxy.h"
4 #include <cds/intrusive/single_link_struct.h>
5
6 namespace stack {
7
8     namespace ci = cds::intrusive;
9
10     class TestIntrusiveStack: public CppUnitMini::TestCase
11     {
12     public:
13         template <typename GC>
14         struct base_hook_item: public ci::single_link::node< GC >
15         {
16             int nVal;
17             int nDisposeCount;
18
19             base_hook_item()
20                 : nDisposeCount(0)
21             {}
22         };
23
24         template <typename GC>
25         struct member_hook_item
26         {
27             int nVal;
28             int nDisposeCount;
29             ci::single_link::node< GC > 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_elimination()
47         {
48             Stack stack( 2 );
49             test_with( stack );
50         }
51
52         template <class Stack>
53         void test()
54         {
55             Stack stack;
56             test_with(stack);
57         }
58
59
60         template <class Stack>
61         void test_with( Stack& stack )
62         {
63             typedef typename Stack::value_type  value_type;
64
65             CPPUNIT_ASSERT( stack.empty() );
66
67             value_type v1, v2, v3;
68             v1.nVal = 1;
69             v2.nVal = 2;
70             v3.nVal = 3;
71             CPPUNIT_ASSERT( stack.push(v1));
72             CPPUNIT_ASSERT( !stack.empty() );
73             CPPUNIT_ASSERT( stack.push(v2));
74             CPPUNIT_ASSERT( !stack.empty() );
75             CPPUNIT_ASSERT( stack.push(v3));
76             CPPUNIT_ASSERT( !stack.empty() );
77
78             value_type * pv;
79             pv = stack.pop();
80             CPPUNIT_ASSERT( pv != nullptr );
81             CPPUNIT_ASSERT( pv->nVal == 3 );
82             CPPUNIT_ASSERT( !stack.empty() );
83             pv = stack.pop();
84             CPPUNIT_ASSERT( pv != nullptr );
85             CPPUNIT_ASSERT( pv->nVal == 2 );
86             CPPUNIT_ASSERT( !stack.empty() );
87             pv = stack.pop();
88             CPPUNIT_ASSERT( pv != nullptr );
89             CPPUNIT_ASSERT( pv->nVal == 1 );
90             CPPUNIT_ASSERT( stack.empty() );
91             pv = stack.pop();
92             CPPUNIT_ASSERT( pv == nullptr );
93
94             CPPUNIT_ASSERT( v1.nDisposeCount == 0 );
95             CPPUNIT_ASSERT( v2.nDisposeCount == 0 );
96             CPPUNIT_ASSERT( v3.nDisposeCount == 0 );
97
98             stack.push(v1);
99             stack.push(v2);
100             stack.push(v3);
101
102             stack.clear();
103             CPPUNIT_ASSERT( stack.empty() );
104
105             Stack::gc::scan();
106             if ( !std::is_same<typename Stack::disposer, ci::opt::v::empty_disposer>::value ) {
107                 CPPUNIT_ASSERT( v1.nDisposeCount == 1 );
108                 CPPUNIT_ASSERT( v2.nDisposeCount == 1 );
109                 CPPUNIT_ASSERT( v3.nDisposeCount == 1 );
110             }
111         }
112
113         void Treiber_HP_default();
114         void Treiber_HP_base();
115         void Treiber_HP_base_disposer();
116         void Treiber_HP_member();
117         void Treiber_HP_member_disposer();
118         void Treiber_HRC_base();
119         void Treiber_HRC_base_disposer();
120         void Treiber_PTB_base();
121         void Treiber_PTB_base_disposer();
122         void Treiber_PTB_member();
123         void Treiber_PTB_member_disposer();
124
125         void Treiber_HP_default_relaxed();
126         void Treiber_HP_base_relaxed();
127         void Treiber_HP_base_disposer_relaxed();
128         void Treiber_HP_member_relaxed();
129         void Treiber_HP_member_disposer_relaxed();
130         void Treiber_HRC_base_relaxed();
131         void Treiber_HRC_base_disposer_relaxed();
132         void Treiber_PTB_base_relaxed();
133         void Treiber_PTB_base_disposer_relaxed();
134         void Treiber_PTB_member_relaxed();
135         void Treiber_PTB_member_disposer_relaxed();
136
137         void Elimination_HP_default();
138         void Elimination_HP_base();
139         void Elimination_HP_base_dyn();
140         void Elimination_HP_base_disposer();
141         void Elimination_HP_member();
142         void Elimination_HP_member_dyn();
143         void Elimination_HP_member_disposer();
144         void Elimination_HRC_base();
145         void Elimination_HRC_base_dyn();
146         void Elimination_HRC_base_disposer();
147         void Elimination_PTB_base();
148         void Elimination_PTB_base_dyn();
149         void Elimination_PTB_base_disposer();
150         void Elimination_PTB_member();
151         void Elimination_PTB_member_dyn();
152         void Elimination_PTB_member_disposer();
153
154         void Elimination_HP_default_relaxed();
155         void Elimination_HP_base_relaxed();
156         void Elimination_HP_base_disposer_relaxed();
157         void Elimination_HP_member_relaxed();
158         void Elimination_HP_member_disposer_relaxed();
159         void Elimination_HRC_base_relaxed();
160         void Elimination_HRC_base_disposer_relaxed();
161         void Elimination_PTB_base_relaxed();
162         void Elimination_PTB_base_disposer_relaxed();
163         void Elimination_PTB_member_relaxed();
164         void Elimination_PTB_member_disposer_relaxed();
165
166         CPPUNIT_TEST_SUITE(TestIntrusiveStack)
167             CPPUNIT_TEST(Treiber_HP_default)
168             CPPUNIT_TEST(Treiber_HP_default_relaxed)
169             CPPUNIT_TEST(Treiber_HP_base)
170             CPPUNIT_TEST(Treiber_HP_base_relaxed)
171             CPPUNIT_TEST(Treiber_HP_base_disposer)
172             CPPUNIT_TEST(Treiber_HP_base_disposer_relaxed)
173             CPPUNIT_TEST(Treiber_HP_member)
174             CPPUNIT_TEST(Treiber_HP_member_relaxed)
175             CPPUNIT_TEST(Treiber_HP_member_disposer)
176             CPPUNIT_TEST(Treiber_HP_member_disposer_relaxed)
177             CPPUNIT_TEST(Treiber_HRC_base)
178             CPPUNIT_TEST(Treiber_HRC_base_relaxed)
179             CPPUNIT_TEST(Treiber_HRC_base_disposer)
180             CPPUNIT_TEST(Treiber_HRC_base_disposer_relaxed)
181             CPPUNIT_TEST(Treiber_PTB_base)
182             CPPUNIT_TEST(Treiber_PTB_base_relaxed)
183             CPPUNIT_TEST(Treiber_PTB_base_disposer)
184             CPPUNIT_TEST(Treiber_PTB_base_disposer_relaxed)
185             CPPUNIT_TEST(Treiber_PTB_member)
186             CPPUNIT_TEST(Treiber_PTB_member_relaxed)
187             CPPUNIT_TEST(Treiber_PTB_member_disposer)
188             CPPUNIT_TEST(Treiber_PTB_member_disposer_relaxed)
189
190             CPPUNIT_TEST(Elimination_HP_default)
191             CPPUNIT_TEST(Elimination_HP_default_relaxed)
192             CPPUNIT_TEST(Elimination_HP_base)
193             CPPUNIT_TEST(Elimination_HP_base_dyn)
194             CPPUNIT_TEST(Elimination_HP_base_relaxed)
195             CPPUNIT_TEST(Elimination_HP_base_disposer)
196             CPPUNIT_TEST(Elimination_HP_base_disposer_relaxed)
197             CPPUNIT_TEST(Elimination_HP_member)
198             CPPUNIT_TEST(Elimination_HP_member_dyn)
199             CPPUNIT_TEST(Elimination_HP_member_relaxed)
200             CPPUNIT_TEST(Elimination_HP_member_disposer)
201             CPPUNIT_TEST(Elimination_HP_member_disposer_relaxed)
202             CPPUNIT_TEST(Elimination_HRC_base)
203             CPPUNIT_TEST(Elimination_HRC_base_dyn)
204             CPPUNIT_TEST(Elimination_HRC_base_relaxed)
205             CPPUNIT_TEST(Elimination_HRC_base_disposer)
206             CPPUNIT_TEST(Elimination_HRC_base_disposer_relaxed)
207             CPPUNIT_TEST(Elimination_PTB_base)
208             CPPUNIT_TEST(Elimination_PTB_base_dyn)
209             CPPUNIT_TEST(Elimination_PTB_base_relaxed)
210             CPPUNIT_TEST(Elimination_PTB_base_disposer)
211             CPPUNIT_TEST(Elimination_PTB_base_disposer_relaxed)
212             CPPUNIT_TEST(Elimination_PTB_member)
213             CPPUNIT_TEST(Elimination_PTB_member_dyn)
214             CPPUNIT_TEST(Elimination_PTB_member_relaxed)
215             CPPUNIT_TEST(Elimination_PTB_member_disposer)
216             CPPUNIT_TEST(Elimination_PTB_member_disposer_relaxed)
217         CPPUNIT_TEST_SUITE_END()
218     };
219
220 } // namespace stack