diff --git a/sync/atomic/generic.go b/sync/atomic/generic.go new file mode 100644 index 0000000..1b51315 --- /dev/null +++ b/sync/atomic/generic.go @@ -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) + } +}