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