本文整理匯總了Golang中github.com/cockroachdb/cockroach/proto.RangeTreeNode.Black方法的典型用法代碼示例。如果您正苦於以下問題:Golang RangeTreeNode.Black方法的具體用法?Golang RangeTreeNode.Black怎麽用?Golang RangeTreeNode.Black使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/cockroachdb/cockroach/proto.RangeTreeNode
的用法示例。
在下文中一共展示了RangeTreeNode.Black方法的5個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: delete
// delete removes a range from the range tree.
// Since this tree is not stored in memory but persisted through the ranges, in
// place deletion is not possible. Instead, we use the helper function
// swapNodes above.
func (tc *treeContext) delete(node *proto.RangeTreeNode) error {
key := node.Key
if node.LeftKey != nil && node.RightKey != nil {
left, err := tc.getNode(node.LeftKey)
if err != nil {
return err
}
predecessor, err := tc.getMaxNode(left)
if err != nil {
return err
}
node, _, err = tc.swapNodes(node, predecessor)
if err != nil {
return err
}
}
// Node will always have at most one child.
var child *proto.RangeTreeNode
var err error
if node.LeftKey != nil {
if child, err = tc.getNode(node.LeftKey); err != nil {
return err
}
} else if node.RightKey != nil {
if child, err = tc.getNode(node.RightKey); err != nil {
return err
}
}
if !isRed(node) {
// Paint the node to the color of the child node.
node.Black = !isRed(child)
tc.setNode(node)
if err := tc.deleteCase1(node); err != nil {
return err
}
}
if _, err := tc.replaceNode(node, child); err != nil {
return err
}
// Always set the root back to black
if node, err = tc.getNode(node.Key); err != nil {
return err
}
if child != nil && node.ParentKey == nil {
if child, err = tc.getNode(child.Key); err != nil {
return err
}
child.Black = true
tc.setNode(child)
}
tc.dropNode(key)
return nil
}
示例2: insertCase1
// insertCase1 handles the case when the inserted node is the root node.
func (tc *treeContext) insertCase1(node *proto.RangeTreeNode) error {
if node.ParentKey == nil {
node.Black = true
tc.setNode(node)
return nil
}
return tc.insertCase2(node)
}
示例3: rotateRight
// rotateRight performs a right rotation around the node.
func (tc *treeContext) rotateRight(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) {
left, err := tc.getNode(node.LeftKey)
if err != nil {
return nil, err
}
if left.Black {
return nil, util.Error("rotating a black node")
}
node.LeftKey = left.RightKey
left.RightKey = &node.Key
left.Black = node.Black
node.Black = false
tc.setNode(node)
tc.setNode(left)
return left, nil
}
示例4: rotateLeft
// rotateLeft performs a left rotation around the node.
func (tc *treeContext) rotateLeft(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) {
right, err := tc.getNode(node.RightKey)
if err != nil {
return nil, err
}
if right.Black {
return nil, util.Error("rotating a black node")
}
node.RightKey = right.LeftKey
right.LeftKey = &node.Key
right.Black = node.Black
node.Black = false
tc.setNode(node)
tc.setNode(right)
return right, nil
}
示例5: flip
// flip swaps the color of the node and both of its children. Both those
// children must exist.
func (tc *treeContext) flip(node *proto.RangeTreeNode) (*proto.RangeTreeNode, error) {
left, err := tc.getNode(node.LeftKey)
if err != nil {
return nil, err
}
right, err := tc.getNode(node.RightKey)
if err != nil {
return nil, err
}
node.Black = !node.Black
left.Black = !left.Black
right.Black = !right.Black
tc.setNode(node)
tc.setNode(left)
tc.setNode(right)
return node, nil
}