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  }