mirror of
https://codeberg.org/superseriousbusiness/gotosocial.git
synced 2024-12-21 08:31:53 +03:00
48 lines
1.2 KiB
Go
48 lines
1.2 KiB
Go
|
package atomics
|
||
|
|
||
|
import "sync/atomic"
|
||
|
|
||
|
// Bool provides user-friendly means of performing atomic operations on bool types.
|
||
|
type Bool uint32
|
||
|
|
||
|
// NewBool will return a new Bool instance initialized with zero value.
|
||
|
func NewBool() *Bool {
|
||
|
return new(Bool)
|
||
|
}
|
||
|
|
||
|
// Store will atomically store bool value in address contained within i.
|
||
|
func (b *Bool) Store(val bool) {
|
||
|
atomic.StoreUint32((*uint32)(b), fromBool(val))
|
||
|
}
|
||
|
|
||
|
// Load will atomically load bool value at address contained within i.
|
||
|
func (b *Bool) Load() bool {
|
||
|
return toBool(atomic.LoadUint32((*uint32)(b)))
|
||
|
}
|
||
|
|
||
|
// CAS performs a compare-and-swap for a(n) bool value at address contained within i.
|
||
|
func (b *Bool) CAS(cmp, swp bool) bool {
|
||
|
return atomic.CompareAndSwapUint32((*uint32)(b), fromBool(cmp), fromBool(swp))
|
||
|
}
|
||
|
|
||
|
// Swap atomically stores new bool value into address contained within i, and returns previous value.
|
||
|
func (b *Bool) Swap(swp bool) bool {
|
||
|
return toBool(atomic.SwapUint32((*uint32)(b), fromBool(swp)))
|
||
|
}
|
||
|
|
||
|
// toBool converts uint32 value to bool.
|
||
|
func toBool(u uint32) bool {
|
||
|
if u == 0 {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// fromBool converts from bool to uint32 value.
|
||
|
func fromBool(b bool) uint32 {
|
||
|
if b {
|
||
|
return 1
|
||
|
}
|
||
|
return 0
|
||
|
}
|