gring

package
v0.9.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 26, 2023 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

Package gring provides a concurrent-safe/unsafe ring(circular lists).

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Ring

type Ring[T any] struct {
	// contains filtered or unexported fields
}

Ring is a struct of ring structure.

func New

func New[T any](cap int, safe ...bool) *Ring[T]

New creates and returns a Ring structure of `cap` elements. The optional parameter `safe` specifies whether using this structure in concurrent safety, which is false in default.

Example
package main

import (
	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	// Non concurrent safety
	gring.New[int](10)

	// Concurrent safety
	gring.New[int](10, true)

}
Output:

func (*Ring[T]) Cap

func (r *Ring[T]) Cap() int

Cap returns the capacity of ring.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r1 := gring.New[int](10)
	for i := 0; i < 5; i++ {
		r1.Set(i).Next()
	}
	fmt.Println("Cap:", r1.Cap())

	r2 := gring.New[int](10, true)
	for i := 0; i < 10; i++ {
		r2.Set(i).Next()
	}
	fmt.Println("Cap:", r2.Cap())

}
Output:

Cap: 10
Cap: 10

func (*Ring[T]) Len

func (r *Ring[T]) Len() int

Len returns the size of ring.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r1 := gring.New[int](10)
	for i := 0; i < 5; i++ {
		r1.Set(i).Next()
	}
	fmt.Println("Len:", r1.Len())

	r2 := gring.New[int](10, true)
	for i := 0; i < 10; i++ {
		r2.Set(i).Next()
	}
	fmt.Println("Len:", r2.Len())

}
Output:

Len: 5
Len: 10
func (r *Ring[T]) Link(s *Ring[T]) *Ring[T]

Link connects ring r with ring s such that r.Next() becomes s and returns the original value for r.Next(). r must not be empty.

If r and s point to the same ring, linking them removes the elements between r and s from the ring. The removed elements form a sub-ring and the result is a reference to that sub-ring (if no elements were removed, the result is still the original value for r.Next(), and not nil).

If r and s point to different rings, linking them creates a single ring with the elements of s inserted after r. The result points to the element following the last element of s after insertion.

func (*Ring[T]) Move

func (r *Ring[T]) Move(n int) *Ring[T]

Move moves n % r.Len() elements backward (n < 0) or forward (n >= 0) in the ring and returns that ring element. r must not be empty.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](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 (*Ring[T]) Next

func (r *Ring[T]) Next() *Ring[T]

Next returns the next ring element. r must not be empty.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](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 (*Ring[T]) Prev

func (r *Ring[T]) Prev() *Ring[T]

Prev returns the previous ring element. r must not be empty.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](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 (*Ring[T]) Put

func (r *Ring[T]) Put(value T) *Ring[T]

Put sets `value` to current item of ring and moves position to next item.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](10)
	r.Put(1)
	fmt.Println("Val:", r.Val())
	fmt.Println("Val:", r.Prev().Val())

}
Output:

Val: 0
Val: 1

func (*Ring[T]) RLockIteratorNext

func (r *Ring[T]) RLockIteratorNext(f func(value T) bool)

RLockIteratorNext iterates and locks reading forward with given callback function `f` within RWMutex.RLock. If `f` returns true, then it continues iterating; or false to stop.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](10)
	for i := 0; i < 10; i++ {
		r.Set(i).Next()
	}

	r.RLockIteratorNext(func(value int) bool {
		if value < 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 (*Ring[T]) RLockIteratorPrev

func (r *Ring[T]) RLockIteratorPrev(f func(value T) bool)

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.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](10)
	for i := 0; i < 10; i++ {
		r.Set(i).Next()
	}

	// move r to pos 9
	r.Prev()

	r.RLockIteratorPrev(func(value int) bool {
		if value >= 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 (*Ring[T]) Set

func (r *Ring[T]) Set(value T) *Ring[T]

Set sets value to the item of current position.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[string](10)
	r.Set("1")
	fmt.Println("Val:", r.Val())

	r.Next().Set("GoFrame")
	fmt.Println("Val:", r.Val())

}
Output:

Val: 1
Val: GoFrame

func (*Ring[T]) SliceNext

func (r *Ring[T]) SliceNext() []T

SliceNext returns a copy of all item values as slice forward from current position.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](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 (*Ring[T]) SlicePrev

func (r *Ring[T]) SlicePrev() []T

SlicePrev returns a copy of all item values as slice backward from current position.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[int](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]
func (r *Ring[T]) Unlink(n int) *Ring[T]

Unlink removes n % r.Len() elements from the ring r, starting at r.Next(). If n % r.Len() == 0, r remains unchanged. The result is the removed sub-ring. r must not be empty.

func (*Ring[T]) Val

func (r *Ring[T]) Val() T

Val returns the item's value of current position.

Example
package main

import (
	"fmt"

	"github.com/wesleywu/gcontainer/gring"
)

func main() {
	r := gring.New[string](10)
	r.Set("1")
	fmt.Println("Val:", r.Val())

	r.Next().Set("GoFrame")
	fmt.Println("Val:", r.Val())

}
Output:

Val: 1
Val: GoFrame

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL