implments Toggle method more explicit and simple.

This commit is contained in:
barryz 2019-07-23 23:43:19 +08:00
parent 774dbeaec2
commit 9e538c6d38
3 changed files with 15 additions and 6 deletions

View File

@ -18,7 +18,7 @@ cond.IsSet() // Returns true
cond.UnSet() // Set to false
cond.SetTo(true) // Set to whatever you want
cond.SetToIf(false, true) // Set to true if it is false, returns false(not set)
cond.Toggle() bool // Toggle the boolean value atomically and returns the previous value.
cond.Toggle() *AtomicBool // Negates boolean atomically and returns a new AtomicBool object which holds previous boolean value.
// embedding

View File

@ -49,9 +49,9 @@ func (ab *AtomicBool) SetTo(yes bool) {
}
}
// Toggle negates boolean atomically and returns the previous value.
func (ab *AtomicBool) Toggle() bool {
return (atomic.AddInt32((*int32)(ab), 1)-1)&1 == 1
// Toggle negates boolean atomically and returns a new AtomicBool object which holds previous boolean value.
func (ab *AtomicBool) Toggle() *AtomicBool {
return NewBool(atomic.AddInt32((*int32)(ab), 1)&1 == 0)
}
// SetToIf sets the Boolean to new only if the Boolean matches the old

View File

@ -50,11 +50,20 @@ func TestBool(t *testing.T) {
t.Fatal("AtomicBool.SetTo(false, true) failed")
}
_ = v.Toggle() // expected false
v = New()
if v.IsSet() {
t.Fatal("AtomicBool.Toggle() failed")
t.Fatal("Empty value of AtomicBool should be false")
}
_ = v.Toggle()
if !v.IsSet() {
t.Fatal("AtomicBool.Toggle() to true failed")
}
prev := v.Toggle()
if v.IsSet() == prev.IsSet() {
t.Fatal("AtomicBool.Toggle() to false failed")
}
}
func TestRace(t *testing.T) {