@@ -3,13 +3,15 @@ package xsync
33import (
44 "fmt"
55 "sync"
6+ "sync/atomic"
67)
78
89type Map [K comparable , V any ] struct {
9- m sync.Map
10+ m sync.Map
11+ size atomic.Int32
1012}
1113
12- func (m * Map [K , V ]) Load (key K ) (value V , ok bool ) {
14+ func (m * Map [K , V ]) Get (key K ) (value V , ok bool ) {
1315 v , ok := m .m .Load (key )
1416 if ! ok {
1517 return value , false
@@ -38,22 +40,36 @@ func (m *Map[K, V]) Has(key K) bool {
3840 return ok
3941}
4042
41- func (m * Map [K , V ]) Store (key K , value V ) {
42- m .m .Store (key , value )
43+ func (m * Map [K , V ]) Set (key K , value V ) {
44+ _ , exists := m .m .LoadOrStore (key , value )
45+
46+ if ! exists {
47+ m .size .Add (1 )
48+ }
4349}
4450
45- func (m * Map [K , V ]) Delete (key K ) ( ok bool ) {
46- _ , ok = m .LoadAndDelete (key )
51+ func (m * Map [K , V ]) Delete (key K ) bool {
52+ _ , exists : = m .Extract (key )
4753
48- return ok
54+ if ! exists {
55+ m .size .Add (- 1 )
56+ }
57+
58+ return exists
4959}
5060
51- func (m * Map [K , V ]) LoadAndDelete (key K ) (value V , ok bool ) {
52- v , ok := m .m .LoadAndDelete (key )
53- if ! ok {
61+ func (m * Map [K , V ]) Size () int {
62+ return int (m .size .Load ())
63+ }
64+
65+ func (m * Map [K , V ]) Extract (key K ) (value V , ok bool ) {
66+ v , exists := m .m .LoadAndDelete (key )
67+ if ! exists {
5468 return value , false
5569 }
5670
71+ m .size .Add (- 1 )
72+
5773 value , ok = v .(V )
5874
5975 return value , ok
@@ -65,10 +81,16 @@ func (m *Map[K, V]) Range(f func(key K, value V) bool) {
6581 })
6682}
6783
68- func (m * Map [K , V ]) Clear () {
84+ func (m * Map [K , V ]) Clear () ( removed int ) {
6985 m .m .Range (func (k , v any ) bool {
86+ removed ++
87+
7088 m .m .Delete (k )
7189
7290 return true
7391 })
92+
93+ m .size .Add (int32 (- removed ))
94+
95+ return removed
7496}
0 commit comments