| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // 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())
- }
|