| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // package safe_num -- потокобезопасный число.
- package safe_num
- import (
- "sync"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_err"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_num"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_txt"
- "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
- )
- // MSafeNum -- потокобезопасное число.
- type MSafeNum struct {
- sync.RWMutex
- val *def_num.MNum
- }
- // MutSafeNum -- возвращает новое потокобезопасное число.
- func MutSafeNum[T def_spec_base.NumConstraint](val T) *MSafeNum {
- sf := &MSafeNum{
- val: def_num.MutNum(val),
- }
- return sf
- }
- // MutSafeNumFromTxt -- возвращает новое потокобезопасное число из текста.
- func MutSafeNumFromTxt[T def_spec_base.TxtConstraint](txtVal T) *result.Result[*MSafeNum] {
- res := def_spec_fn.Atoi(def_spec_base.Txt(txtVal))
- if res.IsErr() {
- err := def_err.LetErr("MutSafeNumFromTxt(): in parse str(%v), err=\n\t%w", txtVal, res.Err())
- return result.ResErr[*MSafeNum](err)
- }
- _val := MutSafeNum(res.Ok())
- return result.ResOk(_val)
- }
- // MutSafeNumFromEnv -- возвращает новое потокобезопасное число из окружения.
- func MutSafeNumFromEnv(env *def_txt.LTxt) *result.Result[*MSafeNum] {
- sf := MutSafeNum(0)
- res := sf.FromEnv(env)
- if res.IsErr() {
- err := def_err.LetErr("MutSafeNumFromEnv(): in parse env(%v), err=\n\t%w", env, res.Err())
- return result.ResErr[*MSafeNum](err)
- }
- return result.ResOk(sf)
- }
- // FromBool -- устанавливает значение из булева значения.
- func (sf *MSafeNum) FromBool(val def_spec_base.Bool) def_spec_base.Num {
- sf.Lock()
- defer sf.Unlock()
- if val {
- sf.val.Set(1)
- return 1
- }
- sf.val.Set(0)
- return 0
- }
- // Get -- возвращает хранимое число.
- func (sf *MSafeNum) Get() def_spec_base.Num {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val.Get()
- }
- // Dec -- уменьшает значение на 1.
- func (sf *MSafeNum) Dec() {
- sf.Lock()
- defer sf.Unlock()
- sf.val.Dec()
- }
- // Inc -- увеличивает значение на 1.
- func (sf *MSafeNum) Inc() {
- sf.Lock()
- defer sf.Unlock()
- sf.val.Inc()
- }
- // Set -- устанавливает число.
- func (sf *MSafeNum) Set(val def_spec_base.Num) {
- sf.Lock()
- defer sf.Unlock()
- sf.val.Set(val)
- }
- // Reset -- сбрасывает число.
- func (sf *MSafeNum) Reset() {
- sf.Lock()
- defer sf.Unlock()
- sf.val.Reset()
- }
- // FromTxt -- получает число из текста.
- func (sf *MSafeNum) FromTxt(txtVal *def_txt.LTxt) *result.Result[def_spec_base.Num] {
- sf.Lock()
- defer sf.Unlock()
- res := sf.val.FromTxt(txtVal)
- if res.IsErr() {
- err := def_err.LetErr("MSafeInt.FromStr(): form str(%v) to int, err=\n\t%v", txtVal, res.Error())
- return result.ResErr[def_spec_base.Num](err)
- }
- return result.ResOk(sf.val.Get())
- }
- // FromByte -- получает число из среза байт.
- func (sf *MSafeNum) FromByte(binData []byte) *result.Result[def_spec_base.Num] {
- sf.Lock()
- defer sf.Unlock()
- res := sf.val.FromByte(binData)
- if res.IsErr() {
- err := def_err.LetErr("MSafeInt.FromByte(): form binData(%v) to int", binData, res.Error())
- return result.ResErr[def_spec_base.Num](err)
- }
- return result.ResOk(sf.val.Get())
- }
- // ToByte -- конвертирует число в срез байт.
- func (sf *MSafeNum) ToByte() []byte {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val.ToByte()
- }
- // ToBool -- конвертирует число в bool.
- func (sf *MSafeNum) ToBool() def_spec_base.Bool {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val.ToBool()
- }
- // Txt -- конвертирует число в текст.
- func (sf *MSafeNum) Txt() *def_txt.LTxt {
- sf.RLock()
- defer sf.RUnlock()
- return sf.val.Txt()
- }
- // FromEnv -- получает значение из окружения.
- func (sf *MSafeNum) FromEnv(env *def_txt.LTxt) *result.Result[*def_num.LNum] {
- sf.Lock()
- defer sf.Unlock()
- return sf.val.FromEnv(env)
- }
|