File tree 2 files changed +94
-0
lines changed
2 files changed +94
-0
lines changed Original file line number Diff line number Diff line change
1
+ package xsync
2
+
3
+ import (
4
+ "sync"
5
+ )
6
+
7
+ type Slice [T any ] struct {
8
+ m sync.RWMutex
9
+ s []T
10
+ }
11
+
12
+ func (s * Slice [T ]) Append (v T ) {
13
+ s .m .Lock ()
14
+ defer s .m .Unlock ()
15
+
16
+ s .s = append (s .s , v )
17
+ }
18
+
19
+ func (s * Slice [T ]) Size () int {
20
+ s .m .RLock ()
21
+ defer s .m .RUnlock ()
22
+
23
+ return len (s .s )
24
+ }
25
+
26
+ func (s * Slice [T ]) Range (f func (idx int , v T ) bool ) {
27
+ s .m .RLock ()
28
+ defer s .m .RUnlock ()
29
+
30
+ for idx , v := range s .s {
31
+ if ! f (idx , v ) {
32
+ break
33
+ }
34
+ }
35
+ }
36
+
37
+ func (s * Slice [T ]) Remove (idx int ) bool {
38
+ s .m .Lock ()
39
+ defer s .m .Unlock ()
40
+
41
+ if idx >= len (s .s ) {
42
+ return false
43
+ }
44
+
45
+ s .s = append (s .s [:idx ], s .s [idx + 1 :]... )
46
+
47
+ return true
48
+ }
49
+
50
+ func (s * Slice [T ]) Clear () (removed int ) {
51
+ s .m .Lock ()
52
+ defer s .m .Unlock ()
53
+
54
+ if s .s == nil {
55
+ return 0
56
+ }
57
+
58
+ l := len (s .s )
59
+ s .s = s .s [:0 ]
60
+
61
+ return l
62
+ }
Original file line number Diff line number Diff line change
1
+ package xsync
2
+
3
+ import (
4
+ "testing"
5
+
6
+ "github.com/stretchr/testify/require"
7
+ )
8
+
9
+ func TestSlice (t * testing.T ) {
10
+ var s Slice [int ]
11
+ require .Equal (t , 0 , s .Size ())
12
+ require .Equal (t , 0 , s .Clear ())
13
+ s .Append (1 )
14
+ require .Equal (t , 1 , s .Size ())
15
+ s .Range (func (idx int , v int ) bool {
16
+ require .Equal (t , 0 , idx )
17
+ require .Equal (t , 1 , v )
18
+
19
+ return true
20
+ })
21
+ require .False (t , s .Remove (1 ))
22
+ s .Append (2 )
23
+ var rangeFuncCounter int
24
+ s .Range (func (idx int , v int ) bool {
25
+ rangeFuncCounter ++
26
+
27
+ return false
28
+ })
29
+ require .Equal (t , 1 , rangeFuncCounter )
30
+ require .True (t , s .Remove (1 ))
31
+ require .Equal (t , 1 , s .Clear ())
32
+ }
You can’t perform that action at this time.
0 commit comments