From c072eac417644d6728fed075d3810fbb92f1f02c Mon Sep 17 00:00:00 2001 From: Yavolte Date: Mon, 11 Aug 2025 11:38:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AF=B9=E6=B3=9B=E5=9E=8BMA?= =?UTF-8?q?P=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/maps/generic.go | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pkg/maps/generic.go diff --git a/pkg/maps/generic.go b/pkg/maps/generic.go new file mode 100644 index 0000000..7d67b95 --- /dev/null +++ b/pkg/maps/generic.go @@ -0,0 +1,57 @@ +package maps + +import "sync" + +type GenericMap[K comparable, V any] struct { + m sync.Map +} + +func (gm *GenericMap[K, V]) Store(key K, value V) { + gm.m.Store(key, value) +} + +func (gm *GenericMap[K, V]) Load(key K) (V, bool) { + value, ok := gm.m.Load(key) + if !ok { + var zero V + return zero, false + } + return value.(V), true +} + +func (gm *GenericMap[K, V]) Delete(key K) { + gm.m.Delete(key) +} + +func (gm *GenericMap[K, V]) Range(f func(key K, value V) bool) { + gm.m.Range(func(key, value any) bool { + return f(key.(K), value.(V)) + }) +} + +func (gm *GenericMap[K, V]) Swap(key K, value V) (previous V, loaded bool) { + actual, swapped := gm.m.Swap(key, value) + return actual.(V), swapped +} + +func (gm *GenericMap[K, V]) LoadOrStore(key K, value V) (V, bool) { + actual, loaded := gm.m.LoadOrStore(key, value) + return actual.(V), loaded +} + +func (gm *GenericMap[K, V]) LoadAndDelete(key K) (value V, loaded bool) { + actual, loaded := gm.m.LoadAndDelete(key) + return actual.(V), loaded +} + +func (gm *GenericMap[K, V]) CompareAndSwap(key K, old V, new V) (swapped bool) { + return gm.m.CompareAndSwap(key, old, new) +} + +func (gm *GenericMap[K, V]) CompareAndDelete(key K, old V) (deleted bool) { + return gm.m.CompareAndDelete(key, old) +} + +func New[K comparable, V any]() *GenericMap[K, V] { + return &GenericMap[K, V]{m: sync.Map{}} +}