github.com/hslam/atomic@v1.0.0/string.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  // String represents an string.
     7  type String struct {
     8  	v Value
     9  }
    10  
    11  // NewString returns a new String.
    12  func NewString(val string) *String {
    13  	addr := &String{}
    14  	addr.Store(val)
    15  	return addr
    16  }
    17  
    18  // Swap atomically stores new into *addr and returns the previous *addr value.
    19  func (addr *String) Swap(new string) (old string) {
    20  	for {
    21  		load := addr.v.Load()
    22  		if addr.v.compareAndSwap(load, new) {
    23  			return load.(string)
    24  		}
    25  	}
    26  }
    27  
    28  // CompareAndSwap executes the compare-and-swap operation for an string value.
    29  func (addr *String) CompareAndSwap(old, new string) (swapped bool) {
    30  	load := addr.v.Load()
    31  	if old != load {
    32  		return false
    33  	}
    34  	return addr.v.compareAndSwap(load, new)
    35  }
    36  
    37  // Add atomically adds delta to *addr and returns the new value.
    38  func (addr *String) Add(delta string) (new string) {
    39  	for {
    40  		old := addr.v.Load()
    41  		new = old.(string) + delta
    42  		if addr.v.compareAndSwap(old, new) {
    43  			return
    44  		}
    45  	}
    46  }
    47  
    48  // Load atomically loads *addr.
    49  func (addr *String) Load() (val string) {
    50  	v := addr.v.Load()
    51  	if v == nil {
    52  		return ""
    53  	}
    54  	return v.(string)
    55  }
    56  
    57  // Store atomically stores val into *addr.
    58  func (addr *String) Store(val string) {
    59  	addr.v.Store(val)
    60  }