Add back-off strategy to EllenBinTree
[libcds.git] / tests / test-hdr / tree / hdr_intrusive_ellen_bintree_dhp.cpp
1 //$$CDS-header$$
2
3 #include "tree/hdr_intrusive_bintree.h"
4 #include <cds/intrusive/ellen_bintree_dhp.h>
5
6 #include "tree/hdr_intrusive_ellen_bintree_pool_dhp.h"
7 #include "unit/print_ellenbintree_stat.h"
8
9 namespace tree {
10     namespace ci = cds::intrusive;
11     namespace co = cds::opt;
12     namespace {
13         typedef ci::ellen_bintree::node<cds::gc::DHP>                       leaf_node;
14         typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node >       base_value;
15
16         struct print_stat {
17             template <typename Tree>
18             void operator()( Tree const& t)
19             {
20                 std::cout << t.statistics();
21             }
22         };
23
24         typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
25         typedef ci::ellen_bintree::update_desc< leaf_node, internal_node >   update_desc;
26     }
27
28     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_less()
29     {
30         struct tree_traits : public ci::ellen_bintree::traits
31         {
32             typedef ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP >> hook;
33             typedef IntrusiveBinTreeHdrTest::key_extractor< base_value > key_extractor;
34             typedef IntrusiveBinTreeHdrTest::less< base_value > less;
35             typedef IntrusiveBinTreeHdrTest::disposer< base_value > disposer;
36         };
37         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value, tree_traits > tree_type;
38
39         test<tree_type, print_stat>();
40     }
41
42     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_less_stat()
43     {
44         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
45             ci::ellen_bintree::make_traits<
46                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
47                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
48                 ,co::less< less< base_value > >
49                 ,ci::opt::disposer< disposer< base_value > >
50                 ,co::stat< ci::ellen_bintree::stat<> >
51             >::type
52         > tree_type;
53
54         test<tree_type, print_stat>();
55     }
56
57     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_cmp()
58     {
59         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
60             ci::ellen_bintree::make_traits<
61                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
62                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
63                 ,co::compare< compare< base_value > >
64                 ,ci::opt::disposer< disposer< base_value > >
65             >::type
66         > tree_type;
67
68         test<tree_type, print_stat>();
69     }
70
71     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_cmpless()
72     {
73         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
74             ci::ellen_bintree::make_traits<
75                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
76                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
77                 ,co::compare< compare< base_value > >
78                 ,co::less< less< base_value > >
79                 ,ci::opt::disposer< disposer< base_value > >
80             >::type
81         > tree_type;
82
83         test<tree_type, print_stat>();
84     }
85
86     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_less_ic()
87     {
88         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
89             ci::ellen_bintree::make_traits<
90                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
91                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
92                 ,co::less< less< base_value > >
93                 ,ci::opt::disposer< disposer< base_value > >
94                 ,co::item_counter< cds::atomicity::item_counter >
95             >::type
96         > tree_type;
97
98         test<tree_type, print_stat>();
99     }
100
101     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_cmp_ic()
102     {
103         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
104             ci::ellen_bintree::make_traits<
105                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
106                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
107                 ,co::compare< compare< base_value > >
108                 ,ci::opt::disposer< disposer< base_value > >
109                 ,co::item_counter< cds::atomicity::item_counter >
110             >::type
111         > tree_type;
112
113         test<tree_type, print_stat>();
114     }
115
116     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_cmp_ic_stat()
117     {
118         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
119             ci::ellen_bintree::make_traits<
120                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
121                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
122                 ,co::compare< compare< base_value > >
123                 ,ci::opt::disposer< disposer< base_value > >
124                 ,co::item_counter< cds::atomicity::item_counter >
125                 ,co::stat< ci::ellen_bintree::stat<> >
126             >::type
127         > tree_type;
128
129         test<tree_type, print_stat>();
130     }
131
132     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_cmp_ic_stat_yield()
133     {
134         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
135             ci::ellen_bintree::make_traits<
136                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
137                 , ci::ellen_bintree::key_extractor< key_extractor< base_value > >
138                 , co::compare< compare< base_value > >
139                 , ci::opt::disposer< disposer< base_value > >
140                 , co::item_counter< cds::atomicity::item_counter >
141                 , co::stat< ci::ellen_bintree::stat<> >
142                 , co::back_off< cds::backoff::yield >
143             >::type
144         > tree_type;
145
146         test<tree_type, print_stat>();
147     }
148
149     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_less_pool()
150     {
151         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
152             ci::ellen_bintree::make_traits<
153                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
154                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
155                 ,co::less< less< base_value > >
156                 ,ci::opt::disposer< disposer< base_value > >
157                 ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_dhp::internal_node_pool_accessor > >
158                 ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_dhp::update_desc_pool_accessor > >
159             >::type
160         > tree_type;
161
162         test<tree_type, print_stat>();
163     }
164
165     void IntrusiveBinTreeHdrTest::EllenBinTree_dhp_base_less_pool_ic_stat()
166     {
167         typedef ci::EllenBinTree< cds::gc::DHP, key_type, base_value,
168             ci::ellen_bintree::make_traits<
169                 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< cds::gc::DHP > > >
170                 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
171                 ,co::less< less< base_value > >
172                 ,ci::opt::disposer< disposer< base_value > >
173                 ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_dhp::internal_node_pool_accessor > >
174                 ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_dhp::update_desc_pool_accessor > >
175                 ,co::item_counter< cds::atomicity::item_counter >
176                 ,co::stat< ci::ellen_bintree::stat<> >
177             >::type
178         > tree_type;
179
180         test<tree_type, print_stat>();
181     }
182
183
184 } //namespace tree