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  }