summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-atomics/bool.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-atomics/bool.go')
-rw-r--r--vendor/codeberg.org/gruf/go-atomics/bool.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-atomics/bool.go b/vendor/codeberg.org/gruf/go-atomics/bool.go
new file mode 100644
index 000000000..52660d356
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-atomics/bool.go
@@ -0,0 +1,47 @@
+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
+}