Removed trailing spaces
[libcds.git] / test / unit / tree / intrusive_ellenbintree_dhp.cpp
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 #include "test_intrusive_tree_hp.h"
32
33 #include <cds/intrusive/ellen_bintree_dhp.h>
34 #include "test_ellen_bintree_update_desc_pool.h"
35
36 namespace {
37     namespace ci = cds::intrusive;
38     typedef cds::gc::DHP gc_type;
39
40     class IntrusiveEllenBinTree_DHP : public cds_test::intrusive_tree_hp
41     {
42     protected:
43         typedef cds_test::intrusive_tree_hp base_class;
44
45     protected:
46         typedef base_class::key_type key_type;
47
48         typedef typename base_class::base_int_item< ci::ellen_bintree::node<gc_type>> base_item_type;
49         typedef typename base_class::member_int_item< ci::ellen_bintree::node<gc_type>>  member_item_type;
50
51         void SetUp()
52         {
53             typedef ci::EllenBinTree< gc_type, key_type, base_item_type > tree_type;
54
55             cds::gc::dhp::GarbageCollector::Construct( 16, tree_type::c_nHazardPtrCount );
56             cds::threading::Manager::attachThread();
57         }
58
59         void TearDown()
60         {
61             cds::threading::Manager::detachThread();
62             cds::gc::dhp::GarbageCollector::Destruct();
63         }
64
65         struct generic_traits: public ci::ellen_bintree::traits
66         {
67             typedef base_class::key_extractor key_extractor;
68             typedef mock_disposer disposer;
69         };
70     };
71
72     TEST_F( IntrusiveEllenBinTree_DHP, base_cmp )
73     {
74         typedef ci::EllenBinTree< gc_type, key_type, base_item_type,
75             ci::ellen_bintree::make_traits<
76                 ci::opt::type_traits< generic_traits >
77                 ,ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >>>
78                 ,ci::opt::compare< cmp<base_item_type>>
79             >::type
80         > tree_type;
81
82         tree_type t;
83         test( t );
84     }
85
86     TEST_F( IntrusiveEllenBinTree_DHP, base_less )
87     {
88         typedef ci::EllenBinTree< gc_type, key_type, base_item_type,
89             ci::ellen_bintree::make_traits<
90                 ci::opt::type_traits< generic_traits >
91                 ,ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >>>
92                 ,ci::opt::less< less<base_item_type>>
93             >::type
94         > tree_type;
95
96         tree_type t;
97         test( t );
98     }
99
100     TEST_F( IntrusiveEllenBinTree_DHP, base_item_counter )
101     {
102         typedef ci::EllenBinTree< gc_type, key_type, base_item_type,
103             ci::ellen_bintree::make_traits<
104                 ci::opt::type_traits< generic_traits >
105                 ,ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >>>
106                 ,ci::opt::compare< cmp<base_item_type>>
107                 ,ci::opt::item_counter< simple_item_counter >
108             >::type
109         > tree_type;
110
111         tree_type t;
112         test( t );
113     }
114
115     TEST_F( IntrusiveEllenBinTree_DHP, base_backoff )
116     {
117         struct tree_traits: public generic_traits
118         {
119             typedef ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >> hook;
120             typedef cmp<base_item_type> compare;
121             typedef base_class::less<base_item_type> less;
122             typedef cds::atomicity::item_counter item_counter;
123             typedef cds::backoff::yield back_off;
124         };
125
126         typedef ci::EllenBinTree< gc_type, key_type, base_item_type, tree_traits > tree_type;
127
128         tree_type t;
129         test( t );
130     }
131
132     TEST_F( IntrusiveEllenBinTree_DHP, base_seq_cst )
133     {
134         struct tree_traits: public generic_traits
135         {
136             typedef ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >> hook;
137             typedef cmp<base_item_type> compare;
138             typedef base_class::less<base_item_type> less;
139             typedef cds::atomicity::item_counter item_counter;
140             typedef cds::backoff::pause back_off;
141             typedef ci::opt::v::sequential_consistent memory_model;
142         };
143
144         typedef ci::EllenBinTree< gc_type, key_type, base_item_type, tree_traits > tree_type;
145
146         tree_type t;
147         test( t );
148     }
149
150     TEST_F( IntrusiveEllenBinTree_DHP, base_update_desc_pool )
151     {
152         struct tree_traits: public generic_traits
153         {
154             typedef ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >> hook;
155             typedef base_class::less<base_item_type> less;
156             typedef cds::atomicity::item_counter item_counter;
157             typedef cds::memory::pool_allocator<cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator;
158         };
159
160         typedef ci::EllenBinTree< gc_type, key_type, base_item_type, tree_traits > tree_type;
161
162         tree_type t;
163         test( t );
164     }
165
166     TEST_F( IntrusiveEllenBinTree_DHP, base_update_desc_lazy_pool )
167     {
168         struct tree_traits: public generic_traits
169         {
170             typedef ci::ellen_bintree::base_hook< ci::opt::gc< gc_type >> hook;
171             typedef base_class::less<base_item_type> less;
172             typedef cds::atomicity::item_counter item_counter;
173             typedef cds::memory::pool_allocator<cds_test::update_desc, cds_test::lazy_pool_accessor> update_desc_allocator;
174         };
175
176         typedef ci::EllenBinTree< gc_type, key_type, base_item_type, tree_traits > tree_type;
177
178         tree_type t;
179         test( t );
180     }
181
182     // member hook
183     TEST_F( IntrusiveEllenBinTree_DHP, member_cmp )
184     {
185         typedef ci::EllenBinTree< gc_type, key_type, member_item_type,
186             ci::ellen_bintree::make_traits<
187                 ci::opt::type_traits< generic_traits >
188                 ,ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember), ci::opt::gc< gc_type >>>
189                 ,ci::opt::compare< cmp<member_item_type>>
190             >::type
191         > tree_type;
192
193         tree_type t;
194         test( t );
195     }
196
197     TEST_F( IntrusiveEllenBinTree_DHP, member_less )
198     {
199         typedef ci::EllenBinTree< gc_type, key_type, member_item_type,
200             ci::ellen_bintree::make_traits<
201                 ci::opt::type_traits< generic_traits >
202                 ,ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >>>
203                 ,ci::opt::less< less<member_item_type>>
204             >::type
205         > tree_type;
206
207         tree_type t;
208         test( t );
209     }
210
211     TEST_F( IntrusiveEllenBinTree_DHP, member_item_counter )
212     {
213         typedef ci::EllenBinTree< gc_type, key_type, member_item_type,
214             ci::ellen_bintree::make_traits<
215                 ci::opt::type_traits< generic_traits >
216                 ,ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >>>
217                 ,ci::opt::compare< cmp<member_item_type>>
218                 ,ci::opt::item_counter< simple_item_counter >
219             >::type
220         > tree_type;
221
222         tree_type t;
223         test( t );
224     }
225
226     TEST_F( IntrusiveEllenBinTree_DHP, member_backoff )
227     {
228         struct tree_traits: public generic_traits
229         {
230             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
231             typedef cmp<member_item_type> compare;
232             typedef base_class::less<member_item_type> less;
233             typedef cds::atomicity::item_counter item_counter;
234             typedef cds::backoff::yield back_off;
235         };
236
237         typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type;
238
239         tree_type t;
240         test( t );
241     }
242
243     TEST_F( IntrusiveEllenBinTree_DHP, member_seq_cst )
244     {
245         struct tree_traits: public generic_traits
246         {
247             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
248             typedef cmp<member_item_type> compare;
249             typedef base_class::less<member_item_type> less;
250             typedef cds::atomicity::item_counter item_counter;
251             typedef cds::backoff::pause back_off;
252             typedef ci::opt::v::sequential_consistent memory_model;
253         };
254
255         typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type;
256
257         tree_type t;
258         test( t );
259     }
260
261     TEST_F( IntrusiveEllenBinTree_DHP, member_update_desc_pool )
262     {
263         struct tree_traits: public generic_traits
264         {
265             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
266             typedef base_class::less<member_item_type> less;
267             typedef cds::atomicity::item_counter item_counter;
268             typedef cds::memory::pool_allocator<cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator;
269         };
270
271         typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type;
272
273         tree_type t;
274         test( t );
275     }
276
277     TEST_F( IntrusiveEllenBinTree_DHP, member_update_desc_lazy_pool )
278     {
279         struct tree_traits: public generic_traits
280         {
281             typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< gc_type >> hook;
282             typedef base_class::less<member_item_type> less;
283             typedef cds::atomicity::item_counter item_counter;
284             typedef cds::memory::pool_allocator<cds_test::update_desc, cds_test::lazy_pool_accessor> update_desc_allocator;
285         };
286
287         typedef ci::EllenBinTree< gc_type, key_type, member_item_type, tree_traits > tree_type;
288
289         tree_type t;
290         test( t );
291     }
292
293 } // namespace