safe_num.go 4.3 KB

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