Files
engine/util/map.go

93 lines
1.3 KiB
Go

package util
import "sync"
type Map[K comparable, V any] struct {
sync.RWMutex
Map map[K]V
}
func (m *Map[K, V]) Init() {
m.Map = make(map[K]V)
}
func (m *Map[K, V]) Add(k K, v V) bool {
m.Lock()
defer m.Unlock()
if _, ok := m.Map[k]; ok {
return false
}
m.Map[k] = v
return true
}
func (m *Map[K, V]) Set(k K, v V) {
m.Lock()
m.Map[k] = v
m.Unlock()
}
func (m *Map[K, V]) Has(k K) (ok bool) {
m.RLock()
defer m.RUnlock()
_, ok = m.Map[k]
return
}
func (m *Map[K, V]) Len() int {
return len(m.Map)
}
func (m *Map[K, V]) Get(k K) V {
m.RLock()
defer m.RUnlock()
return m.Map[k]
}
func (m *Map[K, V]) Delete(k K) (v V, ok bool) {
m.RLock()
v, ok = m.Map[k]
m.RUnlock()
if ok {
m.Lock()
delete(m.Map, k)
m.Unlock()
}
return
}
func (m *Map[K, V]) ToList() (r []V) {
m.RLock()
defer m.RUnlock()
for _, s := range m.Map {
r = append(r, s)
}
return
}
func MapList[K comparable, V any, R any](m *Map[K, V], f func(K, V) R) (r []R) {
m.RLock()
defer m.RUnlock()
for k, v := range m.Map {
r = append(r, f(k, v))
}
return
}
func (m *Map[K, V]) Range(f func(K, V)) {
m.RLock()
defer m.RUnlock()
for k, v := range m.Map {
f(k, v)
}
}
//遍历时有写入操作
func (m *Map[K, V]) ModifyRange(f func(K, V)) {
m.Lock()
defer m.Unlock()
for k, v := range m.Map {
f(k, v)
}
}