github.com/sagernet/sing@v0.2.6/common/atomic/typed.go (about)

     1  package atomic
     2  
     3  import (
     4  	"sync/atomic"
     5  
     6  	"github.com/sagernet/sing/common"
     7  )
     8  
     9  type TypedValue[T any] struct {
    10  	value atomic.Value
    11  }
    12  
    13  func (t *TypedValue[T]) Load() T {
    14  	value := t.value.Load()
    15  	if value == nil {
    16  		return common.DefaultValue[T]()
    17  	}
    18  	return value.(T)
    19  }
    20  
    21  func (t *TypedValue[T]) Store(value T) {
    22  	t.value.Store(value)
    23  }
    24  
    25  func (t *TypedValue[T]) Swap(new T) T {
    26  	old := t.value.Swap(new)
    27  	if old == nil {
    28  		return common.DefaultValue[T]()
    29  	}
    30  	return old.(T)
    31  }
    32  
    33  func (t *TypedValue[T]) CompareAndSwap(old, new T) bool {
    34  	return t.value.CompareAndSwap(old, new)
    35  }