20 #ifndef _TPIE_BTREE_TREE_H_
21 #define _TPIE_BTREE_TREE_H_
24 #include <tpie/btree/base.h>
25 #include <tpie/btree/node.h>
37 template <
typename T,
typename O>
40 typedef tree_state<T, O> state_type;
42 static const bool is_internal = state_type::is_internal;
43 static const bool is_static = state_type::is_static;
44 static const bool is_ordered = state_type::is_ordered;
46 typedef typename state_type::augmenter_type augmenter_type;
52 typedef typename state_type::keyextract_type keyextract_type;
54 typedef typename state_type::augment_type augment_type;
60 typedef typename state_type::key_type
key_type;
62 typedef typename O::C comp_type;
64 typedef typename state_type::store_type store_type;
82 typedef typename store_type::leaf_type leaf_type;
83 typedef typename store_type::internal_type internal_type;
86 size_t count_child(internal_type node,
size_t i, leaf_type)
const {
87 return m_state.store().count_child_leaf(node, i);
90 size_t count_child(internal_type node,
size_t i, internal_type)
const {
91 return m_state.store().count_child_internal(node, i);
94 internal_type get_child(internal_type node,
size_t i, internal_type)
const {
95 return m_state.store().get_child_internal(node, i);
98 leaf_type get_child(internal_type node,
size_t i, leaf_type)
const {
99 return m_state.store().get_child_leaf(node, i);
102 template <
bool upper_bound = false,
typename K>
103 leaf_type find_leaf(std::vector<internal_type> & path, K k)
const {
105 if (m_state.store().height() == 1)
return m_state.store().get_root_leaf();
106 internal_type n = m_state.store().get_root_internal();
107 for (
size_t i=2;; ++i) {
109 for (
size_t j=0; ; ++j) {
110 if (j+1 == m_state.store().count(n) ||
112 ? m_comp(k, m_state.min_key(n, j+1))
113 : !m_comp(m_state.min_key(n, j+1), k))) {
114 if (i == m_state.store().height())
return m_state.store().get_child_leaf(n, j);
115 n = m_state.store().get_child_internal(n, j);
122 void augment(leaf_type l, internal_type p) {
123 m_state.store().set_augment(l, p, m_state.m_augmenter(
node_type(&m_state, l)));
130 void augment(internal_type l, internal_type p) {
131 m_state.store().set_augment(l, p, m_state.m_augmenter(
node_type(&m_state, l)));
134 size_t max_size(internal_type)
const throw() {
135 return m_state.store().max_internal_size();
138 size_t max_size(leaf_type)
const throw() {
139 return m_state.store().max_leaf_size();
142 size_t min_size(internal_type)
const throw() {
143 return m_state.store().min_internal_size();
146 size_t min_size(leaf_type)
const throw() {
147 return m_state.store().min_leaf_size();
150 template <
typename NT,
typename VT>
151 void insert_part(NT n, VT v,
size_t index) {
152 size_t z = m_state.store().count(n);
155 m_state.store().move(n, i-1, n, i);
158 m_state.store().set(n, i, v);
159 m_state.store().set_count(n, z+1);
163 template <
typename CT,
typename NT>
164 NT split_and_insert(CT c, NT left,
size_t index) {
165 tp_assert(m_state.store().count(left) == max_size(left),
"Node not full");
167 size_t left_size = max_size(left)/2;
168 size_t right_size = max_size(left)-left_size;
169 NT right = m_state.store().create(left);
170 for (
size_t i=0; i < right_size; ++i)
171 m_state.store().move(left, left_size+i, right, i);
172 m_state.store().set_count(left, left_size);
173 m_state.store().set_count(right, right_size);
175 if (index <= left_size)
176 insert_part(left, c, index);
178 insert_part(right, c, index - left_size);
182 void augment_path(leaf_type) {
186 void augment_path(std::vector<internal_type> & path) {
187 while (path.size() >= 2) {
188 internal_type c=path.back();
190 augment(c, path.back());
194 void augment_path(
const internal_type * path,
size_t level) {
196 augment(path[level], path[level-1]);
202 template <
typename CT,
typename PT>
203 bool remove_fixup_round(CT c, PT p) {
204 size_t z=m_state.store().count(c);
205 size_t i=m_state.store().index(c, p);
206 if (i != 0 && count_child(p, i-1, c) > min_size(c)) {
208 CT left = get_child(p, i-1, c);
209 size_t left_size = m_state.store().count(left);
210 for (
size_t j=0; j < z; ++j)
211 m_state.store().move(c, z-j-1, c, z-j);
212 m_state.store().move(left, left_size-1, c, 0);
213 m_state.store().set_count(left, left_size-1);
214 m_state.store().set_count(c, z+1);
221 if (i +1 != m_state.store().count(p) &&
222 count_child(p, i+1, c) > min_size(c)) {
224 CT right = get_child(p, i+1, c);
225 size_t right_size = m_state.store().count(right);
226 m_state.store().move(right, 0, c, z);
227 for (
size_t i=0; i+1 < right_size ; ++i)
228 m_state.store().move(right, i+1, right, i);
229 m_state.store().set_count(right, right_size-1);
230 m_state.store().set_count(c, z+1);
240 c2 = get_child(p, i+1, c);
242 c1 = get_child(p, i-1, c);
247 size_t z1 = m_state.store().count(c1);
248 size_t z2 = m_state.store().count(c2);
249 for (
size_t i=0; i < z2; ++i)
250 m_state.store().move(c2, i, c1, i+z1);
251 m_state.store().set_count(c1, z1+z2);
252 m_state.store().set_count(c2, 0);
255 size_t id = m_state.store().index(c2, p);
256 size_t z_ = m_state.store().count(p) -1;
257 for (;
id != z_; ++id)
258 m_state.store().move(p,
id+1, p,
id);
259 m_state.store().set_count(p, z_);
260 m_state.store().destroy(c2);
263 return z_ >= min_size(p);
286 template <
typename NT>
287 void createNewRoot(NT left, NT right) {
288 internal_type i = m_state.store().create_internal();
289 m_state.store().set_count(i, 2);
290 m_state.store().set(i, 0, left);
291 m_state.store().set(i, 1, right);
292 m_state.store().set_root(i);
293 m_state.store().set_height(m_state.store().height()+1);
301 template <
typename X=enab>
303 m_state.store().set_size(m_state.store().size() + 1);
306 if (m_state.store().height() == 0) {
307 leaf_type n = m_state.store().create_leaf();
308 m_state.store().set_count(n, 1);
309 m_state.store().set(n, 0, v);
310 m_state.store().set_height(1);
311 m_state.store().set_root(n);
315 const auto path = itr.m_path.data();
316 auto index = itr.index();
317 auto level = itr.m_path.size();
320 if (m_state.store().count(itr.m_leaf) != m_state.store().max_leaf_size()) {
321 insert_part(itr.m_leaf, v, index);
323 augment(itr.m_leaf, path[level-1]);
324 augment_path(path, level-1);
330 leaf_type l2 = split_and_insert(v, itr.m_leaf, index);
334 createNewRoot(itr.m_leaf, l2);
338 index = m_state.store().index(itr.m_leaf, path[level]) + 1;
340 augment(itr.m_leaf, path[level]);
343 if (m_state.store().count(path[level]) != m_state.store().max_internal_size()) {
344 insert_part(path[level], l2, index);
345 augment_path(path, level);
349 internal_type n2 = split_and_insert(l2, path[level], index);
352 index = m_state.store().index(path[level+1], path[level]) + 1;
353 augment(path[level+1], path[level]);
354 if (m_state.store().count(path[level]) != m_state.store().max_internal_size()) {
355 insert_part(path[level], n2, index);
356 augment_path(path, level);
359 n2 = split_and_insert(n2, path[level], index);
363 createNewRoot(path[0], n2);
370 template <
typename X=enab>
378 template <
typename K,
typename X=enab>
382 if(m_state.store().height() == 0) {
387 std::vector<internal_type> path;
388 leaf_type l = find_leaf<true>(path, v);
391 size_t z = m_state.store().count(l);
397 if (!m_comp(m_state.min_key(l, i), v) &&
398 !m_comp(v, m_state.min_key(l, i)))
break;
401 itr.goto_item(path, l, i);
409 template <
typename K,
typename X=enab>
412 if (m_state.store().height() == 0) {
417 std::vector<internal_type> path;
418 leaf_type l = find_leaf(path, v);
420 const size_t z = m_state.store().count(l);
421 for (
size_t i = 0 ; i < z ; ++i) {
422 if (!m_comp(m_state.min_key(l, i), v)) {
423 itr.goto_item(path, l, i);
427 itr.goto_item(path, l, z-1);
435 template <
typename K,
typename X=enab>
438 if (m_state.store().height() == 0) {
443 std::vector<internal_type> path;
444 leaf_type l = find_leaf<true>(path, v);
446 const size_t z = m_state.store().count(l);
447 for (
size_t i = 0 ; i < z ; ++i) {
448 if (m_comp(v, m_state.min_key(l, i))) {
449 itr.goto_item(path, l, i);
453 itr.goto_item(path, l, z-1);
460 template <
typename X=enab>
462 std::vector<internal_type> path=itr.m_path;
463 leaf_type l = itr.m_leaf;
465 size_t z = m_state.store().count(l);
466 size_t i = itr.m_index;
468 m_state.store().set_size(m_state.store().size()-1);
471 m_state.store().move(l, i+1, l, i);
472 m_state.store().set_count(l, z);
475 if (z >= m_state.store().min_leaf_size()) {
481 augment(l, path.back());
490 m_state.store().destroy(l);
491 m_state.store().set_height(0);
499 if (remove_fixup_round(l, path.back())) {
505 if (path.size() == 1) {
506 if (m_state.store().count(path.back()) == 1) {
507 l = m_state.store().get_child_leaf(path.back(), 0);
508 m_state.store().set_count(path.back(), 0);
509 m_state.store().destroy(path.back());
510 m_state.store().set_height(1);
511 m_state.store().set_root(l);
521 internal_type p = path.back();
523 if (remove_fixup_round(p, path.back())) {
528 if (path.size() == 1) {
529 if (m_state.store().count(path.back()) == 1) {
530 p = m_state.store().get_child_internal(path.back(), 0);
531 m_state.store().set_count(path.back(), 0);
532 m_state.store().destroy(path.back());
533 m_state.store().set_height(m_state.store().height()-1);
534 m_state.store().set_root(p);
549 template <
typename X=enab>
567 if (m_state.store().height() == 1)
return node_type(&m_state, m_state.store().get_root_leaf());
568 return node_type(&m_state, m_state.store().get_root_internal());
575 return m_state.store().size();
582 return m_state.store().size() == 0;
585 void set_metadata(
const std::string & data) {
586 m_state.store().set_metadata(data);
589 std::string get_metadata() {
590 return m_state.store().get_metadata();
596 template <
typename X=enab>
597 explicit tree(std::string path, comp_type comp=comp_type(), augmenter_type augmenter=augmenter_type(), enable<X, !is_internal> =
enab() ):
598 m_state(store_type(path), std::move(augmenter), keyextract_type()),
604 template <
typename X=enab>
605 explicit tree(comp_type comp=comp_type(),
606 augmenter_type augmenter=augmenter_type(),
608 enable<X, is_internal> =
enab() ):
609 m_state(store_type(bucket), std::move(augmenter), keyextract_type()),
614 const comp_type & comp()
const {
619 explicit tree(state_type state, comp_type comp):
620 m_state(std::move(state)),
629 template <
typename T,
typename ... Opts>
630 using btree = bbits::tree<T,
typename bbits::OptComp<Opts...>::type>;