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  }