safe_int.go 3.1 KB

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