github.com/tursom/GoCollections@v0.3.10/lang/atomic/Float32.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 Float32 float32 18 19 func (v *Float32) P() *float32 { 20 return (*float32)(v) 21 } 22 23 func (v *Float32) pint32() *int32 { 24 return (*int32)(unsafe.Pointer(v)) 25 } 26 27 func (v *Float32) Load() (val float32) { 28 return intToFloat32(atomic.LoadInt32(v.pint32())) 29 } 30 31 func (v *Float32) Store(val float32) { 32 atomic.StoreInt32(v.pint32(), floatToInt32(val)) 33 } 34 35 func (v *Float32) Swap(new float32) (old float32) { 36 i := atomic.SwapInt32(v.pint32(), floatToInt32(new)) 37 return intToFloat32(i) 38 } 39 40 func (v *Float32) CompareAndSwap(old, new float32) (swapped bool) { 41 return atomic.CompareAndSwapInt32(v.pint32(), floatToInt32(old), floatToInt32(new)) 42 } 43 44 func (v *Float32) Add(f float32) (new float32) { 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 *Float32) String() string { 56 return strconv.FormatFloat(float64(*v), 'e', -1, 32) 57 } 58 59 func (v *Float32) AsObject() lang.Object { 60 return v 61 } 62 63 func (v *Float32) Equals(o lang.Object) bool { 64 return lang.EqualsFloat32(v, o) 65 } 66 67 func (v *Float32) HashCode() int32 { 68 return lang.Hash32(v) 69 } 70 71 func (v *Float32) ToInt64() lang.Int64 { 72 return lang.Int64(*v) 73 } 74 75 func (v *Float32) ToUInt64() lang.UInt64 { 76 return lang.UInt64(*v) 77 } 78 79 func (v *Float32) ToFloat64() lang.Float64 { 80 return lang.Float64(*v) 81 } 82 83 func floatToInt32(f float32) int32 { 84 return *(*int32)(unsafe.Pointer(&f)) 85 } 86 87 func intToFloat32(f int32) float32 { 88 return *(*float32)(unsafe.Pointer(&f)) 89 }