Skip to content

Commit bb1fee1

Browse files
authored
Merge pull request #1357 from ydb-platform/xsync-set
added `internal/xsync.Map.Delete` + `internal/xsync.Set`
2 parents b7c2eb5 + 9dbe4c4 commit bb1fee1

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

internal/xsync/map.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ func (m *Map[K, V]) Store(key K, value V) {
4242
m.m.Store(key, value)
4343
}
4444

45+
func (m *Map[K, V]) Delete(key K) (ok bool) {
46+
_, ok = m.LoadAndDelete(key)
47+
48+
return ok
49+
}
50+
4551
func (m *Map[K, V]) LoadAndDelete(key K) (value V, ok bool) {
4652
v, ok := m.m.LoadAndDelete(key)
4753
if !ok {

internal/xsync/set.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package xsync
2+
3+
import (
4+
"sync"
5+
)
6+
7+
type Set[K comparable] struct {
8+
m sync.Map
9+
}
10+
11+
func (m *Set[K]) Has(key K) bool {
12+
_, ok := m.m.Load(key)
13+
14+
return ok
15+
}
16+
17+
func (m *Set[K]) Add(key K) bool {
18+
_, loaded := m.m.LoadOrStore(key, struct{}{})
19+
20+
return !loaded
21+
}
22+
23+
func (m *Set[K]) Remove(key K) (ok bool) {
24+
_, ok = m.m.LoadAndDelete(key)
25+
26+
return ok
27+
}
28+
29+
func (m *Set[K]) Clear() (removed int) {
30+
m.m.Range(func(k, v any) bool {
31+
removed++
32+
33+
m.m.Delete(k)
34+
35+
return true
36+
})
37+
38+
return removed
39+
}

internal/xsync/set_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package xsync
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
)
8+
9+
func TestSet(t *testing.T) {
10+
var s Set[int]
11+
require.False(t, s.Has(1))
12+
require.True(t, s.Add(1))
13+
require.False(t, s.Add(1))
14+
require.True(t, s.Has(1))
15+
require.True(t, s.Add(2))
16+
require.True(t, s.Remove(1))
17+
require.False(t, s.Has(1))
18+
require.Equal(t, 1, s.Clear())
19+
}

0 commit comments

Comments
 (0)