3 #include "tree/hdr_intrusive_bintree.h"
4 #include <cds/urcu/general_buffered.h>
5 #include <cds/intrusive/ellen_bintree_rcu.h>
7 #include "tree/hdr_intrusive_ellen_bintree_pool_rcu.h"
8 #include "unit/print_ellenbintree_stat.h"
11 namespace ci = cds::intrusive;
12 namespace co = cds::opt;
14 typedef cds::urcu::gc< cds::urcu::general_buffered<> > rcu_type;
16 typedef ci::ellen_bintree::node<rcu_type> leaf_node;
17 typedef IntrusiveBinTreeHdrTest::base_hook_value< leaf_node > base_value;
20 template <typename Tree>
21 void operator()( Tree const& t)
23 std::cout << t.statistics();
27 typedef ci::ellen_bintree::internal_node< IntrusiveBinTreeHdrTest::key_type, leaf_node > internal_node;
28 typedef ci::ellen_bintree::update_desc< leaf_node, internal_node > update_desc;
31 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less()
33 struct tree_traits : public ci::ellen_bintree::traits
35 typedef ci::ellen_bintree::base_hook< co::gc< rcu_type >> hook;
36 typedef IntrusiveBinTreeHdrTest::key_extractor< base_value > key_extractor;
37 typedef IntrusiveBinTreeHdrTest::less< base_value > less;
38 typedef IntrusiveBinTreeHdrTest::disposer< base_value > disposer;
40 typedef ci::EllenBinTree< rcu_type, key_type, base_value, tree_traits > tree_type;
42 test_rcu<tree_type, print_stat>();
45 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_stat()
47 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
48 ci::ellen_bintree::make_traits<
49 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
50 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
51 ,co::less< less< base_value > >
52 ,ci::opt::disposer< disposer< base_value > >
53 ,co::stat< ci::ellen_bintree::stat<> >
57 test_rcu<tree_type, print_stat>();
60 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmp()
62 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
63 ci::ellen_bintree::make_traits<
64 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
65 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
66 ,co::compare< compare< base_value > >
67 ,ci::opt::disposer< disposer< base_value > >
71 test_rcu<tree_type, print_stat>();
74 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmpless()
76 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
77 ci::ellen_bintree::make_traits<
78 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
79 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
80 ,co::compare< compare< base_value > >
81 ,co::less< less< base_value > >
82 ,ci::opt::disposer< disposer< base_value > >
86 test_rcu<tree_type, print_stat>();
89 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_ic()
91 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
92 ci::ellen_bintree::make_traits<
93 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
94 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
95 ,co::less< less< base_value > >
96 ,ci::opt::disposer< disposer< base_value > >
97 ,co::item_counter< cds::atomicity::item_counter >
101 test_rcu<tree_type, print_stat>();
104 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmp_ic()
106 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
107 ci::ellen_bintree::make_traits<
108 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
109 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
110 ,co::compare< compare< base_value > >
111 ,ci::opt::disposer< disposer< base_value > >
112 ,co::item_counter< cds::atomicity::item_counter >
116 test_rcu<tree_type, print_stat>();
119 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_cmp_ic_stat()
121 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
122 ci::ellen_bintree::make_traits<
123 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
124 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
125 ,co::compare< compare< base_value > >
126 ,ci::opt::disposer< disposer< base_value > >
127 ,co::item_counter< cds::atomicity::item_counter >
128 ,co::stat< ci::ellen_bintree::stat<> >
132 test_rcu<tree_type, print_stat>();
135 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_pool()
137 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
138 ci::ellen_bintree::make_traits<
139 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
140 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
141 ,co::less< less< base_value > >
142 ,ci::opt::disposer< disposer< base_value > >
143 ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
144 ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
148 test_rcu<tree_type, print_stat>();
151 void IntrusiveBinTreeHdrTest::EllenBinTree_rcu_gpb_base_less_pool_ic_stat()
153 typedef ci::EllenBinTree< rcu_type, key_type, base_value,
154 ci::ellen_bintree::make_traits<
155 ci::opt::hook< ci::ellen_bintree::base_hook< co::gc< rcu_type > > >
156 ,ci::ellen_bintree::key_extractor< key_extractor< base_value > >
157 ,co::less< less< base_value > >
158 ,ci::opt::disposer< disposer< base_value > >
159 ,co::node_allocator< cds::memory::pool_allocator< internal_node, ellen_bintree_rcu::internal_node_pool_accessor > >
160 ,ci::ellen_bintree::update_desc_allocator< cds::memory::pool_allocator< update_desc, ellen_bintree_rcu::update_desc_pool_accessor > >
161 ,co::item_counter< cds::atomicity::item_counter >
162 ,co::stat< ci::ellen_bintree::stat<> >
166 test_rcu<tree_type, print_stat>();