Skip to content

Commit 7e01c0c

Browse files
authored
Merge pull request #695 from devlights:add-generic-ring
Add Generic *ring.Ring[T] example
2 parents b7297fe + e0e4b91 commit 7e01c0c

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed

examples/basic/containers/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ func NewRegister() mapping.Register {
1414
// Regist -- 登録します.
1515
func (r *register) Regist(m mapping.ExampleMapping) {
1616
m["containers_ring"] = RingBuffer
17+
m["containers_generic_ring"] = GenericRing
1718
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Package ring は、container/ring/Ring をジェネリックにしたものが配置されています。
2+
package ring
3+
4+
import "container/ring"
5+
6+
// Ring[T] は、container/ring/Ring のジェネリック版です.
7+
//
8+
// 標準の *ring.Ring と異なり、値の設定は SetValue() で行います。
9+
type Ring[T any] struct {
10+
r *ring.Ring // 実際の *ring.Ring
11+
v T // 値
12+
}
13+
14+
// New は、新しい *Ring[T] を指定した容量で作成します。
15+
func New[T any](n int) *Ring[T] {
16+
var v T
17+
return &Ring[T]{ring.New(n), v}
18+
}
19+
20+
// SetValue は、値を設定します。
21+
func (me *Ring[T]) SetValue(v T) {
22+
me.v = v
23+
me.r.Value = v
24+
}
25+
26+
// Do は、標準ライブラリの container/ring/Ring.Do と同じ動きをします。
27+
//
28+
// # REFERENCES
29+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Do
30+
func (me *Ring[T]) Do(f func(T)) {
31+
fn := func(v any) {
32+
f(v.(T))
33+
}
34+
me.r.Do(fn)
35+
}
36+
37+
// Len は、標準ライブラリの container/ring/Ring.Len と同じ動きをします。
38+
//
39+
// # REFERENCES
40+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Len
41+
func (me *Ring[T]) Len() int {
42+
return me.r.Len()
43+
}
44+
45+
// Link は、標準ライブラリの container/ring/Ring.Link と同じ動きをします。
46+
//
47+
// # REFERENCES
48+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Link
49+
func (me *Ring[T]) Link(s *Ring[T]) *Ring[T] {
50+
return &Ring[T]{me.r.Link(s.r), me.v}
51+
}
52+
53+
// Move は、標準ライブラリの container/ring/Ring.Move と同じ動きをします。
54+
//
55+
// # REFERENCES
56+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Move
57+
func (me *Ring[T]) Move(n int) *Ring[T] {
58+
return &Ring[T]{me.r.Move(n), me.v}
59+
}
60+
61+
// Next は、標準ライブラリの container/ring/Ring.Next と同じ動きをします。
62+
//
63+
// # REFERENCES
64+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Next
65+
func (me *Ring[T]) Next() *Ring[T] {
66+
return &Ring[T]{me.r.Next(), me.v}
67+
}
68+
69+
// Prev は、標準ライブラリの container/ring/Ring.Prev と同じ動きをします。
70+
//
71+
// # REFERENCES
72+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Prev
73+
func (me *Ring[T]) Prev() *Ring[T] {
74+
return &Ring[T]{me.r.Prev(), me.v}
75+
}
76+
77+
// Unlink は、標準ライブラリの container/ring/Ring.Unlink と同じ動きをします。
78+
//
79+
// # REFERENCES
80+
// - https://pkg.go.dev/container/ring@go1.21.4#Ring.Unlink
81+
func (me *Ring[T]) Unlink(n int) *Ring[T] {
82+
return &Ring[T]{me.r.Unlink(n), me.v}
83+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package containers
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/devlights/try-golang/examples/basic/containers/generic/ring"
7+
8+
"github.com/devlights/gomy/output"
9+
)
10+
11+
// GenericRing は、container/ring/Ring をジェネリックにしたもののサンプルです.
12+
//
13+
// # REFERENCES
14+
// - https://pkg.go.dev/container/ring@go1.21.4
15+
func GenericRing() error {
16+
var (
17+
r = ring.New[string](5)
18+
n = r.Len()
19+
)
20+
21+
// 値を設定(1)
22+
for i := 0; i < n; i++ {
23+
r.SetValue(fmt.Sprintf("helloworld-%d", i))
24+
r = r.Next()
25+
}
26+
27+
// 現在のリングを出力
28+
r.Do(func(v string) {
29+
output.Stdoutl("[v]", v)
30+
})
31+
output.StdoutHr()
32+
33+
// 再度値を設定(2)
34+
for i := 0; i < n; i++ {
35+
r.SetValue(fmt.Sprintf("helloworld-%d", i+100))
36+
r = r.Next()
37+
}
38+
39+
// 現在のリングを出力
40+
r.Do(func(v string) {
41+
output.Stdoutl("[v]", v)
42+
})
43+
output.StdoutHr()
44+
45+
// 飛び飛びで設定(3)
46+
r.SetValue("helloworld-997")
47+
r = r.Next()
48+
r = r.Next()
49+
r.SetValue("helloworld-998")
50+
r = r.Next()
51+
r.SetValue("helloworld-999")
52+
53+
// 現在のリングを出力
54+
r.Do(func(v string) {
55+
output.Stdoutl("[v]", v)
56+
})
57+
58+
return nil
59+
60+
/*
61+
$ task
62+
task: [build] go build .
63+
task: [run] ./try-golang -onetime
64+
65+
ENTER EXAMPLE NAME: containers_generic_ring
66+
67+
[Name] "containers_generic_ring"
68+
[v] helloworld-0
69+
[v] helloworld-1
70+
[v] helloworld-2
71+
[v] helloworld-3
72+
[v] helloworld-4
73+
[v] helloworld-999
74+
[v] helloworld-104
75+
[v] helloworld-998
76+
[v] helloworld-101
77+
[v] helloworld-102
78+
79+
80+
[Elapsed] 156.91µs
81+
*/
82+
83+
}

0 commit comments

Comments
 (0)