sync.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package mapping
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. )
  6. type Map[K comparable, V any] struct {
  7. len int32
  8. store sync.Map
  9. }
  10. func (m *Map[K, V]) Load(key K) (value V, ok bool) {
  11. v, ok := m.store.Load(key)
  12. if !ok {
  13. return
  14. }
  15. value, ok = v.(V)
  16. return
  17. }
  18. func (m *Map[K, V]) Store(key K, value V) {
  19. atomic.AddInt32(&m.len, 1)
  20. m.store.Store(key, value)
  21. }
  22. func (m *Map[K, V]) Delete(key K) {
  23. atomic.AddInt32(&m.len, -1)
  24. m.store.Delete(key)
  25. }
  26. func (m *Map[K, V]) Range(f func(key K, value V) bool) {
  27. m.store.Range(func(key, value interface{}) bool {
  28. return f(key.(K), value.(V))
  29. })
  30. }
  31. func (m *Map[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
  32. v, loaded := m.store.LoadOrStore(key, value)
  33. actual = v.(V)
  34. if !loaded {
  35. atomic.AddInt32(&m.len, 1)
  36. }
  37. return
  38. }
  39. func (m *Map[K, V]) LoadAndDelete(key K) (value V, loaded bool) {
  40. v, loaded := m.store.LoadAndDelete(key)
  41. value = v.(V)
  42. if loaded {
  43. atomic.AddInt32(&m.len, -1)
  44. }
  45. return
  46. }
  47. func (m *Map[K, V]) Swap(key K, value V) (actual V, swapped bool) {
  48. v, swapped := m.store.Swap(key, value)
  49. actual = v.(V)
  50. return
  51. }
  52. func (m *Map[K, V]) Clear() {
  53. m.store.Range(func(key, value interface{}) bool {
  54. m.store.Delete(key)
  55. return true
  56. })
  57. atomic.StoreInt32(&m.len, 0)
  58. }
  59. func (m *Map[K, V]) Len() int {
  60. return int(atomic.LoadInt32(&m.len))
  61. }
  62. func (m *Map[K, V]) Exits(key K) bool {
  63. _, ok := m.Load(key)
  64. return ok
  65. }