mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-09-20 12:35:59 +08:00
64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package atomic
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"sync/atomic"
|
|
)
|
|
|
|
type Int32Enum[T ~int32] struct {
|
|
value atomic.Int32
|
|
}
|
|
|
|
func (i *Int32Enum[T]) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Int32Enum[T]) UnmarshalJSON(b []byte) error {
|
|
var v T
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Int32Enum[T]) MarshalYAML() (any, error) {
|
|
return i.Load(), nil
|
|
}
|
|
|
|
func (i *Int32Enum[T]) UnmarshalYAML(unmarshal func(any) error) error {
|
|
var v T
|
|
if err := unmarshal(&v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Int32Enum[T]) String() string {
|
|
return fmt.Sprint(i.Load())
|
|
}
|
|
|
|
func (i *Int32Enum[T]) Store(v T) {
|
|
i.value.Store(int32(v))
|
|
}
|
|
|
|
func (i *Int32Enum[T]) Load() T {
|
|
return T(i.value.Load())
|
|
}
|
|
|
|
func (i *Int32Enum[T]) Swap(new T) T {
|
|
return T(i.value.Swap(int32(new)))
|
|
}
|
|
|
|
func (i *Int32Enum[T]) CompareAndSwap(old, new T) bool {
|
|
return i.value.CompareAndSwap(int32(old), int32(new))
|
|
}
|
|
|
|
func NewInt32Enum[T ~int32](v T) *Int32Enum[T] {
|
|
a := &Int32Enum[T]{}
|
|
a.Store(v)
|
|
return a
|
|
}
|