github.com/tursom/GoCollections@v0.3.10/lang/atomic/Float64.go (about) 1 /* 2 * Copyright (c) 2022 tursom. All rights reserved. 3 * Use of this source code is governed by a GPL-3 4 * license that can be found in the LICENSE file. 5 */ 6 7 package atomic 8 9 import ( 10 "strconv" 11 "sync/atomic" 12 "unsafe" 13 14 "github.com/tursom/GoCollections/lang" 15 ) 16 17 type Float64 float64 18 19 func (v *Float64) P() *float64 { 20 return (*float64)(v) 21 } 22 23 func (v *Float64) pint64() *int64 { 24 return (*int64)(unsafe.Pointer(v)) 25 } 26 27 func (v *Float64) Load() (val float64) { 28 return intToFloat64(atomic.LoadInt64(v.pint64())) 29 } 30 31 func (v *Float64) Store(val float64) { 32 atomic.StoreInt64(v.pint64(), floatToInt64(val)) 33 } 34 35 func (v *Float64) Swap(new float64) (old float64) { 36 i := atomic.SwapInt64(v.pint64(), floatToInt64(new)) 37 return intToFloat64(i) 38 } 39 40 func (v *Float64) CompareAndSwap(old, new float64) (swapped bool) { 41 return atomic.CompareAndSwapInt64(v.pint64(), floatToInt64(old), floatToInt64(new)) 42 } 43 44 func (v *Float64) Add(f float64) (new float64) { 45 old := v.Load() 46 new = old + f 47 for !v.CompareAndSwap(old, new) { 48 old = v.Load() 49 new = old + f 50 } 51 52 return new 53 } 54 55 func (v *Float64) String() string { 56 return strconv.FormatFloat(float64(*v), 'e', -1, 64) 57 } 58 59 func (v *Float64) AsObject() lang.Object { 60 return v 61 } 62 63 func (v *Float64) Equals(o lang.Object) bool { 64 return lang.EqualsFloat64(v, o) 65 } 66 67 func (v *Float64) HashCode() int32 { 68 return lang.Hash64(v) 69 } 70 71 func (v *Float64) ToInt64() lang.Int64 { 72 return lang.Int64(*v) 73 } 74 75 func (v *Float64) ToUInt64() lang.UInt64 { 76 return lang.UInt64(*v) 77 } 78 79 func (v *Float64) ToFloat64() lang.Float64 { 80 return lang.Float64(*v) 81 } 82 83 func floatToInt64(f float64) int64 { 84 return *(*int64)(unsafe.Pointer(&f)) 85 } 86 87 func intToFloat64(f int64) float64 { 88 return *(*float64)(unsafe.Pointer(&f)) 89 }