github.com/hslam/atomic@v1.0.0/string.go (about) 1 // Copyright (c) 2020 Meng Huang (mhboy@outlook.com) 2 // This package is licensed under a MIT license that can be found in the LICENSE file. 3 4 package atomic 5 6 // String represents an string. 7 type String struct { 8 v Value 9 } 10 11 // NewString returns a new String. 12 func NewString(val string) *String { 13 addr := &String{} 14 addr.Store(val) 15 return addr 16 } 17 18 // Swap atomically stores new into *addr and returns the previous *addr value. 19 func (addr *String) Swap(new string) (old string) { 20 for { 21 load := addr.v.Load() 22 if addr.v.compareAndSwap(load, new) { 23 return load.(string) 24 } 25 } 26 } 27 28 // CompareAndSwap executes the compare-and-swap operation for an string value. 29 func (addr *String) CompareAndSwap(old, new string) (swapped bool) { 30 load := addr.v.Load() 31 if old != load { 32 return false 33 } 34 return addr.v.compareAndSwap(load, new) 35 } 36 37 // Add atomically adds delta to *addr and returns the new value. 38 func (addr *String) Add(delta string) (new string) { 39 for { 40 old := addr.v.Load() 41 new = old.(string) + delta 42 if addr.v.compareAndSwap(old, new) { 43 return 44 } 45 } 46 } 47 48 // Load atomically loads *addr. 49 func (addr *String) Load() (val string) { 50 v := addr.v.Load() 51 if v == nil { 52 return "" 53 } 54 return v.(string) 55 } 56 57 // Store atomically stores val into *addr. 58 func (addr *String) Store(val string) { 59 addr.v.Store(val) 60 }