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  }