safe_int.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // package safe_int -- потокобезопасный целое.
  2. package safe_int
  3. import (
  4. "sync"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  6. )
  7. // safeInt -- потокобезопасное целое.
  8. type safeInt struct {
  9. sync.RWMutex
  10. val lev0.Int
  11. }
  12. // NewSafeInt -- возвращает новое потокобезопасное целое.
  13. func NewSafeInt(val lev0.Int) lev0.ISafeInt {
  14. sf := &safeInt{
  15. val: val,
  16. }
  17. return sf
  18. }
  19. // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
  20. func NewSafeIntFromStr(txtVal *lev0.LTxt) *lev0.Result[lev0.ISafeInt] {
  21. sf := NewSafeInt(0)
  22. res := sf.FromStr(txtVal)
  23. if res.IsErr() {
  24. err := lev0.LetErr("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", txtVal, res.Err())
  25. return lev0.ResErr[lev0.ISafeInt](err)
  26. }
  27. return lev0.ResOk(sf)
  28. }
  29. // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
  30. func NewSafeIntGetenv(env *lev0.LTxt) *lev0.Result[lev0.ISafeInt] {
  31. sf := NewSafeInt(0)
  32. res := sf.Getenv(env)
  33. if res.IsErr() {
  34. err := lev0.LetErr("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
  35. return lev0.ResErr[lev0.ISafeInt](err)
  36. }
  37. return lev0.ResOk(sf)
  38. }
  39. // FromBool -- устанавливает значение из булева значения.
  40. func (sf *safeInt) FromBool(val lev0.LBool) lev0.Int {
  41. sf.Lock()
  42. defer sf.Unlock()
  43. if val.IsOk() {
  44. sf.val = 1
  45. return 1
  46. }
  47. sf.val = 0
  48. return 0
  49. }
  50. // Get -- возвращает хранимое целое.
  51. func (sf *safeInt) Get() lev0.Int {
  52. sf.RLock()
  53. defer sf.RUnlock()
  54. return sf.val
  55. }
  56. // Dec -- уменьшает значение на 1.
  57. func (sf *safeInt) Dec() {
  58. sf.Lock()
  59. defer sf.Unlock()
  60. sf.val--
  61. }
  62. // Inc -- увеличивает значение на 1.
  63. func (sf *safeInt) Inc() {
  64. sf.Lock()
  65. defer sf.Unlock()
  66. sf.val++
  67. }
  68. // Set -- устанавливает целое.
  69. func (sf *safeInt) Set(val lev0.Int) {
  70. sf.Lock()
  71. defer sf.Unlock()
  72. sf.val = val
  73. }
  74. // Reset -- сбрасывает целое.
  75. func (sf *safeInt) Reset() {
  76. sf.Lock()
  77. defer sf.Unlock()
  78. sf.val=0
  79. }
  80. // FromStr -- получает число из строки.
  81. func (sf *safeInt) FromStr(txtVal *lev0.LTxt) *lev0.Result[lev0.Int] {
  82. sf.Lock()
  83. defer sf.Unlock()
  84. res:=txtVal.Atoi()
  85. if res.Err!=nil {
  86. err:=lev0.LetErr("safeInt.FromStr(): form str(%v) to int, err=\n\t%v", txtVal, res.Error())
  87. return lev0.ResErr[lev0.Int](err)
  88. }
  89. sf.val=res.Ok()
  90. return lev0.ResOk(sf.val)
  91. }
  92. // FromByte -- получает число из среза байт.
  93. func (sf *safeInt) FromByte(binData []byte) *lev0.Result[lev0.Int] {
  94. sf.Lock()
  95. defer sf.Unlock()
  96. res:=binData.ToInt()
  97. if res.Err!=nil {
  98. err:=lev0.LetErr("safeInt.FromByte(): form binData(%v) to int", binData, res.Error())
  99. return lev0.ResErr[lev0.Int](err)
  100. }
  101. sf.val=res.Ok()
  102. return lev0.ResOk(sf.val)
  103. }
  104. // ToByte -- конвертирует число в срез байт.
  105. func (sf *safeInt) ToByte() []byte {
  106. sf.RLock()
  107. defer sf.RUnlock()
  108. return sf.val.ToByte()
  109. }
  110. // ToBool -- конвертирует число в bool.
  111. func (sf *safeInt) ToBool() lev0.Bool {
  112. sf.RLock()
  113. defer sf.RUnlock()
  114. return sf.val.ToBool()
  115. }
  116. // ToStr -- конвертирует число в строку.
  117. func (sf *safeInt) ToStr() *lev0.LTxt {
  118. sf.RLock()
  119. defer sf.RUnlock()
  120. return sf.val.ToStr()
  121. }
  122. // Getenv -- получает значение из окружения.
  123. func (sf *safeInt) Getenv(env *lev0.LTxt) *lev0.Result[lev0.Int] {
  124. sf.Lock()
  125. defer sf.Unlock()
  126. return sf.val.Getenv(env)
  127. }