Add generic atomic value

This commit is contained in:
Sasha Koshka 2025-05-09 10:08:54 -04:00
parent c4e2a0f641
commit afcc57aa70

38
sync/atomic/generic.go Normal file
View File

@ -0,0 +1,38 @@
package uatomic
import "sync/atomic"
// Atom is a generic wrapper for atomic.Value.
type Atom[T comparable] struct {
value atomic.Value
}
type atomWrapper[T comparable] struct { value T }
// CompareAndSwap executes the compare-and-swap operation for the Atom.
func (atom *Atom[T]) CompareAndSwap(old, neww T) (swapped bool) {
return atom.value.CompareAndSwap(
atomWrapper[T] { value: old },
atomWrapper[T] { value: neww })
}
func (atom *Atom[T]) Load() T {
return castSafe[T](atom.value.Load)
}
func (atom *Atom[T]) Store(val T) {
atom.value.Store(val)
}
func (atom *Atom[T]) Swap(neww T) T {
return castSafe[T](atom.value.Swap(neww))
}
func castSafe[T comparable](value any) T {
var zero T
if value == nil {
return zero
} else {
return value.(T)
}
}