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