mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
adding gres
This commit is contained in:
@ -80,28 +80,28 @@ func (tree *AVLTree) Sets(data map[interface{}]interface{}) {
|
||||
func (tree *AVLTree) Search(key interface{}) (value interface{}, found bool) {
|
||||
tree.mu.RLock()
|
||||
defer tree.mu.RUnlock()
|
||||
if n := tree.doSearch(key); n != nil {
|
||||
return n.Value, true
|
||||
if node, found := tree.doSearch(key); found {
|
||||
return node.Value, true
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// doSearch searches the tree with given <key>.
|
||||
// Second return parameter <found> is true if key was found, otherwise false.
|
||||
func (tree *AVLTree) doSearch(key interface{}) *AVLTreeNode {
|
||||
n := tree.root
|
||||
for n != nil {
|
||||
cmp := tree.comparator(key, n.Key)
|
||||
func (tree *AVLTree) doSearch(key interface{}) (node *AVLTreeNode, found bool) {
|
||||
node = tree.root
|
||||
for node != nil {
|
||||
cmp := tree.comparator(key, node.Key)
|
||||
switch {
|
||||
case cmp == 0:
|
||||
return n
|
||||
return node, true
|
||||
case cmp < 0:
|
||||
n = n.children[0]
|
||||
node = node.children[0]
|
||||
case cmp > 0:
|
||||
n = n.children[1]
|
||||
node = node.children[1]
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// Get searches the node in the tree by <key> and returns its value or nil if key is not found in tree.
|
||||
@ -122,8 +122,8 @@ func (tree *AVLTree) Get(key interface{}) (value interface{}) {
|
||||
func (tree *AVLTree) doSetWithLockCheck(key interface{}, value interface{}) interface{} {
|
||||
tree.mu.Lock()
|
||||
defer tree.mu.Unlock()
|
||||
if n := tree.doSearch(key); n != nil {
|
||||
return n.Value
|
||||
if node, found := tree.doSearch(key); found {
|
||||
return node.Value
|
||||
}
|
||||
if f, ok := value.(func() interface{}); ok {
|
||||
value = f()
|
||||
@ -451,7 +451,8 @@ func (tree *AVLTree) IteratorAsc(f func(key, value interface{}) bool) {
|
||||
func (tree *AVLTree) IteratorAscFrom(key interface{}, f func(key, value interface{}) bool) {
|
||||
tree.mu.RLock()
|
||||
defer tree.mu.RUnlock()
|
||||
tree.doIteratorAsc(tree.doSearch(key), f)
|
||||
node, _ := tree.doSearch(key)
|
||||
tree.doIteratorAsc(node, f)
|
||||
}
|
||||
|
||||
func (tree *AVLTree) doIteratorAsc(node *AVLTreeNode, f func(key, value interface{}) bool) {
|
||||
@ -474,7 +475,8 @@ func (tree *AVLTree) IteratorDesc(f func(key, value interface{}) bool) {
|
||||
func (tree *AVLTree) IteratorDescFrom(key interface{}, f func(key, value interface{}) bool) {
|
||||
tree.mu.RLock()
|
||||
defer tree.mu.RUnlock()
|
||||
tree.doIteratorDesc(tree.doSearch(key), f)
|
||||
node, _ := tree.doSearch(key)
|
||||
tree.doIteratorDesc(node, f)
|
||||
}
|
||||
|
||||
func (tree *AVLTree) doIteratorDesc(node *AVLTreeNode, f func(key, value interface{}) bool) {
|
||||
|
||||
@ -142,7 +142,7 @@ func (tree *RedBlackTree) Get(key interface{}) (value interface{}) {
|
||||
func (tree *RedBlackTree) doSetWithLockCheck(key interface{}, value interface{}) interface{} {
|
||||
tree.mu.Lock()
|
||||
defer tree.mu.Unlock()
|
||||
if node := tree.doSearch(key); node != nil {
|
||||
if node, found := tree.doSearch(key); found {
|
||||
return node.Value
|
||||
}
|
||||
if f, ok := value.(func() interface{}); ok {
|
||||
@ -253,8 +253,8 @@ func (tree *RedBlackTree) Contains(key interface{}) bool {
|
||||
// doRemove removes the node from the tree by <key> without mutex.
|
||||
func (tree *RedBlackTree) doRemove(key interface{}) (value interface{}) {
|
||||
child := (*RedBlackTreeNode)(nil)
|
||||
node := tree.doSearch(key)
|
||||
if node == nil {
|
||||
node, found := tree.doSearch(key)
|
||||
if !found {
|
||||
return
|
||||
}
|
||||
value = node.Value
|
||||
@ -472,7 +472,8 @@ func (tree *RedBlackTree) IteratorAsc(f func(key, value interface{}) bool) {
|
||||
func (tree *RedBlackTree) IteratorAscFrom(key interface{}, f func(key, value interface{}) bool) {
|
||||
tree.mu.RLock()
|
||||
defer tree.mu.RUnlock()
|
||||
tree.doIteratorAsc(tree.doSearch(key), f)
|
||||
node, _ := tree.doSearch(key)
|
||||
tree.doIteratorAsc(node, f)
|
||||
}
|
||||
|
||||
func (tree *RedBlackTree) doIteratorAsc(node *RedBlackTreeNode, f func(key, value interface{}) bool) {
|
||||
@ -512,7 +513,8 @@ func (tree *RedBlackTree) IteratorDesc(f func(key, value interface{}) bool) {
|
||||
func (tree *RedBlackTree) IteratorDescFrom(key interface{}, f func(key, value interface{}) bool) {
|
||||
tree.mu.RLock()
|
||||
defer tree.mu.RUnlock()
|
||||
tree.doIteratorDesc(tree.doSearch(key), f)
|
||||
node, _ := tree.doSearch(key)
|
||||
tree.doIteratorDesc(node, f)
|
||||
}
|
||||
|
||||
func (tree *RedBlackTree) doIteratorDesc(node *RedBlackTreeNode, f func(key, value interface{}) bool) {
|
||||
@ -570,8 +572,8 @@ func (tree *RedBlackTree) Print() {
|
||||
func (tree *RedBlackTree) Search(key interface{}) (value interface{}, found bool) {
|
||||
tree.mu.RLock()
|
||||
defer tree.mu.RUnlock()
|
||||
node := tree.doSearch(key)
|
||||
if node != nil {
|
||||
node, found := tree.doSearch(key)
|
||||
if found {
|
||||
return node.Value, true
|
||||
}
|
||||
return nil, false
|
||||
@ -629,20 +631,20 @@ func (tree *RedBlackTree) output(node *RedBlackTreeNode, prefix string, isTail b
|
||||
|
||||
// doSearch searches the tree with given <key> without mutex.
|
||||
// It returns the node if found or otherwise nil.
|
||||
func (tree *RedBlackTree) doSearch(key interface{}) *RedBlackTreeNode {
|
||||
node := tree.root
|
||||
func (tree *RedBlackTree) doSearch(key interface{}) (node *RedBlackTreeNode, found bool) {
|
||||
node = tree.root
|
||||
for node != nil {
|
||||
compare := tree.comparator(key, node.Key)
|
||||
switch {
|
||||
case compare == 0:
|
||||
return node
|
||||
return node, true
|
||||
case compare < 0:
|
||||
node = node.left
|
||||
case compare > 0:
|
||||
node = node.right
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return node, false
|
||||
}
|
||||
|
||||
func (node *RedBlackTreeNode) grandparent() *RedBlackTreeNode {
|
||||
|
||||
Reference in New Issue
Block a user