Removed trailing spaces
[libcds.git] / test / unit / tree / test_intrusive_ellen_bintree_rcu.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 CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H
32 #define CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H
33
34 #include "test_intrusive_tree_rcu.h"
35
36 #include <cds/intrusive/ellen_bintree_rcu.h>
37 #include "test_ellen_bintree_update_desc_pool.h"
38
39 // forward declaration
40 namespace cds { namespace intrusive {}}
41
42 namespace {
43
44     namespace ci = cds::intrusive;
45
46     template <class RCU>
47     class IntrusiveEllenBinTree: public cds_test::intrusive_tree_rcu
48     {
49         typedef cds_test::intrusive_tree_rcu base_class;
50
51     public:
52         typedef cds::urcu::gc<RCU> rcu_type;
53
54         typedef base_class::key_type key_type;
55
56         typedef typename base_class::base_int_item< ci::ellen_bintree::node<rcu_type>> base_item_type;
57         typedef typename base_class::member_int_item< ci::ellen_bintree::node<rcu_type>> member_item_type;
58
59         struct generic_traits: public ci::ellen_bintree::traits
60         {
61             typedef base_class::key_extractor key_extractor;
62             typedef mock_disposer disposer;
63         };
64
65     protected:
66         void SetUp()
67         {
68             RCU::Construct();
69             cds::threading::Manager::attachThread();
70         }
71
72         void TearDown()
73         {
74             cds::threading::Manager::detachThread();
75             RCU::Destruct();
76         }
77     };
78
79     TYPED_TEST_CASE_P( IntrusiveEllenBinTree );
80
81
82     TYPED_TEST_P( IntrusiveEllenBinTree, base_cmp )
83     {
84         typedef typename TestFixture::rcu_type   rcu_type;
85         typedef typename TestFixture::key_type   key_type;
86         typedef typename TestFixture::base_item_type base_item_type;
87         typedef typename TestFixture::generic_traits generic_traits;
88
89         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
90             typename ci::ellen_bintree::make_traits<
91                 ci::opt::type_traits< generic_traits >
92                 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
93                 , ci::opt::compare< typename TestFixture::template cmp<base_item_type>>
94             >::type
95         > tree_type;
96
97         tree_type t;
98         this->test( t );
99     }
100
101     TYPED_TEST_P( IntrusiveEllenBinTree, base_less )
102     {
103         typedef typename TestFixture::rcu_type   rcu_type;
104         typedef typename TestFixture::key_type   key_type;
105         typedef typename TestFixture::base_item_type base_item_type;
106         typedef typename TestFixture::generic_traits generic_traits;
107
108         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
109             typename ci::ellen_bintree::make_traits<
110                 ci::opt::type_traits< generic_traits >
111                 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
112                 , ci::opt::less< typename TestFixture::template less<base_item_type>>
113             >::type
114         > tree_type;
115
116         tree_type t;
117         this->test( t );
118     }
119
120     TYPED_TEST_P( IntrusiveEllenBinTree, base_item_counter )
121     {
122         typedef typename TestFixture::rcu_type   rcu_type;
123         typedef typename TestFixture::key_type   key_type;
124         typedef typename TestFixture::base_item_type base_item_type;
125         typedef typename TestFixture::generic_traits generic_traits;
126
127         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
128             typename ci::ellen_bintree::make_traits<
129                 ci::opt::type_traits< generic_traits >
130                 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
131                 , ci::opt::compare< typename TestFixture::template cmp<base_item_type>>
132                 , ci::opt::item_counter< typename TestFixture::simple_item_counter >
133             >::type
134         > tree_type;
135
136         tree_type t;
137         this->test( t );
138     }
139
140     TYPED_TEST_P( IntrusiveEllenBinTree, base_backoff )
141     {
142         typedef typename TestFixture::rcu_type   rcu_type;
143         typedef typename TestFixture::key_type   key_type;
144         typedef typename TestFixture::base_item_type base_item_type;
145         typedef typename TestFixture::generic_traits generic_traits;
146
147         struct tree_traits: public generic_traits
148         {
149             typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
150             typedef typename TestFixture::template cmp<base_item_type> compare;
151             typedef typename TestFixture::template less<base_item_type> less;
152             typedef cds::atomicity::item_counter item_counter;
153             typedef cds::backoff::yield back_off;
154         };
155
156         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
157
158         tree_type t;
159         this->test( t );
160     }
161
162     TYPED_TEST_P( IntrusiveEllenBinTree, base_seq_cst )
163     {
164         typedef typename TestFixture::rcu_type   rcu_type;
165         typedef typename TestFixture::key_type   key_type;
166         typedef typename TestFixture::base_item_type base_item_type;
167         typedef typename TestFixture::generic_traits generic_traits;
168
169         struct tree_traits: public generic_traits
170         {
171             typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
172             typedef typename TestFixture::template cmp<base_item_type> compare;
173             typedef typename TestFixture::template less<base_item_type> less;
174             typedef cds::atomicity::item_counter item_counter;
175             typedef cds::backoff::pause back_off;
176             typedef ci::opt::v::sequential_consistent memory_model;
177         };
178
179         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
180
181         tree_type t;
182         this->test( t );
183     }
184
185     TYPED_TEST_P( IntrusiveEllenBinTree, base_update_desc_pool )
186     {
187         typedef typename TestFixture::rcu_type   rcu_type;
188         typedef typename TestFixture::key_type   key_type;
189         typedef typename TestFixture::base_item_type base_item_type;
190         typedef typename TestFixture::generic_traits generic_traits;
191
192         struct tree_traits: public generic_traits
193         {
194             typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
195             typedef typename TestFixture::template less<base_item_type> less;
196             typedef cds::atomicity::item_counter item_counter;
197             typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator;
198         };
199
200         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
201
202         tree_type t;
203         this->test( t );
204     }
205
206     TYPED_TEST_P( IntrusiveEllenBinTree, base_update_desc_lazy_pool )
207     {
208         typedef typename TestFixture::rcu_type   rcu_type;
209         typedef typename TestFixture::key_type   key_type;
210         typedef typename TestFixture::base_item_type base_item_type;
211         typedef typename TestFixture::generic_traits generic_traits;
212
213         struct tree_traits: public generic_traits
214         {
215             typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
216             typedef typename TestFixture::template less<base_item_type> less;
217             typedef cds::atomicity::item_counter item_counter;
218             typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::lazy_pool_accessor> update_desc_allocator;
219         };
220
221         typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
222
223         tree_type t;
224         this->test( t );
225     }
226
227     // member hook
228     TYPED_TEST_P( IntrusiveEllenBinTree, member_cmp )
229     {
230         typedef typename TestFixture::rcu_type   rcu_type;
231         typedef typename TestFixture::key_type   key_type;
232         typedef typename TestFixture::member_item_type member_item_type;
233         typedef typename TestFixture::generic_traits   generic_traits;
234
235         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
236             typename ci::ellen_bintree::make_traits<
237                 ci::opt::type_traits< generic_traits >
238                 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
239                 , ci::opt::compare< typename TestFixture::template cmp<member_item_type>>
240             >::type
241         > tree_type;
242
243         tree_type t;
244         this->test( t );
245     }
246
247     TYPED_TEST_P( IntrusiveEllenBinTree, member_less )
248     {
249         typedef typename TestFixture::rcu_type   rcu_type;
250         typedef typename TestFixture::key_type   key_type;
251         typedef typename TestFixture::member_item_type member_item_type;
252         typedef typename TestFixture::generic_traits   generic_traits;
253
254         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
255             typename ci::ellen_bintree::make_traits<
256                 ci::opt::type_traits< generic_traits >
257                 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
258                 , ci::opt::less< typename TestFixture::template less<member_item_type>>
259             >::type
260         > tree_type;
261
262         tree_type t;
263         this->test( t );
264     }
265
266     TYPED_TEST_P( IntrusiveEllenBinTree, member_item_counter )
267     {
268         typedef typename TestFixture::rcu_type   rcu_type;
269         typedef typename TestFixture::key_type   key_type;
270         typedef typename TestFixture::member_item_type member_item_type;
271         typedef typename TestFixture::generic_traits   generic_traits;
272
273         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
274             typename ci::ellen_bintree::make_traits<
275                 ci::opt::type_traits< generic_traits >
276                 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
277                 , ci::opt::compare< typename TestFixture::template cmp<member_item_type>>
278                 , ci::opt::item_counter< typename TestFixture::simple_item_counter >
279             >::type
280         > tree_type;
281
282         tree_type t;
283         this->test( t );
284     }
285
286     TYPED_TEST_P( IntrusiveEllenBinTree, member_backoff )
287     {
288         typedef typename TestFixture::rcu_type   rcu_type;
289         typedef typename TestFixture::key_type   key_type;
290         typedef typename TestFixture::member_item_type member_item_type;
291         typedef typename TestFixture::generic_traits   generic_traits;
292
293         struct tree_traits: public generic_traits
294         {
295             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
296             typedef typename TestFixture::template cmp<member_item_type> compare;
297             typedef typename TestFixture::template less<member_item_type> less;
298             typedef cds::atomicity::item_counter item_counter;
299             typedef cds::backoff::yield back_off;
300         };
301
302         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
303
304         tree_type t;
305         this->test( t );
306     }
307
308     TYPED_TEST_P( IntrusiveEllenBinTree, member_seq_cst )
309     {
310         typedef typename TestFixture::rcu_type   rcu_type;
311         typedef typename TestFixture::key_type   key_type;
312         typedef typename TestFixture::member_item_type member_item_type;
313         typedef typename TestFixture::generic_traits   generic_traits;
314
315         struct tree_traits: public generic_traits
316         {
317             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
318             typedef typename TestFixture::template cmp<member_item_type> compare;
319             typedef typename TestFixture::template less<member_item_type> less;
320             typedef cds::atomicity::item_counter item_counter;
321             typedef cds::backoff::pause back_off;
322             typedef ci::opt::v::sequential_consistent memory_model;
323         };
324
325         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
326
327         tree_type t;
328         this->test( t );
329     }
330
331     TYPED_TEST_P( IntrusiveEllenBinTree, member_update_desc_pool )
332     {
333         typedef typename TestFixture::rcu_type   rcu_type;
334         typedef typename TestFixture::key_type   key_type;
335         typedef typename TestFixture::member_item_type member_item_type;
336         typedef typename TestFixture::generic_traits   generic_traits;
337
338         struct tree_traits: public generic_traits
339         {
340             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
341             typedef typename TestFixture::template less<member_item_type> less;
342             typedef cds::atomicity::item_counter item_counter;
343             typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator;
344         };
345
346         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
347
348         tree_type t;
349         this->test( t );
350     }
351
352     TYPED_TEST_P( IntrusiveEllenBinTree, member_update_desc_lazy_pool )
353     {
354         typedef typename TestFixture::rcu_type   rcu_type;
355         typedef typename TestFixture::key_type   key_type;
356         typedef typename TestFixture::member_item_type member_item_type;
357         typedef typename TestFixture::generic_traits   generic_traits;
358
359         struct tree_traits: public generic_traits
360         {
361             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
362             typedef typename TestFixture::template less<member_item_type> less;
363             typedef cds::atomicity::item_counter item_counter;
364             typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::lazy_pool_accessor> update_desc_allocator;
365         };
366
367         typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
368
369         tree_type t;
370         this->test( t );
371     }
372
373     REGISTER_TYPED_TEST_CASE_P( IntrusiveEllenBinTree,
374         base_cmp, base_less, base_item_counter, base_backoff, base_seq_cst, base_update_desc_pool, base_update_desc_lazy_pool, member_cmp, member_less, member_item_counter, member_backoff, member_seq_cst, member_update_desc_pool, member_update_desc_lazy_pool
375         );
376
377 } // namespace
378
379 #endif // #ifndef CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H