mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-19 16:30:07 +08:00
Some checks are pending
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Test / test (1.25, macos-13) (push) Waiting to run
Test / test (1.25, macos-latest) (push) Waiting to run
Test / test (1.25, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.25, ubuntu-latest) (push) Waiting to run
Test / test (1.25, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
89 lines
1.5 KiB
Go
89 lines
1.5 KiB
Go
package atomic
|
|
|
|
import (
|
|
"encoding/json"
|
|
"sync/atomic"
|
|
)
|
|
|
|
func DefaultValue[T any]() T {
|
|
var defaultValue T
|
|
return defaultValue
|
|
}
|
|
|
|
type TypedValue[T any] struct {
|
|
value atomic.Pointer[T]
|
|
}
|
|
|
|
func (t *TypedValue[T]) Load() T {
|
|
value, _ := t.LoadOk()
|
|
return value
|
|
}
|
|
|
|
func (t *TypedValue[T]) LoadOk() (_ T, ok bool) {
|
|
value := t.value.Load()
|
|
if value == nil {
|
|
return DefaultValue[T](), false
|
|
}
|
|
return *value, true
|
|
}
|
|
|
|
func (t *TypedValue[T]) Store(value T) {
|
|
t.value.Store(&value)
|
|
}
|
|
|
|
func (t *TypedValue[T]) Swap(new T) T {
|
|
old := t.value.Swap(&new)
|
|
if old == nil {
|
|
return DefaultValue[T]()
|
|
}
|
|
return *old
|
|
}
|
|
|
|
func (t *TypedValue[T]) CompareAndSwap(old, new T) bool {
|
|
for {
|
|
currentP := t.value.Load()
|
|
currentValue := DefaultValue[T]()
|
|
if currentP != nil {
|
|
currentValue = *currentP
|
|
}
|
|
// Compare old and current via runtime equality check.
|
|
if any(currentValue) != any(old) {
|
|
return false
|
|
}
|
|
if t.value.CompareAndSwap(currentP, &new) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
|
|
func (t *TypedValue[T]) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(t.Load())
|
|
}
|
|
|
|
func (t *TypedValue[T]) UnmarshalJSON(b []byte) error {
|
|
var v T
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
t.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (t *TypedValue[T]) MarshalYAML() (any, error) {
|
|
return t.Load(), nil
|
|
}
|
|
|
|
func (t *TypedValue[T]) UnmarshalYAML(unmarshal func(any) error) error {
|
|
var v T
|
|
if err := unmarshal(&v); err != nil {
|
|
return err
|
|
}
|
|
t.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func NewTypedValue[T any](t T) (v TypedValue[T]) {
|
|
v.Store(t)
|
|
return
|
|
}
|