mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
Merge branch 'master' of https://github.com/gogf/gf
This commit is contained in:
@ -193,17 +193,17 @@ func (r *Ring) RLockIteratorNext(f func(value interface{}) bool) {
|
||||
}
|
||||
}
|
||||
|
||||
// LockIteratorPrev iterates and locks writing backward
|
||||
// RLockIteratorPrev iterates and locks writing backward
|
||||
// with given callback function `f` within RWMutex.RLock.
|
||||
// If `f` returns true, then it continues iterating; or false to stop.
|
||||
func (r *Ring) LockIteratorPrev(f func(item *ring.Ring) bool) {
|
||||
func (r *Ring) RLockIteratorPrev(f func(value interface{}) bool) {
|
||||
r.mu.RLock()
|
||||
defer r.mu.RUnlock()
|
||||
if !f(r.ring) {
|
||||
if r.ring.Value != nil && !f(r.ring.Value.(internalRingItem).Value) {
|
||||
return
|
||||
}
|
||||
for p := r.ring.Prev(); p != r.ring; p = p.Prev() {
|
||||
if !f(p) {
|
||||
if p.Value == nil || !f(p.Value.(internalRingItem).Value) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
289
container/gring/gring_z_example_test.go
Normal file
289
container/gring/gring_z_example_test.go
Normal file
@ -0,0 +1,289 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package gring_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/gogf/gf/v2/container/gring"
|
||||
)
|
||||
|
||||
func ExampleNew() {
|
||||
// Non concurrent safety
|
||||
gring.New(10)
|
||||
|
||||
// Concurrent safety
|
||||
gring.New(10, true)
|
||||
|
||||
// Output:
|
||||
}
|
||||
|
||||
func ExampleRing_Val() {
|
||||
r := gring.New(10)
|
||||
r.Set(1)
|
||||
fmt.Println("Val:", r.Val())
|
||||
|
||||
r.Next().Set("GoFrame")
|
||||
fmt.Println("Val:", r.Val())
|
||||
|
||||
// Output:
|
||||
// Val: 1
|
||||
// Val: GoFrame
|
||||
}
|
||||
|
||||
func ExampleRing_Len() {
|
||||
r1 := gring.New(10)
|
||||
for i := 0; i < 5; i++ {
|
||||
r1.Set(i).Next()
|
||||
}
|
||||
fmt.Println("Len:", r1.Len())
|
||||
|
||||
r2 := gring.New(10, true)
|
||||
for i := 0; i < 10; i++ {
|
||||
r2.Set(i).Next()
|
||||
}
|
||||
fmt.Println("Len:", r2.Len())
|
||||
|
||||
// Output:
|
||||
// Len: 5
|
||||
// Len: 10
|
||||
}
|
||||
|
||||
func ExampleRing_Cap() {
|
||||
r1 := gring.New(10)
|
||||
for i := 0; i < 5; i++ {
|
||||
r1.Set(i).Next()
|
||||
}
|
||||
fmt.Println("Cap:", r1.Cap())
|
||||
|
||||
r2 := gring.New(10, true)
|
||||
for i := 0; i < 10; i++ {
|
||||
r2.Set(i).Next()
|
||||
}
|
||||
fmt.Println("Cap:", r2.Cap())
|
||||
|
||||
// Output:
|
||||
// Cap: 10
|
||||
// Cap: 10
|
||||
}
|
||||
|
||||
func ExampleRing_Set() {
|
||||
r := gring.New(10)
|
||||
r.Set(1)
|
||||
fmt.Println("Val:", r.Val())
|
||||
|
||||
r.Next().Set("GoFrame")
|
||||
fmt.Println("Val:", r.Val())
|
||||
|
||||
// Output:
|
||||
// Val: 1
|
||||
// Val: GoFrame
|
||||
}
|
||||
|
||||
func ExampleRing_Put() {
|
||||
r := gring.New(10)
|
||||
r.Put(1)
|
||||
fmt.Println("Val:", r.Val())
|
||||
fmt.Println("Val:", r.Prev().Val())
|
||||
|
||||
// Output:
|
||||
// Val: <nil>
|
||||
// Val: 1
|
||||
}
|
||||
|
||||
func ExampleRing_Move() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
// ring at Pos 0
|
||||
fmt.Println("CurVal:", r.Val())
|
||||
|
||||
r.Move(5)
|
||||
|
||||
// ring at Pos 5
|
||||
fmt.Println("CurVal:", r.Val())
|
||||
|
||||
// Output:
|
||||
// CurVal: 0
|
||||
// CurVal: 5
|
||||
}
|
||||
|
||||
func ExampleRing_Prev() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 5; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
fmt.Println("Prev:", r.Prev().Val())
|
||||
fmt.Println("Prev:", r.Prev().Val())
|
||||
|
||||
// Output:
|
||||
// Prev: 4
|
||||
// Prev: 3
|
||||
}
|
||||
|
||||
func ExampleRing_Next() {
|
||||
r := gring.New(10)
|
||||
for i := 5; i > 0; i-- {
|
||||
r.Set(i).Prev()
|
||||
}
|
||||
|
||||
fmt.Println("Prev:", r.Next().Val())
|
||||
fmt.Println("Prev:", r.Next().Val())
|
||||
|
||||
// Output:
|
||||
// Prev: 1
|
||||
// Prev: 2
|
||||
}
|
||||
|
||||
func ExampleRing_Link_Common() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 5; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
s := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
val := i + 5
|
||||
s.Set(val).Next()
|
||||
}
|
||||
|
||||
r.Link(s) // Link Ring s to Ring r
|
||||
|
||||
fmt.Println("Len:", r.Len())
|
||||
fmt.Println("Cap:", r.Cap())
|
||||
fmt.Println(r.SlicePrev())
|
||||
fmt.Println(r.SliceNext())
|
||||
|
||||
// Output:
|
||||
// Len: 15
|
||||
// Cap: 20
|
||||
// [4 3 2 1 0]
|
||||
// [5 6 7 8 9 10 11 12 13 14]
|
||||
}
|
||||
|
||||
func ExampleRing_Link_SameRing() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 5; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
same_r := r.Link(r.Prev())
|
||||
|
||||
fmt.Println("Len:", same_r.Len())
|
||||
fmt.Println("Cap:", same_r.Cap())
|
||||
fmt.Println(same_r.SlicePrev())
|
||||
fmt.Println(same_r.SliceNext())
|
||||
|
||||
// Output:
|
||||
// Len: 1
|
||||
// Cap: 1
|
||||
// [4]
|
||||
// [4]
|
||||
}
|
||||
|
||||
func ExampleRing_Unlink() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
fmt.Println("Before Unlink, Len:", r.Len())
|
||||
fmt.Println("Before Unlink, Cap:", r.Cap())
|
||||
fmt.Println("Before Unlink, ", r.SlicePrev())
|
||||
fmt.Println("Before Unlink, ", r.SliceNext())
|
||||
|
||||
r.Unlink(7)
|
||||
|
||||
fmt.Println("After Unlink, Len:", r.Len())
|
||||
fmt.Println("After Unlink, Cap:", r.Cap())
|
||||
fmt.Println("After Unlink, ", r.SlicePrev())
|
||||
fmt.Println("After Unlink, ", r.SliceNext())
|
||||
|
||||
// Output:
|
||||
// Before Unlink, Len: 10
|
||||
// Before Unlink, Cap: 10
|
||||
// Before Unlink, [0 9 8 7 6 5 4 3 2 1]
|
||||
// Before Unlink, [0 1 2 3 4 5 6 7 8 9]
|
||||
// After Unlink, Len: 7
|
||||
// After Unlink, Cap: 7
|
||||
// After Unlink, [1 7 6 5 4 3 2]
|
||||
// After Unlink, [1 2 3 4 5 6 7]
|
||||
}
|
||||
|
||||
func ExampleRing_RLockIteratorNext() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
r.RLockIteratorNext(func(value interface{}) bool {
|
||||
if value.(int) < 5 {
|
||||
fmt.Println("IteratorNext Success, Value:", value)
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
// Output:
|
||||
// IteratorNext Success, Value: 0
|
||||
// IteratorNext Success, Value: 1
|
||||
// IteratorNext Success, Value: 2
|
||||
// IteratorNext Success, Value: 3
|
||||
// IteratorNext Success, Value: 4
|
||||
}
|
||||
|
||||
func ExampleRing_RLockIteratorPrev() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
// move r to pos 9
|
||||
r.Prev()
|
||||
|
||||
r.RLockIteratorPrev(func(value interface{}) bool {
|
||||
if value.(int) >= 5 {
|
||||
fmt.Println("IteratorPrev Success, Value:", value)
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
// Output:
|
||||
// IteratorPrev Success, Value: 9
|
||||
// IteratorPrev Success, Value: 8
|
||||
// IteratorPrev Success, Value: 7
|
||||
// IteratorPrev Success, Value: 6
|
||||
// IteratorPrev Success, Value: 5
|
||||
}
|
||||
|
||||
func ExampleRing_SliceNext() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
fmt.Println(r.SliceNext())
|
||||
|
||||
// Output:
|
||||
// [0 1 2 3 4 5 6 7 8 9]
|
||||
}
|
||||
|
||||
func ExampleRing_SlicePrev() {
|
||||
r := gring.New(10)
|
||||
for i := 0; i < 10; i++ {
|
||||
r.Set(i).Next()
|
||||
}
|
||||
|
||||
fmt.Println(r.SlicePrev())
|
||||
|
||||
// Output:
|
||||
// [0 9 8 7 6 5 4 3 2 1]
|
||||
}
|
||||
Reference in New Issue
Block a user