def_mut_int.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // package def_mut_int -- внутренне изменяемое целое
  2. package def_mut_int
  3. import (
  4. "bytes"
  5. "encoding/binary"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let_err"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_let_txt"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_mut"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
  12. )
  13. // MInt -- внутренне изменяемое целое.
  14. type MInt struct {
  15. *def_mut.Mut[def_spec_base.Int]
  16. }
  17. // MutInt -- возвращает новое внутреннее изменяемое целое.
  18. func MutInt(val def_spec_base.Int) *MInt {
  19. sf := &MInt{
  20. Mut: def_mut.NewMut(val),
  21. }
  22. return sf
  23. }
  24. // Get -- возвращает хранимое значение потокобезопасной переменной.
  25. func (sf *MInt) Get() def_spec_base.Int {
  26. return sf.Mut.Get()
  27. }
  28. // ToStr -- возвращает как строку.
  29. func (sf *MInt) ToStr() def_spec_base.ATxt {
  30. return def_spec_fn.Sprintf("%v", sf.Mut.Get())
  31. }
  32. // ToByte -- возвращает как срез байт.
  33. func (sf *MInt) ToByte() []byte {
  34. buf := make([]byte, 8)
  35. binary.BigEndian.PutUint64(buf, uint64(sf.Mut.Get()))
  36. return buf
  37. }
  38. // Set -- устанавливает хранимое потокобезопасное значение.
  39. func (sf *MInt) Set(val def_spec_base.Int) {
  40. sf.Mut.Set(val)
  41. }
  42. // Inc -- увеличивает на единицу.
  43. func (sf *MInt) Inc() {
  44. val := sf.Mut.Get()
  45. val++
  46. sf.Mut.Set(val)
  47. }
  48. // Dec -- уменьшает на единицу.
  49. func (sf *MInt) Dec() {
  50. val := sf.Mut.Get()
  51. val--
  52. sf.Mut.Set(val)
  53. }
  54. // Reset -- сбрасывает хранимое потокобезопасное значение.
  55. func (sf *MInt) Reset() {
  56. sf.Mut.Set(0)
  57. }
  58. // FromStr -- устанавливает значение из строки.
  59. func (sf *MInt) FromStr(val *def_let_txt.LTxt) *result.Result[def_spec_base.Int] {
  60. res := def_spec_fn.Atoi(val.Get())
  61. if res.IsErr() {
  62. err := def_let_err.LetErr(res.Err().Error())
  63. return result.NewErr[def_spec_base.Int](err)
  64. }
  65. sf.Mut.Set(res.Ok())
  66. return result.NewOk(sf.Mut.Get())
  67. }
  68. // FromByte -- устанавливает значение из байтов (BigEndian, net order).
  69. func (sf *MInt) FromByte(binData []byte) *result.Result[def_spec_base.Int] {
  70. lenBin := len(binData)
  71. if lenBin < 8 {
  72. err := def_let_err.LetErr("MInt.FromByte(): len(%v) bytes shorts",
  73. lenBin)
  74. return result.NewErr[def_spec_base.Int](err)
  75. }
  76. var signed int64
  77. buf := bytes.NewReader(binData)
  78. err := binary.Read(buf, binary.BigEndian, &signed)
  79. if err != nil {
  80. err := def_let_err.LetErr("MInt.FromByte(): in read []byte, err=\n\t%w",
  81. err)
  82. return result.NewErr[def_spec_base.Int](err)
  83. }
  84. sf.Mut.Set(def_spec_base.Int(signed))
  85. return result.NewOk(sf.Mut.Get())
  86. }