Added copyright and license
[libcds.git] / tests / test-hdr / tree / hdr_ellenbintree_set_rcu_gpi.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 "tree/hdr_ellenbintree_set.h"
32 #include <cds/urcu/general_instant.h>
33 #include <cds/container/ellen_bintree_set_rcu.h>
34
35 #include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
36 #include "unit/print_ellenbintree_stat.h"
37
38 namespace tree {
39     namespace cc = cds::container;
40     namespace co = cds::opt;
41     namespace {
42         typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
43
44         typedef cc::ellen_bintree::node<rcu_type, EllenBinTreeSetHdrTest::value_type>                   tree_leaf_node;
45         typedef cc::ellen_bintree::internal_node< EllenBinTreeSetHdrTest::key_type, tree_leaf_node >    tree_internal_node;
46         typedef cc::ellen_bintree::update_desc<tree_leaf_node, tree_internal_node>                      tree_update_desc;
47
48         struct print_stat {
49             template <typename Tree>
50             void operator()( Tree const& t)
51             {
52                 std::cout << t.statistics();
53             }
54         };
55
56     }
57
58     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less()
59     {
60         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
61             cc::ellen_bintree::make_set_traits<
62                 cc::ellen_bintree::key_extractor< key_extractor >
63                 ,co::less< less >
64             >::type
65         > set_type;
66
67         test_rcu<set_type, print_stat>();
68     }
69
70     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp()
71     {
72         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
73             cc::ellen_bintree::make_set_traits<
74                 cc::ellen_bintree::key_extractor< key_extractor >
75                 ,co::compare< compare >
76             >::type
77         > set_type;
78
79         test_rcu<set_type, print_stat>();
80     }
81
82     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmpless()
83     {
84         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
85             cc::ellen_bintree::make_set_traits<
86                 cc::ellen_bintree::key_extractor< key_extractor >
87                 ,co::compare< compare >
88                 ,co::less< less >
89             >::type
90         > set_type;
91
92         test_rcu<set_type, print_stat>();
93     }
94
95     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_ic()
96     {
97         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
98             cc::ellen_bintree::make_set_traits<
99                 cc::ellen_bintree::key_extractor< key_extractor >
100                 ,co::less< less >
101                 ,co::item_counter< cds::atomicity::item_counter >
102             >::type
103         > set_type;
104
105         test_rcu<set_type, print_stat>();
106     }
107
108     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp_ic()
109     {
110         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
111             cc::ellen_bintree::make_set_traits<
112                 cc::ellen_bintree::key_extractor< key_extractor >
113                 ,co::item_counter< cds::atomicity::item_counter >
114                 ,co::compare< compare >
115             >::type
116         > set_type;
117
118         test_rcu<set_type, print_stat>();
119     }
120
121     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_stat()
122     {
123         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
124             cc::ellen_bintree::make_set_traits<
125                 cc::ellen_bintree::key_extractor< key_extractor >
126                 ,co::less< less >
127                 ,co::stat< cc::ellen_bintree::stat<> >
128             >::type
129         > set_type;
130
131         test_rcu<set_type, print_stat>();
132     }
133
134     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp_ic_stat()
135     {
136         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
137             cc::ellen_bintree::make_set_traits<
138                 cc::ellen_bintree::key_extractor< key_extractor >
139                 ,co::item_counter< cds::atomicity::item_counter >
140                 ,co::stat< cc::ellen_bintree::stat<> >
141                 ,co::compare< compare >
142             >::type
143         > set_type;
144
145         test_rcu<set_type, print_stat>();
146     }
147
148     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_cmp_ic_stat_yield()
149     {
150         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
151             cc::ellen_bintree::make_set_traits<
152                 cc::ellen_bintree::key_extractor< key_extractor >
153                 ,co::item_counter< cds::atomicity::item_counter >
154                 ,co::stat< cc::ellen_bintree::stat<> >
155                 ,co::compare< compare >
156                 , co::back_off< cds::backoff::yield >
157             >::type
158         > set_type;
159
160         test_rcu<set_type, print_stat>();
161     }
162
163     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_pool()
164     {
165         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
166             cc::ellen_bintree::make_set_traits<
167                 cc::ellen_bintree::key_extractor< key_extractor >
168                 ,co::less< less >
169                 ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
170                 ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
171             >::type
172         > set_type;
173
174         test_rcu<set_type, print_stat>();
175     }
176
177     void EllenBinTreeSetHdrTest::EllenBinTree_rcu_gpi_less_pool_ic_stat()
178     {
179         typedef cc::EllenBinTreeSet< rcu_type, key_type, value_type,
180             cc::ellen_bintree::make_set_traits<
181                 cc::ellen_bintree::key_extractor< key_extractor >
182                 ,co::less< less >
183                 ,co::node_allocator< cds::memory::pool_allocator< tree_internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
184                 ,cc::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< tree_update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
185                 ,co::item_counter< cds::atomicity::item_counter >
186                 ,co::stat< cc::ellen_bintree::stat<> >
187             >::type
188         > set_type;
189
190         test_rcu<set_type, print_stat>();
191     }
192
193 } // namespace tree