// package safe_int -- потокобезопасный целое. package safe_int import ( "fmt" "sync" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec" "gitp78su.ipnodns.ru/svi/kern/v4/lev1/kint" ) // safeInt -- потокобезопасное целое. type safeInt struct { sync.RWMutex val mKs.Int } // NewSafeInt -- возвращает новое потокобезопасное целое. func NewSafeInt(val int) mKs.ISafeInt { sf := &safeInt{ val: kint.NewInt(val), } return sf } // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки. func NewSafeIntFromStr(strVal string) mL0.IResult[mKs.ISafeInt] { sf := NewSafeInt(0) res := sf.FromStr(strVal) if res.IsErr() { err := fmt.Errorf("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err()) return mL0.NewErr[mKs.ISafeInt](err) } return mL0.NewOk(sf) } // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения. func NewSafeIntGetenv(env string) mL0.IResult[mKs.ISafeInt] { sf := NewSafeInt(0) res := sf.Getenv(env) if res.IsErr() { err := fmt.Errorf("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err()) return mL0.NewErr[mKs.ISafeInt](err) } return mL0.NewOk(sf) } // FromBool -- устанавливает значение из булева значения. func (sf *safeInt) FromBool(val bool) int { sf.Lock() defer sf.Unlock() return sf.val.FromBool(val) } // Get -- возвращает хранимое целое. func (sf *safeInt) Get() int { sf.RLock() defer sf.RUnlock() return sf.val.Get() } // Dec -- уменьшает значение на 1. func (sf *safeInt) Dec() { sf.Lock() defer sf.Unlock() sf.val.Dec() } // Inc -- увеличивает значение на 1. func (sf *safeInt) Inc() { sf.Lock() defer sf.Unlock() sf.val.Inc() } // Set -- устанавливает целое. func (sf *safeInt) Set(val int) { sf.Lock() defer sf.Unlock() sf.val.Set(val) } // Reset -- сбрасывает целое. func (sf *safeInt) Reset() { sf.Lock() defer sf.Unlock() sf.val.Reset() } // FromStr -- получает число из строки. func (sf *safeInt) FromStr(strVal string) mL0.IResult[int] { sf.Lock() defer sf.Unlock() return sf.val.FromStr(strVal) } // FromByte -- получает число из среза байт. func (sf *safeInt) FromByte(binData []byte) mL0.IResult[int] { sf.Lock() defer sf.Unlock() return sf.val.FromByte(binData) } // ToByte -- конвертирует число в срез байт. func (sf *safeInt) ToByte() []byte { sf.RLock() defer sf.RUnlock() return sf.val.ToByte() } // ToBool -- конвертирует число в bool. func (sf *safeInt) ToBool() bool { sf.RLock() defer sf.RUnlock() return sf.val.ToBool() } // ToStr -- конвертирует число в строку. func (sf *safeInt) ToStr() string { sf.RLock() defer sf.RUnlock() return sf.val.ToStr() } // Getenv -- получает значение из окружения. func (sf *safeInt) Getenv(env string) mL0.IResult[int] { sf.Lock() defer sf.Unlock() return sf.val.Getenv(env) }