42 template<
typename Pred>
45 split(Pred pred, PB_DS_CLASS_C_DEC& other)
47 PB_DS_ASSERT_VALID_COND((*
this),
true)
48 PB_DS_ASSERT_VALID_COND(other,true)
51 if (base_type::empty())
53 PB_DS_ASSERT_VALID_COND((*
this),
true)
54 PB_DS_ASSERT_VALID_COND(other,true)
58 base_type::to_linked_list();
59 node_pointer p_out = base_type::prune(pred);
62 _GLIBCXX_DEBUG_ASSERT(base_type::m_size > 0);
66 node_pointer p_next = p_out->m_p_next_sibling;
67 p_out->m_p_l_child = p_out->m_p_prev_or_parent = 0;
68 p_out->m_metadata = 0;
70 p_out->m_p_next_sibling = other.m_p_root;
71 if (other.m_p_root != 0)
72 other.m_p_root->m_p_prev_or_parent = p_out;
74 other.m_p_root = p_out;
75 other.m_p_root = other.fix(other.m_p_root);
79 PB_DS_ASSERT_VALID_COND(other,
true)
80 node_pointer p_cur = base_type::m_p_root;
81 base_type::m_p_root = 0;
85 node_pointer p_next = p_cur->m_p_next_sibling;
86 p_cur->m_p_l_child = p_cur->m_p_prev_or_parent = 0;
87 p_cur->m_metadata = 0;
88 p_cur->m_p_next_sibling = base_type::m_p_root;
90 if (base_type::m_p_root != 0)
91 base_type::m_p_root->m_p_prev_or_parent = p_cur;
93 base_type::m_p_root = p_cur;
94 base_type::m_p_root = fix(base_type::m_p_root);
99 PB_DS_ASSERT_VALID_COND((*
this),
true)
100 PB_DS_ASSERT_VALID_COND(other,true)
106 join(PB_DS_CLASS_C_DEC& other)
108 PB_DS_ASSERT_VALID_COND((*
this),
true)
109 PB_DS_ASSERT_VALID_COND(other,true)
111 node_pointer p_other = other.m_p_root;
115 node_pointer p_next = p_other->m_p_next_sibling;
116 std::swap(p_other->m_p_next_sibling, p_other->m_p_prev_or_parent);
119 while (p_other != 0);
121 base_type::m_p_root = join(base_type::m_p_root, other.m_p_root);
122 base_type::m_size += other.m_size;
129 PB_DS_ASSERT_VALID_COND((*
this),
true)
130 PB_DS_ASSERT_VALID_COND(other,true)
134 inline typename PB_DS_CLASS_C_DEC::node_pointer
136 join(node_pointer p_lhs, node_pointer p_rhs)
const
138 node_pointer p_ret = 0;
139 node_pointer p_cur = 0;
141 while (p_lhs != 0 || p_rhs != 0)
146 p_ret = p_cur = p_lhs;
149 p_cur->m_p_next_sibling = p_lhs;
150 p_lhs->m_p_prev_or_parent = p_cur;
154 else if (p_lhs == 0 || p_rhs->m_metadata < p_lhs->m_metadata)
158 p_ret = p_cur = p_rhs;
159 p_rhs = p_rhs->m_p_prev_or_parent;
163 p_cur->m_p_next_sibling = p_rhs;
164 p_rhs = p_rhs->m_p_prev_or_parent;
165 p_cur->m_p_next_sibling->m_p_prev_or_parent = p_cur;
166 p_cur = p_cur->m_p_next_sibling;
169 else if (p_lhs->m_metadata < p_rhs->m_metadata)
172 p_ret = p_cur = p_lhs;
175 p_cur->m_p_next_sibling = p_lhs;
176 p_lhs->m_p_prev_or_parent = p_cur;
177 p_cur = p_cur->m_p_next_sibling;
179 p_lhs = p_cur->m_p_next_sibling;
183 node_pointer p_next_rhs = p_rhs->m_p_prev_or_parent;
184 p_rhs->m_p_next_sibling = p_lhs;
191 p_cur->m_p_next_sibling = 0;
194 p_ret->m_p_prev_or_parent = 0;
void swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
Swaps two values.