// warranty.
/**
- * @file insert_fn_imps.hpp
+ * @file thin_heap_/insert_fn_imps.hpp
* Contains an implementation for thin_heap_.
*/
push(const_reference r_val)
{
PB_DS_ASSERT_VALID((*this))
-
node_pointer p_nd = base_type::get_new_node_for_insert(r_val);
-
p_nd->m_metadata = 0;
-
p_nd->m_p_prev_or_parent = p_nd->m_p_l_child = 0;
-
if (base_type::m_p_root == 0)
{
p_nd->m_p_next_sibling = 0;
-
m_p_max = base_type::m_p_root = p_nd;
-
PB_DS_ASSERT_VALID((*this))
-
return point_iterator(p_nd);
}
p_nd->m_p_next_sibling = base_type::m_p_root;
-
base_type::m_p_root->m_p_prev_or_parent = 0;
-
base_type::m_p_root = p_nd;
-
update_max(p_nd);
-
PB_DS_ASSERT_VALID((*this))
-
return point_iterator(p_nd);
}
PB_DS_CLASS_C_DEC::
make_root(node_pointer p_nd)
{
- p_nd->m_metadata =
- p_nd->m_p_l_child == 0 ?
- 0 :
- 1 + p_nd->m_p_l_child->m_metadata;
+ p_nd->m_metadata = p_nd->m_p_l_child == 0
+ ? 0 : 1 + p_nd->m_p_l_child->m_metadata;
}
PB_DS_CLASS_T_DEC
make_root_and_link(node_pointer p_nd)
{
make_root(p_nd);
-
p_nd->m_p_prev_or_parent = 0;
-
p_nd->m_p_next_sibling = base_type::m_p_root;
-
if (base_type::m_p_root != 0)
base_type::m_p_root->m_p_prev_or_parent = 0;
base_type::m_p_root = p_nd;
-
update_max(p_nd);
}
if (p_y->m_p_prev_or_parent == 0)
{
fix_root(p_y);
-
return;
}
else if (p_y->m_metadata == 1&& p_y->m_p_next_sibling == 0)
if (p_y->m_p_l_child != 0)
{
fix_sibling_rank_1_unmarked(p_y);
-
return;
}
fix_sibling_rank_1_marked(p_y);
-
p_y = p_y->m_p_prev_or_parent;
}
else if (p_y->m_metadata > p_y->m_p_next_sibling->m_metadata + 1)
{
_GLIBCXX_DEBUG_ASSERT(p_y->m_p_l_child != 0);
-
if (p_y->m_metadata != p_y->m_p_l_child->m_metadata + 2)
{
fix_sibling_general_unmarked(p_y);
-
return;
}
fix_sibling_general_marked(p_y);
-
p_y = p_y->m_p_prev_or_parent;
}
else if ((p_y->m_p_l_child == 0&&
p_y->m_metadata == p_y->m_p_l_child->m_metadata + 3))
{
node_pointer p_z = p_y->m_p_prev_or_parent;
-
fix_child(p_y);
-
p_y = p_z;
}
else
fix_root(node_pointer p_y)
{
_GLIBCXX_DEBUG_ASSERT(p_y->m_p_prev_or_parent == 0);
-
make_root(p_y);
-
PB_DS_ASSERT_NODE_CONSISTENT(p_y, true)
}
_GLIBCXX_DEBUG_ASSERT(p_y->m_p_next_sibling == 0);
p_y->m_p_next_sibling = p_y->m_p_l_child;
-
p_y->m_p_next_sibling->m_p_prev_or_parent = p_y;
-
p_y->m_p_l_child = 0;
-
PB_DS_ASSERT_NODE_CONSISTENT(p_y, false)
}
{
_GLIBCXX_DEBUG_ASSERT(p_y->m_p_prev_or_parent != 0);
_GLIBCXX_DEBUG_ASSERT(p_y->m_p_l_child == 0);
-
p_y->m_metadata = 0;
-
PB_DS_ASSERT_NODE_CONSISTENT(p_y, false)
}
fix_sibling_general_marked(node_pointer p_y)
{
_GLIBCXX_DEBUG_ASSERT(p_y->m_p_prev_or_parent != 0);
-
--p_y->m_metadata;
-
PB_DS_ASSERT_NODE_CONSISTENT(p_y, false)
}
modify(point_iterator it, const_reference r_new_val)
{
PB_DS_ASSERT_VALID((*this))
- node_pointer p_nd = it.m_p_nd;
-
+ node_pointer p_nd = it.m_p_nd;
_GLIBCXX_DEBUG_ASSERT(p_nd != 0);
const bool smaller = Cmp_Fn::operator()(r_new_val, p_nd->m_value);
-
p_nd->m_value = r_new_val;
-
if (smaller)
{
remove_node(p_nd);
-
p_nd->m_p_l_child = 0;
-
make_root_and_link(p_nd);
-
PB_DS_ASSERT_VALID((*this))
-
return;
}
if (p_nd->m_p_prev_or_parent == 0)
{
update_max(p_nd);
-
PB_DS_ASSERT_VALID((*this))
-
return;
}
p_y->m_p_next_sibling = p_nd->m_p_next_sibling;
fix(p_y);
-
make_root_and_link(p_nd);
-
PB_DS_ASSERT_VALID((*this))
}