44 join(PB_DS_CLASS_C_DEC& other)
46 PB_DS_ASSERT_VALID((*
this))
47 PB_DS_ASSERT_VALID(other)
49 if (!join_prep(other, bag))
51 PB_DS_ASSERT_VALID((*
this))
52 PB_DS_ASSERT_VALID(other)
56 m_p_head->m_p_parent = rec_join(m_p_head->m_p_parent,
57 other.m_p_head->m_p_parent, 0, bag);
59 m_p_head->m_p_parent->m_p_parent = m_p_head;
60 m_size += other.m_size;
62 PB_DS_ASSERT_VALID(other)
63 m_p_head->m_p_min = leftmost_descendant(m_p_head->m_p_parent);
64 m_p_head->m_p_max = rightmost_descendant(m_p_head->m_p_parent);
65 PB_DS_ASSERT_VALID((*this))
71 join_prep(PB_DS_CLASS_C_DEC& other, branch_bag& r_bag)
73 PB_DS_ASSERT_VALID((*
this))
74 PB_DS_ASSERT_VALID(other)
75 if (other.m_size == 0)
85 synth_access_traits::cmp_keys(PB_DS_V2F(static_cast<leaf_const_pointer>(m_p_head->m_p_max)->value()),
86 PB_DS_V2F(static_cast<leaf_const_pointer>(other.m_p_head->m_p_min)->value()));
89 synth_access_traits::cmp_keys(PB_DS_V2F(static_cast<leaf_const_pointer>(other.m_p_head->m_p_max)->value()),
90 PB_DS_V2F(static_cast<leaf_const_pointer>(m_p_head->m_p_min)->value()));
92 if (!greater && !lesser)
95 rec_join_prep(m_p_head->m_p_parent, other.m_p_head->m_p_parent, r_bag);
96 _GLIBCXX_DEBUG_ONLY(debug_base::join(other,
false);)
103 rec_join_prep(node_const_pointer p_l, node_const_pointer p_r,
106 if (p_l->m_type == leaf_node)
108 if (p_r->m_type == leaf_node)
110 rec_join_prep(static_cast<leaf_const_pointer>(p_l),
111 static_cast<leaf_const_pointer>(p_r), r_bag);
115 _GLIBCXX_DEBUG_ASSERT(p_r->m_type == i_node);
116 rec_join_prep(static_cast<leaf_const_pointer>(p_l),
117 static_cast<inode_const_pointer>(p_r), r_bag);
121 _GLIBCXX_DEBUG_ASSERT(p_l->m_type == i_node);
122 if (p_r->m_type == leaf_node)
124 rec_join_prep(static_cast<inode_const_pointer>(p_l),
125 static_cast<leaf_const_pointer>(p_r), r_bag);
129 _GLIBCXX_DEBUG_ASSERT(p_r->m_type == i_node);
131 rec_join_prep(static_cast<inode_const_pointer>(p_l),
132 static_cast<inode_const_pointer>(p_r), r_bag);
138 rec_join_prep(leaf_const_pointer , leaf_const_pointer ,
140 { r_bag.add_branch(); }
145 rec_join_prep(leaf_const_pointer , inode_const_pointer ,
147 { r_bag.add_branch(); }
152 rec_join_prep(inode_const_pointer , leaf_const_pointer ,
154 { r_bag.add_branch(); }
159 rec_join_prep(inode_const_pointer p_l, inode_const_pointer p_r,
162 if (p_l->get_e_ind() == p_r->get_e_ind() &&
163 synth_access_traits::equal_prefixes(p_l->pref_b_it(), p_l->pref_e_it(),
164 p_r->pref_b_it(), p_r->pref_e_it()))
166 for (
typename inode::const_iterator it = p_r->begin();
167 it != p_r->end(); ++ it)
169 node_const_pointer p_l_join_child = p_l->get_join_child(*it,
this);
170 if (p_l_join_child != 0)
171 rec_join_prep(p_l_join_child, * it, r_bag);
176 if (p_r->get_e_ind() < p_l->get_e_ind() &&
177 p_r->should_be_mine(p_l->pref_b_it(), p_l->pref_e_it(), 0,
this))
179 node_const_pointer p_r_join_child = p_r->get_join_child(p_l,
this);
180 if (p_r_join_child != 0)
181 rec_join_prep(p_r_join_child, p_l, r_bag);
185 if (p_r->get_e_ind() < p_l->get_e_ind() &&
186 p_r->should_be_mine(p_l->pref_b_it(), p_l->pref_e_it(), 0,
this))
188 node_const_pointer p_r_join_child = p_r->get_join_child(p_l,
this);
189 if (p_r_join_child != 0)
190 rec_join_prep(p_r_join_child, p_l, r_bag);
197 typename PB_DS_CLASS_C_DEC::node_pointer
199 rec_join(node_pointer p_l, node_pointer p_r, size_type checked_ind,
202 _GLIBCXX_DEBUG_ASSERT(p_r != 0);
205 apply_update(p_r, (node_update*)
this);
209 if (p_l->m_type == leaf_node)
211 if (p_r->m_type == leaf_node)
213 node_pointer p_ret = rec_join(static_cast<leaf_pointer>(p_l),
214 static_cast<leaf_pointer>(p_r), r_bag);
215 apply_update(p_ret, (node_update*)
this);
219 _GLIBCXX_DEBUG_ASSERT(p_r->m_type == i_node);
220 node_pointer p_ret = rec_join(static_cast<leaf_pointer>(p_l),
221 static_cast<inode_pointer>(p_r),
223 apply_update(p_ret, (node_update*)
this);
227 _GLIBCXX_DEBUG_ASSERT(p_l->m_type == i_node);
228 if (p_r->m_type == leaf_node)
230 node_pointer p_ret = rec_join(static_cast<inode_pointer>(p_l),
231 static_cast<leaf_pointer>(p_r),
233 apply_update(p_ret, (node_update*)
this);
237 _GLIBCXX_DEBUG_ASSERT(p_r->m_type == i_node);
238 node_pointer p_ret = rec_join(static_cast<inode_pointer>(p_l),
239 static_cast<inode_pointer>(p_r),
242 apply_update(p_ret, (node_update*)
this);
247 typename PB_DS_CLASS_C_DEC::node_pointer
249 rec_join(leaf_pointer p_l, leaf_pointer p_r, branch_bag& r_bag)
251 _GLIBCXX_DEBUG_ASSERT(p_r != 0);
254 node_pointer p_ret = insert_branch(p_l, p_r, r_bag);
255 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_ret) == 2);
260 typename PB_DS_CLASS_C_DEC::node_pointer
262 rec_join(leaf_pointer p_l, inode_pointer p_r, size_type checked_ind,
265 #ifdef _GLIBCXX_DEBUG
266 const size_type lhs_leafs = PB_DS_RECURSIVE_COUNT_LEAFS(p_l);
267 const size_type rhs_leafs = PB_DS_RECURSIVE_COUNT_LEAFS(p_r);
270 _GLIBCXX_DEBUG_ASSERT(p_r != 0);
271 node_pointer p_ret = rec_join(p_r, p_l, checked_ind, r_bag);
272 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_ret) == lhs_leafs + rhs_leafs);
277 typename PB_DS_CLASS_C_DEC::node_pointer
279 rec_join(inode_pointer p_l, leaf_pointer p_r, size_type checked_ind, branch_bag& r_bag)
281 _GLIBCXX_DEBUG_ASSERT(p_l != 0);
282 _GLIBCXX_DEBUG_ASSERT(p_r != 0);
284 #ifdef _GLIBCXX_DEBUG
285 const size_type lhs_leafs = PB_DS_RECURSIVE_COUNT_LEAFS(p_l);
286 const size_type rhs_leafs = PB_DS_RECURSIVE_COUNT_LEAFS(p_r);
289 if (!p_l->should_be_mine(pref_begin(p_r), pref_end(p_r), checked_ind,
this))
291 node_pointer p_ret = insert_branch(p_l, p_r, r_bag);
292 PB_DS_ASSERT_NODE_VALID(p_ret)
293 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_ret) ==
294 lhs_leafs + rhs_leafs);
298 node_pointer p_pot_child = p_l->add_child(p_r, pref_begin(p_r),
299 pref_end(p_r), this);
300 if (p_pot_child != p_r)
302 node_pointer p_new_child = rec_join(p_pot_child, p_r, p_l->get_e_ind(),
305 p_l->replace_child(p_new_child, pref_begin(p_new_child),
306 pref_end(p_new_child),
this);
309 PB_DS_ASSERT_NODE_VALID(p_l)
310 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_l) == lhs_leafs + rhs_leafs);
315 typename PB_DS_CLASS_C_DEC::node_pointer
317 rec_join(inode_pointer p_l, inode_pointer p_r,
320 _GLIBCXX_DEBUG_ASSERT(p_l != 0);
321 _GLIBCXX_DEBUG_ASSERT(p_r != 0);
323 #ifdef _GLIBCXX_DEBUG
324 const size_type lhs_leafs = PB_DS_RECURSIVE_COUNT_LEAFS(p_l);
325 const size_type rhs_leafs = PB_DS_RECURSIVE_COUNT_LEAFS(p_r);
328 if (p_l->get_e_ind() == p_r->get_e_ind() &&
329 synth_access_traits::equal_prefixes(p_l->pref_b_it(), p_l->pref_e_it(),
330 p_r->pref_b_it(), p_r->pref_e_it()))
332 for (
typename inode::iterator it = p_r->begin();
333 it != p_r->end(); ++ it)
335 node_pointer p_new_child = rec_join(p_l->get_join_child(*it,
this),
337 p_l->replace_child(p_new_child, pref_begin(p_new_child),
338 pref_end(p_new_child),
this);
342 s_inode_allocator.deallocate(p_r, 1);
343 PB_DS_ASSERT_NODE_VALID(p_l)
344 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_l) == lhs_leafs + rhs_leafs);
348 if (p_l->get_e_ind() < p_r->get_e_ind() &&
349 p_l->should_be_mine(p_r->pref_b_it(), p_r->pref_e_it(), 0, this))
351 node_pointer p_new_child = rec_join(p_l->get_join_child(p_r,
this),
353 p_l->replace_child(p_new_child, pref_begin(p_new_child),
354 pref_end(p_new_child),
this);
355 PB_DS_ASSERT_NODE_VALID(p_l)
359 if (p_r->get_e_ind() < p_l->get_e_ind() &&
360 p_r->should_be_mine(p_l->pref_b_it(), p_l->pref_e_it(), 0, this))
362 node_pointer p_new_child = rec_join(p_r->get_join_child(p_l,
this), p_l,
365 p_r->replace_child(p_new_child, pref_begin(p_new_child),
366 pref_end(p_new_child),
this);
368 PB_DS_ASSERT_NODE_VALID(p_r)
369 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_r) == lhs_leafs + rhs_leafs);
373 node_pointer p_ret = insert_branch(p_l, p_r, r_bag);
374 PB_DS_ASSERT_NODE_VALID(p_ret)
375 _GLIBCXX_DEBUG_ASSERT(PB_DS_RECURSIVE_COUNT_LEAFS(p_ret) == lhs_leafs + rhs_leafs);
380 inline std::pair<typename PB_DS_CLASS_C_DEC::iterator,
bool>
382 insert(const_reference r_val)
384 node_pointer p_lf = find_imp(PB_DS_V2F(r_val));
385 if (p_lf != 0 && p_lf->m_type == leaf_node &&
386 synth_access_traits::equal_keys(PB_DS_V2F(static_cast<leaf_pointer>(p_lf)->value()), PB_DS_V2F(r_val)))
388 PB_DS_CHECK_KEY_EXISTS(PB_DS_V2F(r_val))
389 PB_DS_ASSERT_VALID((*this))
390 return std::
make_pair(iterator(p_lf), false);
393 PB_DS_CHECK_KEY_DOES_NOT_EXIST(PB_DS_V2F(r_val))
395 leaf_pointer p_new_lf = s_leaf_allocator.allocate(1);
396 cond_dealtor cond(p_new_lf);
398 new (p_new_lf) leaf(r_val);
399 apply_update(p_new_lf, (node_update*)this);
400 cond.set_call_destructor();
403 m_p_head->m_p_parent = rec_join(m_p_head->m_p_parent, p_new_lf, 0, bag);
404 m_p_head->m_p_parent->m_p_parent = m_p_head;
405 cond.set_no_action_dtor();
407 update_min_max_for_inserted_leaf(p_new_lf);
408 _GLIBCXX_DEBUG_ONLY(debug_base::insert_new(PB_DS_V2F(r_val));)
409 PB_DS_ASSERT_VALID((*this))
410 return std::
make_pair(point_iterator(p_new_lf), true);
414 typename PB_DS_CLASS_C_DEC::size_type
416 keys_diff_ind(typename access_traits::const_iterator b_l,
417 typename access_traits::const_iterator e_l,
418 typename access_traits::const_iterator b_r,
419 typename access_traits::const_iterator e_r)
421 size_type diff_pos = 0;
426 if (access_traits::e_pos(*b_l) != access_traits::e_pos(*b_r))
432 _GLIBCXX_DEBUG_ASSERT(b_r != e_r);
437 typename PB_DS_CLASS_C_DEC::inode_pointer
439 insert_branch(node_pointer p_l, node_pointer p_r, branch_bag& r_bag)
441 typename synth_access_traits::const_iterator left_b_it = pref_begin(p_l);
442 typename synth_access_traits::const_iterator left_e_it = pref_end(p_l);
443 typename synth_access_traits::const_iterator right_b_it = pref_begin(p_r);
444 typename synth_access_traits::const_iterator right_e_it = pref_end(p_r);
446 const size_type diff_ind = keys_diff_ind(left_b_it, left_e_it,
447 right_b_it, right_e_it);
449 inode_pointer p_new_nd = r_bag.get_branch();
450 new (p_new_nd) inode(diff_ind, left_b_it);
451 p_new_nd->add_child(p_l, left_b_it, left_e_it,
this);
452 p_new_nd->add_child(p_r, right_b_it, right_e_it,
this);
453 p_l->m_p_parent = p_new_nd;
454 p_r->m_p_parent = p_new_nd;
455 PB_DS_ASSERT_NODE_VALID(p_new_nd)
462 update_min_max_for_inserted_leaf(leaf_pointer p_new_lf)
464 if (m_p_head->m_p_min == m_p_head ||
465 synth_access_traits::cmp_keys(PB_DS_V2F(p_new_lf->value()),
466 PB_DS_V2F(static_cast<leaf_const_pointer>(m_p_head->m_p_min)->value())))
467 m_p_head->m_p_min = p_new_lf;
469 if (m_p_head->m_p_max == m_p_head ||
470 synth_access_traits::cmp_keys(PB_DS_V2F(static_cast<leaf_const_pointer>(m_p_head->m_p_max)->value()), PB_DS_V2F(p_new_lf->value())))
471 m_p_head->m_p_max = p_new_lf;
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.