44 rotate_left(node_pointer p_x)
46 node_pointer p_y = p_x->m_p_right;
48 p_x->m_p_right = p_y->m_p_left;
50 if (p_y->m_p_left != 0)
51 p_y->m_p_left->m_p_parent = p_x;
53 p_y->m_p_parent = p_x->m_p_parent;
55 if (p_x == m_p_head->m_p_parent)
56 m_p_head->m_p_parent = p_y;
57 else if (p_x == p_x->m_p_parent->m_p_left)
58 p_x->m_p_parent->m_p_left = p_y;
60 p_x->m_p_parent->m_p_right = p_y;
63 p_x->m_p_parent = p_y;
65 PB_DS_ASSERT_NODE_CONSISTENT(p_x)
66 PB_DS_ASSERT_NODE_CONSISTENT(p_y)
68 apply_update(p_x, (node_update* )this);
69 apply_update(p_x->m_p_parent, (node_update* )this);
75 rotate_right(node_pointer p_x)
77 node_pointer p_y = p_x->m_p_left;
79 p_x->m_p_left = p_y->m_p_right;
81 if (p_y->m_p_right != 0)
82 p_y->m_p_right->m_p_parent = p_x;
84 p_y->m_p_parent = p_x->m_p_parent;
86 if (p_x == m_p_head->m_p_parent)
87 m_p_head->m_p_parent = p_y;
88 else if (p_x == p_x->m_p_parent->m_p_right)
89 p_x->m_p_parent->m_p_right = p_y;
91 p_x->m_p_parent->m_p_left = p_y;
94 p_x->m_p_parent = p_y;
96 PB_DS_ASSERT_NODE_CONSISTENT(p_x)
97 PB_DS_ASSERT_NODE_CONSISTENT(p_y)
99 apply_update(p_x, (node_update* )this);
100 apply_update(p_x->m_p_parent, (node_update* )this);
106 rotate_parent(node_pointer p_nd)
108 node_pointer p_parent = p_nd->m_p_parent;
110 if (p_nd == p_parent->m_p_left)
111 rotate_right(p_parent);
113 rotate_left(p_parent);
115 _GLIBCXX_DEBUG_ASSERT(p_parent->m_p_parent = p_nd);
116 _GLIBCXX_DEBUG_ASSERT(p_nd->m_p_left == p_parent ||
117 p_nd->m_p_right == p_parent);
123 apply_update(node_pointer , null_node_update_pointer )
127 template<
typename Node_Update_>
130 apply_update(node_pointer p_nd, Node_Update_* )
132 node_update::operator()(node_iterator(p_nd),
133 node_const_iterator(static_cast<node_pointer>(0)));
137 template<
typename Node_Update_>
140 update_to_top(node_pointer p_nd, Node_Update_* p_update)
142 while (p_nd != m_p_head)
144 apply_update(p_nd, p_update);
146 p_nd = p_nd->m_p_parent;
153 update_to_top(node_pointer , null_node_update_pointer )