safe_int.go 3.3 KB

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