|
@@ -3,28 +3,29 @@ package safe_int
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
- "os"
|
|
|
|
|
- "strconv"
|
|
|
|
|
"sync"
|
|
"sync"
|
|
|
|
|
|
|
|
|
|
+ "gitp78su.ipnodns.ru/svi/kern/v3/krn/kint"
|
|
|
. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
|
|
. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// safeInt -- потокобезопасное целое
|
|
// safeInt -- потокобезопасное целое
|
|
|
type safeInt struct {
|
|
type safeInt struct {
|
|
|
sync.RWMutex
|
|
sync.RWMutex
|
|
|
- val int
|
|
|
|
|
|
|
+ val Int
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// NewSafeInt -- возвращает новое потокобезопасное целое
|
|
// NewSafeInt -- возвращает новое потокобезопасное целое
|
|
|
-func NewSafeInt() ISafeInt {
|
|
|
|
|
- sf := &safeInt{}
|
|
|
|
|
|
|
+func NewSafeInt(val int) ISafeInt {
|
|
|
|
|
+ sf := &safeInt{
|
|
|
|
|
+ val: kint.NewInt(val),
|
|
|
|
|
+ }
|
|
|
return sf
|
|
return sf
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// NewSafeIntFromStr -- возвращает новое потокобезоппсное целое из строки
|
|
|
|
|
|
|
+// NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки
|
|
|
func NewSafeIntFromStr(strVal string) Result[ISafeInt] {
|
|
func NewSafeIntFromStr(strVal string) Result[ISafeInt] {
|
|
|
- sf := NewSafeInt()
|
|
|
|
|
|
|
+ sf := NewSafeInt(0)
|
|
|
res := sf.FromStr(strVal)
|
|
res := sf.FromStr(strVal)
|
|
|
if res.IsErr() {
|
|
if res.IsErr() {
|
|
|
err := fmt.Errorf("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
|
|
err := fmt.Errorf("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
|
|
@@ -33,9 +34,9 @@ func NewSafeIntFromStr(strVal string) Result[ISafeInt] {
|
|
|
return NewOk(sf)
|
|
return NewOk(sf)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// NewSafeIntGetenv -- возвращает новое потокобезоппсное целое из окружения
|
|
|
|
|
|
|
+// NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения
|
|
|
func NewSafeIntGetenv(env string) Result[ISafeInt] {
|
|
func NewSafeIntGetenv(env string) Result[ISafeInt] {
|
|
|
- sf := NewSafeInt()
|
|
|
|
|
|
|
+ sf := NewSafeInt(0)
|
|
|
res := sf.Getenv(env)
|
|
res := sf.Getenv(env)
|
|
|
if res.IsErr() {
|
|
if res.IsErr() {
|
|
|
err := fmt.Errorf("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
|
|
err := fmt.Errorf("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
|
|
@@ -44,46 +45,86 @@ func NewSafeIntGetenv(env string) Result[ISafeInt] {
|
|
|
return NewOk(sf)
|
|
return NewOk(sf)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// FromBool -- устанавливает значение из булева значения
|
|
|
|
|
+func (sf *safeInt) FromBool(val bool) int {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ return sf.val.FromBool(val)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// Get -- возвращает хранимое целое
|
|
// Get -- возвращает хранимое целое
|
|
|
func (sf *safeInt) Get() int {
|
|
func (sf *safeInt) Get() int {
|
|
|
sf.RLock()
|
|
sf.RLock()
|
|
|
defer sf.RUnlock()
|
|
defer sf.RUnlock()
|
|
|
- return sf.val
|
|
|
|
|
|
|
+ return sf.val.Get()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Dec -- уменьшает значение на 1
|
|
|
|
|
+func (sf *safeInt) Dec() {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ sf.val.Dec()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Inc -- увеличивает значение на 1
|
|
|
|
|
+func (sf *safeInt) Inc() {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ sf.val.Inc()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Set -- устанавливает целое
|
|
// Set -- устанавливает целое
|
|
|
func (sf *safeInt) Set(val int) {
|
|
func (sf *safeInt) Set(val int) {
|
|
|
sf.Lock()
|
|
sf.Lock()
|
|
|
defer sf.Unlock()
|
|
defer sf.Unlock()
|
|
|
- sf.val = val
|
|
|
|
|
|
|
+ sf.val.Set(val)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Reset -- сбрасывает целое
|
|
// Reset -- сбрасывает целое
|
|
|
func (sf *safeInt) Reset() {
|
|
func (sf *safeInt) Reset() {
|
|
|
sf.Lock()
|
|
sf.Lock()
|
|
|
defer sf.Unlock()
|
|
defer sf.Unlock()
|
|
|
- sf.val = 0
|
|
|
|
|
|
|
+ sf.val.Reset()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// FromStr -- получает число из строки
|
|
// FromStr -- получает число из строки
|
|
|
func (sf *safeInt) FromStr(strVal string) Result[int] {
|
|
func (sf *safeInt) FromStr(strVal string) Result[int] {
|
|
|
- iVal, err := strconv.Atoi(strVal)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return NewErr[int](fmt.Errorf("safeInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err))
|
|
|
|
|
- }
|
|
|
|
|
sf.Lock()
|
|
sf.Lock()
|
|
|
defer sf.Unlock()
|
|
defer sf.Unlock()
|
|
|
- sf.val = iVal
|
|
|
|
|
- return NewOk(sf.val)
|
|
|
|
|
|
|
+ return sf.val.FromStr(strVal)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// FromByte -- получает число из среза байт
|
|
|
|
|
+func (sf *safeInt) FromByte(binData []byte) Result[int] {
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ return sf.val.FromByte(binData)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ToByte -- конвертирует число в срез байт
|
|
|
|
|
+func (sf *safeInt) ToByte() []byte {
|
|
|
|
|
+ sf.RLock()
|
|
|
|
|
+ defer sf.RUnlock()
|
|
|
|
|
+ return sf.val.ToByte()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ToBool -- конвертирует число в bool
|
|
|
|
|
+func (sf *safeInt) ToBool() bool {
|
|
|
|
|
+ sf.RLock()
|
|
|
|
|
+ defer sf.RUnlock()
|
|
|
|
|
+ return sf.val.ToBool()
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ToStr -- конвертирует число в строку
|
|
|
|
|
+func (sf *safeInt) ToStr() string {
|
|
|
|
|
+ sf.RLock()
|
|
|
|
|
+ defer sf.RUnlock()
|
|
|
|
|
+ return sf.val.ToStr()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Getenv -- получает значение из окружения
|
|
// Getenv -- получает значение из окружения
|
|
|
func (sf *safeInt) Getenv(env string) Result[int] {
|
|
func (sf *safeInt) Getenv(env string) Result[int] {
|
|
|
- strVal := os.Getenv(env)
|
|
|
|
|
- res := sf.FromStr(strVal)
|
|
|
|
|
- if res.IsErr() {
|
|
|
|
|
- err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
|
|
|
|
|
- return NewErr[int](err)
|
|
|
|
|
- }
|
|
|
|
|
- return res
|
|
|
|
|
|
|
+ sf.Lock()
|
|
|
|
|
+ defer sf.Unlock()
|
|
|
|
|
+ return sf.val.Getenv(env)
|
|
|
}
|
|
}
|