198 lines
3 KiB
Go
198 lines
3 KiB
Go
package atomic
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"sync/atomic"
|
|
)
|
|
|
|
type Bool struct {
|
|
atomic.Bool
|
|
}
|
|
|
|
func NewBool(val bool) (i Bool) {
|
|
i.Store(val)
|
|
return
|
|
}
|
|
|
|
func (i *Bool) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Bool) UnmarshalJSON(b []byte) error {
|
|
var v bool
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Bool) String() string {
|
|
v := i.Load()
|
|
return strconv.FormatBool(v)
|
|
}
|
|
|
|
type Pointer[T any] struct {
|
|
atomic.Pointer[T]
|
|
}
|
|
|
|
func NewPointer[T any](v *T) (p Pointer[T]) {
|
|
if v != nil {
|
|
p.Store(v)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (p *Pointer[T]) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(p.Load())
|
|
}
|
|
|
|
func (p *Pointer[T]) UnmarshalJSON(b []byte) error {
|
|
var v *T
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
p.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (p *Pointer[T]) String() string {
|
|
return fmt.Sprint(p.Load())
|
|
}
|
|
|
|
type Int32 struct {
|
|
atomic.Int32
|
|
}
|
|
|
|
func NewInt32(val int32) (i Int32) {
|
|
i.Store(val)
|
|
return
|
|
}
|
|
|
|
func (i *Int32) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Int32) UnmarshalJSON(b []byte) error {
|
|
var v int32
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Int32) String() string {
|
|
v := i.Load()
|
|
return strconv.FormatInt(int64(v), 10)
|
|
}
|
|
|
|
type Int64 struct {
|
|
atomic.Int64
|
|
}
|
|
|
|
func NewInt64(val int64) (i Int64) {
|
|
i.Store(val)
|
|
return
|
|
}
|
|
|
|
func (i *Int64) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Int64) UnmarshalJSON(b []byte) error {
|
|
var v int64
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Int64) String() string {
|
|
v := i.Load()
|
|
return strconv.FormatInt(int64(v), 10)
|
|
}
|
|
|
|
type Uint32 struct {
|
|
atomic.Uint32
|
|
}
|
|
|
|
func NewUint32(val uint32) (i Uint32) {
|
|
i.Store(val)
|
|
return
|
|
}
|
|
|
|
func (i *Uint32) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Uint32) UnmarshalJSON(b []byte) error {
|
|
var v uint32
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Uint32) String() string {
|
|
v := i.Load()
|
|
return strconv.FormatUint(uint64(v), 10)
|
|
}
|
|
|
|
type Uint64 struct {
|
|
atomic.Uint64
|
|
}
|
|
|
|
func NewUint64(val uint64) (i Uint64) {
|
|
i.Store(val)
|
|
return
|
|
}
|
|
|
|
func (i *Uint64) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Uint64) UnmarshalJSON(b []byte) error {
|
|
var v uint64
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Uint64) String() string {
|
|
v := i.Load()
|
|
return strconv.FormatUint(uint64(v), 10)
|
|
}
|
|
|
|
type Uintptr struct {
|
|
atomic.Uintptr
|
|
}
|
|
|
|
func NewUintptr(val uintptr) (i Uintptr) {
|
|
i.Store(val)
|
|
return
|
|
}
|
|
|
|
func (i *Uintptr) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(i.Load())
|
|
}
|
|
|
|
func (i *Uintptr) UnmarshalJSON(b []byte) error {
|
|
var v uintptr
|
|
if err := json.Unmarshal(b, &v); err != nil {
|
|
return err
|
|
}
|
|
i.Store(v)
|
|
return nil
|
|
}
|
|
|
|
func (i *Uintptr) String() string {
|
|
v := i.Load()
|
|
return strconv.FormatUint(uint64(v), 10)
|
|
}
|