safe_int.go 3.9 KB

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