41 #ifdef PB_DS_CLASS_C_DEC
48 PB_DS_ASSERT_VALID_COND((*
this),
true)
49 _GLIBCXX_DEBUG_ASSERT(!base_type::empty());
54 _GLIBCXX_DEBUG_ASSERT(m_p_max != 0);
55 node_pointer p_nd = m_p_max;
56 remove_parentless_node(m_p_max);
57 base_type::actual_erase_node(p_nd);
59 PB_DS_ASSERT_VALID_COND((*this),true)
65 remove_parentless_node(node_pointer p_nd)
67 _GLIBCXX_DEBUG_ASSERT(p_nd != 0);
68 _GLIBCXX_DEBUG_ASSERT(base_type::parent(p_nd) == 0);
70 node_pointer p_cur_root = p_nd == base_type::m_p_root?
71 p_nd->m_p_next_sibling : base_type::m_p_root;
74 p_cur_root->m_p_prev_or_parent = 0;
76 if (p_nd->m_p_prev_or_parent != 0)
77 p_nd->m_p_prev_or_parent->m_p_next_sibling = p_nd->m_p_next_sibling;
79 if (p_nd->m_p_next_sibling != 0)
80 p_nd->m_p_next_sibling->m_p_prev_or_parent = p_nd->m_p_prev_or_parent;
82 node_pointer p_child = p_nd->m_p_l_child;
85 p_child->m_p_prev_or_parent = 0;
86 while (p_child->m_p_next_sibling != 0)
87 p_child = p_child->m_p_next_sibling;
91 base_type::m_p_root = join(p_cur_root, p_child);
106 erase(point_iterator it)
108 PB_DS_ASSERT_VALID_COND((*
this),
true)
109 _GLIBCXX_DEBUG_ASSERT(!base_type::empty());
111 base_type::bubble_to_top(it.m_p_nd);
112 remove_parentless_node(it.m_p_nd);
113 base_type::actual_erase_node(it.m_p_nd);
115 PB_DS_ASSERT_VALID_COND((*this),true)
119 template<typename Pred>
120 typename PB_DS_CLASS_C_DEC::size_type
124 PB_DS_ASSERT_VALID_COND((*
this),
true)
126 if (base_type::empty())
128 PB_DS_ASSERT_VALID_COND((*
this),
true)
132 base_type::to_linked_list();
133 node_pointer p_out = base_type::prune(pred);
138 node_pointer p_next = p_out->m_p_next_sibling;
139 base_type::actual_erase_node(p_out);
143 node_pointer p_cur = base_type::m_p_root;
144 base_type::m_p_root = 0;
147 node_pointer p_next = p_cur->m_p_next_sibling;
148 p_cur->m_p_l_child = p_cur->m_p_prev_or_parent = 0;
149 p_cur->m_metadata = 0;
150 p_cur->m_p_next_sibling = base_type::m_p_root;
152 if (base_type::m_p_root != 0)
153 base_type::m_p_root->m_p_prev_or_parent = p_cur;
155 base_type::m_p_root = p_cur;
156 base_type::m_p_root = fix(base_type::m_p_root);
161 PB_DS_ASSERT_VALID_COND((*
this),
true)