github.com/hslam/atomic@v1.0.0/bool.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 import ( 7 "sync/atomic" 8 ) 9 10 // Bool represents an bool. 11 type Bool struct { 12 v uint32 13 } 14 15 // NewBool returns a new Bool. 16 func NewBool(val bool) *Bool { 17 addr := &Bool{} 18 addr.Store(val) 19 return addr 20 } 21 22 // Swap atomically stores new into *addr and returns the previous *addr value. 23 func (addr *Bool) Swap(new bool) (old bool) { 24 var v = atomic.SwapUint32(&addr.v, boolToUint32(new)) 25 return uint32ToBool(v) 26 } 27 28 // CompareAndSwap executes the compare-and-swap operation for an bool value. 29 func (addr *Bool) CompareAndSwap(old, new bool) (swapped bool) { 30 return atomic.CompareAndSwapUint32(&addr.v, boolToUint32(old), boolToUint32(new)) 31 } 32 33 // Add atomically adds delta to *addr and returns the new value. 34 func (addr *Bool) Add(delta bool) (new bool) { 35 for { 36 old := addr.Load() 37 new = old && delta 38 if addr.CompareAndSwap(old, new) { 39 return 40 } 41 } 42 } 43 44 // Load atomically loads *addr. 45 func (addr *Bool) Load() (val bool) { 46 return uint32ToBool(atomic.LoadUint32(&addr.v)) 47 } 48 49 // Store atomically stores val into *addr. 50 func (addr *Bool) Store(val bool) { 51 atomic.StoreUint32(&addr.v, boolToUint32(val)) 52 } 53 54 func boolToUint32(val bool) uint32 { 55 if val { 56 return 1 57 } 58 return 0 59 } 60 61 func uint32ToBool(val uint32) bool { 62 if val > 0 { 63 return true 64 } 65 return false 66 }