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  }