41#ifdef PB_DS_CLASS_C_DEC
46join(PB_DS_CLASS_C_DEC& other)
48 PB_DS_ASSERT_VALID((*
this))
49 PB_DS_ASSERT_VALID(other)
50 if (base_type::join_prep(other) == false)
52 PB_DS_ASSERT_VALID((*
this))
53 PB_DS_ASSERT_VALID(other)
57 node_pointer p_target_r = other.leftmost(other.m_p_head);
58 _GLIBCXX_DEBUG_ASSERT(p_target_r != 0);
59 other.splay(p_target_r);
61 _GLIBCXX_DEBUG_ASSERT(p_target_r == other.m_p_head->m_p_parent);
62 _GLIBCXX_DEBUG_ASSERT(p_target_r->m_p_left == 0);
64 p_target_r->m_p_left = base_type::m_p_head->m_p_parent;
66 _GLIBCXX_DEBUG_ASSERT(p_target_r->m_p_left != 0);
67 p_target_r->m_p_left->m_p_parent = p_target_r;
69 base_type::m_p_head->m_p_parent = p_target_r;
70 p_target_r->m_p_parent = base_type::m_p_head;
72 this->apply_update(p_target_r, (node_update*)this);
73 base_type::join_finish(other);
75 PB_DS_ASSERT_VALID((*this))
76 PB_DS_ASSERT_VALID(other)
82split(key_const_reference r_key, PB_DS_CLASS_C_DEC& other)
84 PB_DS_ASSERT_VALID((*
this))
85 PB_DS_ASSERT_VALID(other)
87 if (base_type::split_prep(r_key, other) == false)
89 PB_DS_ASSERT_VALID((*
this))
90 PB_DS_ASSERT_VALID(other)
94 node_pointer p_upper_bound = this->upper_bound(r_key).m_p_nd;
95 _GLIBCXX_DEBUG_ASSERT(p_upper_bound != 0);
98 _GLIBCXX_DEBUG_ASSERT(p_upper_bound->m_p_parent == this->m_p_head);
100 node_pointer p_new_root = p_upper_bound->m_p_left;
101 _GLIBCXX_DEBUG_ASSERT(p_new_root != 0);
103 base_type::m_p_head->m_p_parent = p_new_root;
104 p_new_root->m_p_parent = base_type::m_p_head;
105 other.m_p_head->m_p_parent = p_upper_bound;
106 p_upper_bound->m_p_parent = other.m_p_head;
107 p_upper_bound->m_p_left = 0;
108 this->apply_update(p_upper_bound, (node_update*)this);
109 base_type::split_finish(other);
111 PB_DS_ASSERT_VALID((*this))
112 PB_DS_ASSERT_VALID(other)