github.com/sagernet/sing-box@v1.2.7/experimental/clashapi/compatible/map.go (about) 1 package compatible 2 3 import "sync" 4 5 // Map is a generics sync.Map 6 type Map[K comparable, V any] struct { 7 m sync.Map 8 } 9 10 func (m *Map[K, V]) Load(key K) (V, bool) { 11 v, ok := m.m.Load(key) 12 if !ok { 13 return *new(V), false 14 } 15 16 return v.(V), ok 17 } 18 19 func (m *Map[K, V]) Store(key K, value V) { 20 m.m.Store(key, value) 21 } 22 23 func (m *Map[K, V]) Delete(key K) { 24 m.m.Delete(key) 25 } 26 27 func (m *Map[K, V]) Range(f func(key K, value V) bool) { 28 m.m.Range(func(key, value any) bool { 29 return f(key.(K), value.(V)) 30 }) 31 } 32 33 func (m *Map[K, V]) LoadOrStore(key K, value V) (V, bool) { 34 v, ok := m.m.LoadOrStore(key, value) 35 return v.(V), ok 36 } 37 38 func (m *Map[K, V]) LoadAndDelete(key K) (V, bool) { 39 v, ok := m.m.LoadAndDelete(key) 40 if !ok { 41 return *new(V), false 42 } 43 44 return v.(V), ok 45 } 46 47 func New[K comparable, V any]() *Map[K, V] { 48 return &Map[K, V]{m: sync.Map{}} 49 }