// package def_mut_int -- внутренне изменяемое целое package def_mut_int import ( "bytes" "encoding/binary" "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_mut" "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 { *def_mut.Mut[def_spec_base.Int] } // MutInt -- возвращает новое внутреннее изменяемое целое. func MutInt(val def_spec_base.Int) *MInt { sf := &MInt{ Mut: def_mut.NewMut(val), } return sf } // Get -- возвращает хранимое значение потокобезопасной переменной. func (sf *MInt) Get() def_spec_base.Int { return sf.Mut.Get() } // ToStr -- возвращает как строку. func (sf *MInt) ToStr() def_spec_base.ATxt { return def_spec_fn.Sprintf("%v", sf.Mut.Get()) } // ToByte -- возвращает как срез байт. func (sf *MInt) ToByte() []byte { buf := make([]byte, 8) binary.BigEndian.PutUint64(buf, uint64(sf.Mut.Get())) return buf } // Set -- устанавливает хранимое потокобезопасное значение. func (sf *MInt) Set(val def_spec_base.Int) { sf.Mut.Set(val) } // Inc -- увеличивает на единицу. func (sf *MInt) Inc() { val := sf.Mut.Get() val++ sf.Mut.Set(val) } // Dec -- уменьшает на единицу. func (sf *MInt) Dec() { val := sf.Mut.Get() val-- sf.Mut.Set(val) } // Reset -- сбрасывает хранимое потокобезопасное значение. func (sf *MInt) Reset() { sf.Mut.Set(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.NewErr[def_spec_base.Int](err) } sf.Mut.Set(res.Ok()) return result.NewOk(sf.Mut.Get()) } // 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.NewErr[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.NewErr[def_spec_base.Int](err) } sf.Mut.Set(def_spec_base.Int(signed)) return result.NewOk(sf.Mut.Get()) }