Add Swap for Float64 (#94)

Float64 wraps a Uint64, and since Uint64 supports Swap, Float64 can also
support Swap. Enable the Swap method in the generated code, and add
tests.

This also adds a note for why String doesn't support Swap (though it
will be possible after Go 1.17+).
This commit is contained in:
Prashant Varanasi
2021-06-11 08:23:41 -07:00
committed by GitHub
parent 38b6e7fa63
commit df5a5c3c08
5 changed files with 16 additions and 1 deletions

View File

@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
### Added
- Add `Float64.Swap` to match int atomic operations.
## [1.8.0] - 2021-06-09 ## [1.8.0] - 2021-06-09
### Added ### Added
- Add `atomic.Uintptr` type for atomic operations on `uintptr` values. - Add `atomic.Uintptr` type for atomic operations on `uintptr` values.

View File

@@ -55,6 +55,12 @@ func (x *Float64) Store(v float64) {
x.v.Store(math.Float64bits(v)) x.v.Store(math.Float64bits(v))
} }
// Swap atomically stores the given float64 and returns the old
// value.
func (x *Float64) Swap(o float64) float64 {
return math.Float64frombits(x.v.Swap(math.Float64bits(o)))
}
// MarshalJSON encodes the wrapped float64 into JSON. // MarshalJSON encodes the wrapped float64 into JSON.
func (x *Float64) MarshalJSON() ([]byte, error) { func (x *Float64) MarshalJSON() ([]byte, error) {
return json.Marshal(x.Load()) return json.Marshal(x.Load())

View File

@@ -25,7 +25,7 @@ import (
"strconv" "strconv"
) )
//go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -json -imports math -file=float64.go //go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -swap -json -imports math -file=float64.go
// Add atomically adds to the wrapped float64 and returns the new value. // Add atomically adds to the wrapped float64 and returns the new value.
func (f *Float64) Add(s float64) float64 { func (f *Float64) Add(s float64) float64 {

View File

@@ -42,6 +42,9 @@ func TestFloat64(t *testing.T) {
require.Equal(t, float64(42.5), atom.Add(0.5), "Add didn't work.") require.Equal(t, float64(42.5), atom.Add(0.5), "Add didn't work.")
require.Equal(t, float64(42.0), atom.Sub(0.5), "Sub didn't work.") require.Equal(t, float64(42.0), atom.Sub(0.5), "Sub didn't work.")
require.Equal(t, float64(42.0), atom.Swap(45.0), "Swap didn't return the old value.")
require.Equal(t, float64(45.0), atom.Load(), "Swap didn't set the correct value.")
t.Run("JSON/Marshal", func(t *testing.T) { t.Run("JSON/Marshal", func(t *testing.T) {
atom.Store(42.5) atom.Store(42.5)
bytes, err := json.Marshal(atom) bytes, err := json.Marshal(atom)

View File

@@ -21,6 +21,8 @@
package atomic package atomic
//go:generate bin/gen-atomicwrapper -name=String -type=string -wrapped=Value -file=string.go //go:generate bin/gen-atomicwrapper -name=String -type=string -wrapped=Value -file=string.go
// Note: No Swap as String wraps Value, which wraps the stdlib sync/atomic.Value which
// only supports Swap as of go1.17: https://github.com/golang/go/issues/39351
// String returns the wrapped value. // String returns the wrapped value.
func (s *String) String() string { func (s *String) String() string {