// package def_mut_int -- внутренне изменяемое целое package def_mut_int import ( "bytes" "encoding/binary" "fmt" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let_err" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let_txt" "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/result" ) // MInt -- внутренне изменяемое целое. type MInt struct { val def_spec_base.Int } // MutInt -- возвращает новое внутреннее изменяемое целое. func MutInt(val def_spec_base.Int) *MInt { sf := &MInt{ val: val, } return sf } // Get -- возвращает хранимое значение потокобезопасной переменной. func (sf *MInt) Get() def_spec_base.Int { return sf.val } // ToStr -- возвращает как строку. func (sf *MInt) ToStr() def_spec_base.ATxt { return def_spec_fn.Sprintf("%v", sf.val) } // ToByte -- возвращает как срез байт. func (sf *MInt) ToByte() []byte { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, uint64(sf.val)) return buf } // Set -- устанавливает хранимое потокобезопасное значение. func (sf *MInt) Set(val def_spec_base.Int) { sf.val=val } // Inc -- увеличивает на единицу. func (sf *MInt) Inc() { sf.val++ } // Dec -- уменьшает на единицу. func (sf *MInt) Dec() { sf.val-- } // Reset -- сбрасывает хранимое потокобезопасное значение. func (sf *MInt) Reset() { sf.val=0 } // FromStr -- устанавливает значение из строки. func (sf *MInt) FromStr(val *def_let_txt.LTxt) *result.Result[def_spec_base.Int] { res := def_spec_fn.Atoi(val.Get()) if res.IsErr() { err := def_let_err.LetErr(res.Err().Error()) return result.ResErr[def_spec_base.Int](err) } sf.val=res.Ok() return result.ResOk(sf.val) } // FromByte -- устанавливает значение из байтов (BigEndian, net order). func (sf *MInt) FromByte(binData []byte) *result.Result[def_spec_base.Int] { lenBin := len(binData) if lenBin < 8 { err := def_let_err.LetErr("MInt.FromByte(): len(%v) bytes shorts", lenBin) return result.ResErr[def_spec_base.Int](err) } var signed int64 buf := bytes.NewReader(binData) err := binary.Read(buf, binary.BigEndian, &signed) if err != nil { err := def_let_err.LetErr("MInt.FromByte(): in read []byte, err=\n\t%w", err) return result.ResErr[def_spec_base.Int](err) } sf.val=def_spec_base.Int(signed) return result.ResOk(sf.val) } // Int -- возвращает число func (sf *MInt) Int() int { return int(sf.val) } // String -- возвращает строку func (sf *MInt) String() string { return fmt.Sprintf("%v", sf.val) }