github.com/sagernet/sing@v0.2.6/common/atomic/typed.go (about) 1 package atomic 2 3 import ( 4 "sync/atomic" 5 6 "github.com/sagernet/sing/common" 7 ) 8 9 type TypedValue[T any] struct { 10 value atomic.Value 11 } 12 13 func (t *TypedValue[T]) Load() T { 14 value := t.value.Load() 15 if value == nil { 16 return common.DefaultValue[T]() 17 } 18 return value.(T) 19 } 20 21 func (t *TypedValue[T]) Store(value T) { 22 t.value.Store(value) 23 } 24 25 func (t *TypedValue[T]) Swap(new T) T { 26 old := t.value.Swap(new) 27 if old == nil { 28 return common.DefaultValue[T]() 29 } 30 return old.(T) 31 } 32 33 func (t *TypedValue[T]) CompareAndSwap(old, new T) bool { 34 return t.value.CompareAndSwap(old, new) 35 }