github.com/Mericusta/go-stp@v0.6.8/concurrcy_map.go (about) 1 package stp 2 3 import ( 4 "sync" 5 ) 6 7 type CMap[K comparable, V any] struct { 8 noCopy 9 rw sync.RWMutex 10 m map[K]V 11 } 12 13 func NewCMap[K comparable, V any]() *CMap[K, V] { 14 return &CMap[K, V]{ 15 rw: sync.RWMutex{}, 16 m: make(map[K]V), // TODO: capacity 17 } 18 } 19 20 func (cm *CMap[K, V]) Get(k K) (V, bool) { 21 cm.rw.RLock() 22 defer cm.rw.RUnlock() 23 v, has := cm.m[k] 24 return v, has 25 } 26 27 func (cm *CMap[K, V]) Save(k K, v V) (int, bool) { 28 cm.rw.Lock() 29 defer cm.rw.Unlock() 30 if _, has := cm.m[k]; has { 31 return 0, true 32 } 33 cm.m[k] = v 34 l := len(cm.m) 35 return l, false 36 } 37 38 func (cm *CMap[K, V]) Remove(k K) (V, int) { 39 cm.rw.Lock() 40 defer cm.rw.Unlock() 41 v := cm.m[k] 42 delete(cm.m, k) 43 l := len(cm.m) 44 return v, l 45 }