kint.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // package kint -- целочисленная переменная ядра.
  2. package kint
  3. import (
  4. "bytes"
  5. "encoding/binary"
  6. "fmt"
  7. "os"
  8. "strconv"
  9. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  10. mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  12. )
  13. // Целочисленная переменная ядра.
  14. type KernInt struct {
  15. val defs.Int
  16. }
  17. // NewInt -- возвращает новое целое ядра.
  18. func NewInt(val defs.Int) mKs.Int {
  19. sf := &KernInt{
  20. val: val,
  21. }
  22. return sf
  23. }
  24. // Get -- возвращает хранимое значение потокобезопасной переменной.
  25. func (sf *KernInt) Get() defs.Int {
  26. return sf.val
  27. }
  28. // Set -- устанавливает хранимое потокобезопасное значение.
  29. func (sf *KernInt) Set(val defs.Int) {
  30. sf.val = val
  31. }
  32. // Inc -- увеличивает на единицу.
  33. func (sf *KernInt) Inc() {
  34. sf.val++
  35. }
  36. // Dec -- уменьшает на единицу.
  37. func (sf *KernInt) Dec() {
  38. sf.val--
  39. }
  40. // Reset -- сбрасывает хранимое потокобезопасное значение.
  41. func (sf *KernInt) Reset() {
  42. sf.val = 0
  43. }
  44. // FromStr -- устанавливает значение из строки.
  45. func (sf *KernInt) FromStr(strVal string) mL0.IResult[defs.Int] {
  46. iVal, err := strconv.Atoi(strVal)
  47. if err != nil {
  48. err := fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err)
  49. return mL0.NewErr[defs.Int](err)
  50. }
  51. sf.val = defs.Int(iVal)
  52. return mL0.NewOk(sf.val)
  53. }
  54. // ToStr -- возвращает как строку.
  55. func (sf *KernInt) ToStr() string {
  56. return fmt.Sprint(sf.val)
  57. }
  58. // FromByte -- устанавливает значение из байтов (BigEndian, net order).
  59. func (sf *KernInt) FromByte(binData []byte) mL0.IResult[defs.Int] {
  60. lenBin := len(binData)
  61. if lenBin < 8 {
  62. err := fmt.Errorf("KInt.FromByte(): len(%v) bytes shorts", lenBin)
  63. return mL0.NewErr[defs.Int](err)
  64. }
  65. var signed int64
  66. buf := bytes.NewReader(binData)
  67. err := binary.Read(buf, binary.BigEndian, &signed)
  68. if err != nil {
  69. err := fmt.Errorf("KInt.FromByte(): in read []byte, err=\n\t%w", err)
  70. return mL0.NewErr[defs.Int](err)
  71. }
  72. sf.val = defs.Int(signed)
  73. return mL0.NewOk(sf.val)
  74. }
  75. // ToByte -- возвращает как срез байт.
  76. func (sf *KernInt) ToByte() []byte {
  77. buf := make([]byte, 8)
  78. binary.BigEndian.PutUint64(buf, uint64(sf.val))
  79. return buf
  80. }
  81. // FromBool -- устанавливает значение из булева.
  82. func (sf *KernInt) FromBool(isVal bool) defs.Int {
  83. if isVal {
  84. sf.val = -1
  85. return -1
  86. }
  87. sf.val = 0
  88. return 0
  89. }
  90. // ToBool -- возвращает как булево значение.
  91. func (sf *KernInt) ToBool() bool {
  92. return sf.val != 0
  93. }
  94. // Getenv -- устанавливает значение из окружения.
  95. func (sf *KernInt) Getenv(env string) mL0.IResult[defs.Int] {
  96. strVal := os.Getenv(env)
  97. res := sf.FromStr(strVal)
  98. if res.IsErr() {
  99. err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
  100. return mL0.NewErr[defs.Int](err)
  101. }
  102. return mL0.NewOk(sf.val)
  103. }