github.com/lingyao2333/mo-zero@v1.4.1/core/syncx/atomicfloat64.go (about) 1 package syncx 2 3 import ( 4 "math" 5 "sync/atomic" 6 ) 7 8 // An AtomicFloat64 is an implementation of atomic float64. 9 type AtomicFloat64 uint64 10 11 // NewAtomicFloat64 returns an AtomicFloat64. 12 func NewAtomicFloat64() *AtomicFloat64 { 13 return new(AtomicFloat64) 14 } 15 16 // ForAtomicFloat64 returns an AtomicFloat64 with given val. 17 func ForAtomicFloat64(val float64) *AtomicFloat64 { 18 f := NewAtomicFloat64() 19 f.Set(val) 20 return f 21 } 22 23 // Add adds val to current value. 24 func (f *AtomicFloat64) Add(val float64) float64 { 25 for { 26 old := f.Load() 27 nv := old + val 28 if f.CompareAndSwap(old, nv) { 29 return nv 30 } 31 } 32 } 33 34 // CompareAndSwap compares current value with old, if equals, set the value to val. 35 func (f *AtomicFloat64) CompareAndSwap(old, val float64) bool { 36 return atomic.CompareAndSwapUint64((*uint64)(f), math.Float64bits(old), math.Float64bits(val)) 37 } 38 39 // Load loads the current value. 40 func (f *AtomicFloat64) Load() float64 { 41 return math.Float64frombits(atomic.LoadUint64((*uint64)(f))) 42 } 43 44 // Set sets the current value to val. 45 func (f *AtomicFloat64) Set(val float64) { 46 atomic.StoreUint64((*uint64)(f), math.Float64bits(val)) 47 }