safe_int.go 3.3 KB

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