46 PB_DS_ASSERT_VALID_COND((*
this),
true)
47 _GLIBCXX_DEBUG_ASSERT(!base_type::empty());
52 _GLIBCXX_DEBUG_ASSERT(m_p_max != 0);
53 node_pointer p_nd = m_p_max;
54 remove_parentless_node(m_p_max);
55 base_type::actual_erase_node(p_nd);
57 PB_DS_ASSERT_VALID_COND((*this),true)
63 remove_parentless_node(node_pointer p_nd)
65 _GLIBCXX_DEBUG_ASSERT(p_nd != 0);
66 _GLIBCXX_DEBUG_ASSERT(base_type::parent(p_nd) == 0);
68 node_pointer p_cur_root = p_nd == base_type::m_p_root?
69 p_nd->m_p_next_sibling : base_type::m_p_root;
72 p_cur_root->m_p_prev_or_parent = 0;
74 if (p_nd->m_p_prev_or_parent != 0)
75 p_nd->m_p_prev_or_parent->m_p_next_sibling = p_nd->m_p_next_sibling;
77 if (p_nd->m_p_next_sibling != 0)
78 p_nd->m_p_next_sibling->m_p_prev_or_parent = p_nd->m_p_prev_or_parent;
80 node_pointer p_child = p_nd->m_p_l_child;
83 p_child->m_p_prev_or_parent = 0;
84 while (p_child->m_p_next_sibling != 0)
85 p_child = p_child->m_p_next_sibling;
89 base_type::m_p_root = join(p_cur_root, p_child);
104 erase(point_iterator it)
106 PB_DS_ASSERT_VALID_COND((*
this),
true)
107 _GLIBCXX_DEBUG_ASSERT(!base_type::empty());
109 base_type::bubble_to_top(it.m_p_nd);
110 remove_parentless_node(it.m_p_nd);
111 base_type::actual_erase_node(it.m_p_nd);
113 PB_DS_ASSERT_VALID_COND((*this),true)
117 template<typename Pred>
118 typename PB_DS_CLASS_C_DEC::size_type
122 PB_DS_ASSERT_VALID_COND((*
this),
true)
124 if (base_type::empty())
126 PB_DS_ASSERT_VALID_COND((*
this),
true)
130 base_type::to_linked_list();
131 node_pointer p_out = base_type::prune(pred);
136 node_pointer p_next = p_out->m_p_next_sibling;
137 base_type::actual_erase_node(p_out);
141 node_pointer p_cur = base_type::m_p_root;
142 base_type::m_p_root = 0;
145 node_pointer p_next = p_cur->m_p_next_sibling;
146 p_cur->m_p_l_child = p_cur->m_p_prev_or_parent = 0;
147 p_cur->m_metadata = 0;
148 p_cur->m_p_next_sibling = base_type::m_p_root;
150 if (base_type::m_p_root != 0)
151 base_type::m_p_root->m_p_prev_or_parent = p_cur;
153 base_type::m_p_root = p_cur;
154 base_type::m_p_root = fix(base_type::m_p_root);
159 PB_DS_ASSERT_VALID_COND((*
this),
true)