mirror of
https://github.com/tursom/GoCollections.git
synced 2025-03-20 06:10:08 +08:00
90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
/*
|
|
* Copyright (c) 2022 tursom. All rights reserved.
|
|
* Use of this source code is governed by a GPL-3
|
|
* license that can be found in the LICENSE file.
|
|
*/
|
|
|
|
package atomic
|
|
|
|
import (
|
|
"strconv"
|
|
"sync/atomic"
|
|
"unsafe"
|
|
|
|
"github.com/tursom/GoCollections/lang"
|
|
)
|
|
|
|
type Float64 float64
|
|
|
|
func (v *Float64) P() *float64 {
|
|
return (*float64)(v)
|
|
}
|
|
|
|
func (v *Float64) pint64() *int64 {
|
|
return (*int64)(unsafe.Pointer(v))
|
|
}
|
|
|
|
func (v *Float64) Load() (val float64) {
|
|
return intToFloat64(atomic.LoadInt64(v.pint64()))
|
|
}
|
|
|
|
func (v *Float64) Store(val float64) {
|
|
atomic.StoreInt64(v.pint64(), floatToInt64(val))
|
|
}
|
|
|
|
func (v *Float64) Swap(new float64) (old float64) {
|
|
i := atomic.SwapInt64(v.pint64(), floatToInt64(new))
|
|
return intToFloat64(i)
|
|
}
|
|
|
|
func (v *Float64) CompareAndSwap(old, new float64) (swapped bool) {
|
|
return atomic.CompareAndSwapInt64(v.pint64(), floatToInt64(old), floatToInt64(new))
|
|
}
|
|
|
|
func (v *Float64) Add(f float64) (new float64) {
|
|
old := v.Load()
|
|
new = old + f
|
|
for !v.CompareAndSwap(old, new) {
|
|
old = v.Load()
|
|
new = old + f
|
|
}
|
|
|
|
return new
|
|
}
|
|
|
|
func (v *Float64) String() string {
|
|
return strconv.FormatFloat(float64(*v), 'e', -1, 64)
|
|
}
|
|
|
|
func (v *Float64) AsObject() lang.Object {
|
|
return v
|
|
}
|
|
|
|
func (v *Float64) Equals(o lang.Object) bool {
|
|
return lang.EqualsFloat64(v, o)
|
|
}
|
|
|
|
func (v *Float64) HashCode() int32 {
|
|
return lang.Hash64(v)
|
|
}
|
|
|
|
func (v *Float64) ToInt64() lang.Int64 {
|
|
return lang.Int64(*v)
|
|
}
|
|
|
|
func (v *Float64) ToUInt64() lang.UInt64 {
|
|
return lang.UInt64(*v)
|
|
}
|
|
|
|
func (v *Float64) ToFloat64() lang.Float64 {
|
|
return lang.Float64(*v)
|
|
}
|
|
|
|
func floatToInt64(f float64) int64 {
|
|
return *(*int64)(unsafe.Pointer(&f))
|
|
}
|
|
|
|
func intToFloat64(f int64) float64 {
|
|
return *(*float64)(unsafe.Pointer(&f))
|
|
}
|