safe_num.go 4.2 KB

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