|
@@ -8,9 +8,12 @@ import (
|
|
|
type Map[K comparable, V any] struct {
|
|
|
len int32
|
|
|
store sync.Map
|
|
|
+ mu sync.RWMutex
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) Load(key K) (value V, ok bool) {
|
|
|
+ m.mu.RLock()
|
|
|
+ defer m.mu.RUnlock()
|
|
|
v, ok := m.store.Load(key)
|
|
|
if !ok {
|
|
|
return
|
|
@@ -21,12 +24,25 @@ func (m *Map[K, V]) Load(key K) (value V, ok bool) {
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) Store(key K, value V) {
|
|
|
- atomic.AddInt32(&m.len, 1)
|
|
|
+ m.mu.Lock()
|
|
|
+ defer m.mu.Unlock()
|
|
|
+ // If the key already exists, we don't want to increment the length
|
|
|
+ _, loaded := m.store.Load(key)
|
|
|
+ if !loaded {
|
|
|
+ atomic.AddInt32(&m.len, 1)
|
|
|
+ }
|
|
|
m.store.Store(key, value)
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) Delete(key K) {
|
|
|
- atomic.AddInt32(&m.len, -1)
|
|
|
+ m.mu.Lock()
|
|
|
+ defer m.mu.Unlock()
|
|
|
+ _, loaded := m.store.Load(key)
|
|
|
+ // If the key exists, we want to decrement the length
|
|
|
+ // If the key does not exist, we don't want to decrement the length
|
|
|
+ if loaded {
|
|
|
+ atomic.AddInt32(&m.len, -1)
|
|
|
+ }
|
|
|
m.store.Delete(key)
|
|
|
}
|
|
|
|
|
@@ -37,6 +53,9 @@ func (m *Map[K, V]) Range(f func(key K, value V) bool) {
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
|
|
|
+ m.mu.Lock()
|
|
|
+ defer m.mu.Unlock()
|
|
|
+
|
|
|
v, loaded := m.store.LoadOrStore(key, value)
|
|
|
actual = v.(V)
|
|
|
if !loaded {
|
|
@@ -46,6 +65,9 @@ func (m *Map[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) LoadAndDelete(key K) (value V, loaded bool) {
|
|
|
+ m.mu.Lock()
|
|
|
+ defer m.mu.Unlock()
|
|
|
+
|
|
|
v, loaded := m.store.LoadAndDelete(key)
|
|
|
value = v.(V)
|
|
|
if loaded {
|
|
@@ -55,12 +77,18 @@ func (m *Map[K, V]) LoadAndDelete(key K) (value V, loaded bool) {
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) Swap(key K, value V) (actual V, swapped bool) {
|
|
|
+ m.mu.Lock()
|
|
|
+ defer m.mu.Unlock()
|
|
|
+
|
|
|
v, swapped := m.store.Swap(key, value)
|
|
|
actual = v.(V)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
func (m *Map[K, V]) Clear() {
|
|
|
+ m.mu.Lock()
|
|
|
+ defer m.mu.Unlock()
|
|
|
+ // Clear the map
|
|
|
m.store.Range(func(key, value interface{}) bool {
|
|
|
m.store.Delete(key)
|
|
|
return true
|