package moreatomic

import "sync/atomic"

type Bool struct {
	val uint32
}

func (b *Bool) Get() bool {
	return atomic.LoadUint32(&b.val) > 0
}

func (b *Bool) Set(val bool) {
	var x = uint32(0)
	if val {
		x = 1
	}
	atomic.StoreUint32(&b.val, x)
}

func (b *Bool) SetTrue() {
	atomic.StoreUint32(&b.val, 1)
}

func (b *Bool) SetFalse() {
	atomic.StoreUint32(&b.val, 0)
}

// Acquire sets bool to true if it's false and returns true, otherwise returns
// false.
func (b *Bool) Acquire() bool {
	return atomic.CompareAndSwapUint32(&b.val, 0, 1)
}