PB_DS_CLASS_T_DEC
inline typename PB_DS_CLASS_C_DEC::point_iterator
PB_DS_CLASS_C_DEC::
push(const_reference r_val)
{
    PB_DS_ASSERT_VALID_COND((*this),true)
    node_pointer p_nd = base_type::get_new_node_for_insert(r_val);
    insert_node(p_nd);
    m_p_max = 0;
    PB_DS_ASSERT_VALID_COND((*this),true)
    return point_iterator(p_nd);
}
Beispiel #2
0
PB_DS_CLASS_T_DEC
inline typename PB_DS_CLASS_C_DEC::const_reference
PB_DS_CLASS_C_DEC::
top() const
{
  PB_DS_ASSERT_VALID_COND((*this),false)
  _GLIBCXX_DEBUG_ASSERT(!base_type::empty());

  if (m_p_max == 0)
    const_cast<PB_DS_CLASS_C_DEC* >(this)->find_max();

  _GLIBCXX_DEBUG_ASSERT(m_p_max != 0);
  return m_p_max->m_value;
}
PB_DS_CLASS_T_DEC
void
PB_DS_CLASS_C_DEC::
modify(point_iterator it, const_reference r_new_val)
{
    PB_DS_ASSERT_VALID_COND((*this),true)
    node_pointer p_nd = it.m_p_nd;

    _GLIBCXX_DEBUG_ASSERT(p_nd != 0);
    PB_DS_ASSERT_BASE_NODE_CONSISTENT(p_nd, false)

    const bool bubble_up = Cmp_Fn::operator()(p_nd->m_value, r_new_val);
    p_nd->m_value = r_new_val;

    if (bubble_up)
    {
        node_pointer p_parent = base_type::parent(p_nd);
        while (p_parent != 0 &&
                Cmp_Fn::operator()(p_parent->m_value, p_nd->m_value))
        {
            base_type::swap_with_parent(p_nd, p_parent);
            p_parent = base_type::parent(p_nd);
        }

        if (p_nd->m_p_prev_or_parent == 0)
            base_type::m_p_root = p_nd;

        m_p_max = 0;
        PB_DS_ASSERT_VALID_COND((*this),true)
        return;
    }

    base_type::bubble_to_top(p_nd);
    remove_parentless_node(p_nd);
    insert_node(p_nd);
    m_p_max = 0;
    PB_DS_ASSERT_VALID_COND((*this),true)
}