1// Copyright (c) 2020 Uber Technologies, Inc. 2// 3// Permission is hereby granted, free of charge, to any person obtaining a copy 4// of this software and associated documentation files (the "Software"), to deal 5// in the Software without restriction, including without limitation the rights 6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7// copies of the Software, and to permit persons to whom the Software is 8// furnished to do so, subject to the following conditions: 9// 10// The above copyright notice and this permission notice shall be included in 11// all copies or substantial portions of the Software. 12// 13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19// THE SOFTWARE. 20 21package atomic 22 23import "strconv" 24 25//go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -cas -json -imports math -file=float64.go 26 27// Add atomically adds to the wrapped float64 and returns the new value. 28func (f *Float64) Add(s float64) float64 { 29 for { 30 old := f.Load() 31 new := old + s 32 if f.CAS(old, new) { 33 return new 34 } 35 } 36} 37 38// Sub atomically subtracts from the wrapped float64 and returns the new value. 39func (f *Float64) Sub(s float64) float64 { 40 return f.Add(-s) 41} 42 43// String encodes the wrapped value as a string. 44func (f *Float64) String() string { 45 // 'g' is the behavior for floats with %v. 46 return strconv.FormatFloat(f.Load(), 'g', -1, 64) 47} 48