in hashring/rbtree.go [89:166]
func (t *redBlackTree) Insert(key keytype, value valuetype) (ret bool) {
if t.root == nil {
t.root = &redBlackNode{
key: key,
value: value,
}
ret = true
} else {
var head = &redBlackNode{}
var dir = true
var last = true
var parent *redBlackNode // parent
var gparent *redBlackNode // grandparent
var ggparent = head // great grandparent
var node = t.root
ggparent.right = t.root
for {
if node == nil {
// insert new node at bottom
node = &redBlackNode{
key: key,
value: value,
red: true,
}
parent.setChild(dir, node)
ret = true
} else if isRed(node.left) && isRed(node.right) {
// flip colors
node.red = true
node.left.red, node.right.red = false, false
}
// fix red violation
if isRed(node) && isRed(parent) {
dir2 := ggparent.right == gparent
if node == parent.Child(last) {
ggparent.setChild(dir2, singleRotate(gparent, !last))
} else {
ggparent.setChild(dir2, doubleRotate(gparent, !last))
}
}
cmp := node.key.Compare(key)
// stop if found
if cmp == 0 {
break
}
last = dir
dir = cmp < 0
// update helpers
if gparent != nil {
ggparent = gparent
}
gparent = parent
parent = node
node = node.Child(dir)
}
t.root = head.right
}
// make root black
t.root.red = false
if ret {
t.size++
}
return ret
}