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