// package safe_int -- потокобезопасный целое. package safe_int import ( "sync" "gitp78su.ipnodns.ru/svi/kern/v4/lev0" ) // safeInt -- потокобезопасное целое. type safeInt struct { sync.RWMutex val lev0.Int } // NewSafeInt -- возвращает новое потокобезопасное целое. func NewSafeInt(val lev0.Int) lev0.ISafeInt { sf := &safeInt{ val: val, } return sf } // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки. func NewSafeIntFromStr(txtVal *lev0.LTxt) *lev0.Result[lev0.ISafeInt] { sf := NewSafeInt(0) res := sf.FromStr(txtVal) if res.IsErr() { err := lev0.LetErr("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", txtVal, res.Err()) return lev0.ResErr[lev0.ISafeInt](err) } return lev0.ResOk(sf) } // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения. func NewSafeIntGetenv(env *lev0.LTxt) *lev0.Result[lev0.ISafeInt] { sf := NewSafeInt(0) res := sf.Getenv(env) if res.IsErr() { err := lev0.LetErr("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err()) return lev0.ResErr[lev0.ISafeInt](err) } return lev0.ResOk(sf) } // FromBool -- устанавливает значение из булева значения. func (sf *safeInt) FromBool(val lev0.LBool) lev0.Int { sf.Lock() defer sf.Unlock() if val.IsOk() { sf.val = 1 return 1 } sf.val = 0 return 0 } // Get -- возвращает хранимое целое. func (sf *safeInt) Get() lev0.Int { sf.RLock() defer sf.RUnlock() return sf.val } // Dec -- уменьшает значение на 1. func (sf *safeInt) Dec() { sf.Lock() defer sf.Unlock() sf.val-- } // Inc -- увеличивает значение на 1. func (sf *safeInt) Inc() { sf.Lock() defer sf.Unlock() sf.val++ } // Set -- устанавливает целое. func (sf *safeInt) Set(val lev0.Int) { sf.Lock() defer sf.Unlock() sf.val = val } // Reset -- сбрасывает целое. func (sf *safeInt) Reset() { sf.Lock() defer sf.Unlock() sf.val=0 } // FromStr -- получает число из строки. func (sf *safeInt) FromStr(txtVal *lev0.LTxt) *lev0.Result[lev0.Int] { sf.Lock() defer sf.Unlock() res:=txtVal.Atoi() if res.Err!=nil { err:=lev0.LetErr("safeInt.FromStr(): form str(%v) to int, err=\n\t%v", txtVal, res.Error()) return lev0.ResErr[lev0.Int](err) } sf.val=res.Ok() return lev0.ResOk(sf.val) } // FromByte -- получает число из среза байт. func (sf *safeInt) FromByte(binData []byte) *lev0.Result[lev0.Int] { sf.Lock() defer sf.Unlock() res:=binData.ToInt() if res.Err!=nil { err:=lev0.LetErr("safeInt.FromByte(): form binData(%v) to int", binData, res.Error()) return lev0.ResErr[lev0.Int](err) } sf.val=res.Ok() return lev0.ResOk(sf.val) } // ToByte -- конвертирует число в срез байт. func (sf *safeInt) ToByte() []byte { sf.RLock() defer sf.RUnlock() return sf.val.ToByte() } // ToBool -- конвертирует число в bool. func (sf *safeInt) ToBool() lev0.Bool { sf.RLock() defer sf.RUnlock() return sf.val.ToBool() } // ToStr -- конвертирует число в строку. func (sf *safeInt) ToStr() *lev0.LTxt { sf.RLock() defer sf.RUnlock() return sf.val.ToStr() } // Getenv -- получает значение из окружения. func (sf *safeInt) Getenv(env *lev0.LTxt) *lev0.Result[lev0.Int] { sf.Lock() defer sf.Unlock() return sf.val.Getenv(env) }