Explorar o código

SVI Добавление компонентов; 100.0%

SVI hai 1 ano
pai
achega
071f46c6cb

+ 68 - 0
kc/safe_bool_react/safe_bool_react.go

@@ -0,0 +1,68 @@
+// package safe_bool_react -- потокобезопасный булевый признак с реакцией на своё изменение
+package safe_bool_react
+
+import (
+	"sync"
+
+	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+)
+
+// safeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение
+type safeBoolReact struct {
+	sync.RWMutex
+	dict map[string]func(bool) // Словарь обратных вызовов
+	val  bool
+}
+
+// NewSafeBoolReact -- возвращает новый потокобезопасный булевый признак с реакцией на своё изменение
+func NewSafeBoolReact() ISafeBoolReact {
+	sf := &safeBoolReact{
+		dict: map[string]func(bool){},
+	}
+	return sf
+}
+
+// Delete -- удаляет функцию обратного вызова из наблюдения
+func (sf *safeBoolReact) Delete(key string) {
+	sf.Lock()
+	defer sf.Unlock()
+	delete(sf.dict, key)
+}
+
+// Add -- добавляет функцию обратного вызова
+func (sf *safeBoolReact) Add(key string, fn func(bool)) {
+	sf.Lock()
+	defer sf.Unlock()
+	Hassert(key != "", "safeBoolReact.Add(): key is empty")
+	_, isOk := sf.dict[key]
+	Hassert(!isOk, "safeBoolReact.Add(): key already exists")
+	sf.dict[key] = fn
+}
+
+// Get -- возвращает хранимый булевый признак
+func (sf *safeBoolReact) Get() bool {
+	sf.RLock()
+	defer sf.RUnlock()
+	return sf.val
+}
+
+// Set -- устанавливает булевый признак
+func (sf *safeBoolReact) Set() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val = true
+	for _, fn := range sf.dict {
+		fn(true)
+	}
+}
+
+// Reset -- сбрасывает булевый признак
+func (sf *safeBoolReact) Reset() {
+	sf.Lock()
+	defer sf.Unlock()
+	sf.val = false
+	for _, fn := range sf.dict {
+		fn(false)
+	}
+}

+ 91 - 0
kc/safe_bool_react/safe_bool_react_test.go

@@ -0,0 +1,91 @@
+package safe_bool_react
+
+import (
+	"testing"
+
+	. "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
+)
+
+type tester struct {
+	t   *testing.T
+	sbr ISafeBoolReact
+	val bool
+}
+
+func TestSafeBoolReact(t *testing.T) {
+	sf := &tester{
+		t: t,
+	}
+	sf.create()
+	sf.add()
+	sf.set()
+	sf.reset()
+	sf.del()
+}
+
+// Удаляет функцию обратного вызова
+func (sf *tester) del() {
+	sf.t.Log("del")
+	sf.sbr.Delete("test")
+	sf.val = false
+	sf.sbr.Set()
+	if sf.val {
+		sf.t.Fatalf("del(): val==true")
+	}
+}
+
+// Добавляет функцию обратного вызова
+func (sf *tester) add() {
+	sf.t.Log("add")
+	sf.sbr.Add("test", sf.fnBack)
+}
+
+// Функция обратного вызова для контроля
+func (sf *tester) fnBack(val bool) {
+	sf.val = val
+}
+
+// Сбрасывает хранимое значение
+func (sf *tester) reset() {
+	sf.t.Log("reset")
+	sf.sbr.Reset()
+	if sf.sbr.Get() {
+		sf.t.Fatalf("reset(): SafeBool==true")
+	}
+	sf.val = true
+	sf.sbr.Reset()
+	if sf.sbr.Get() {
+		sf.t.Fatalf("reset(): SafeBool==true")
+	}
+	if sf.val {
+		sf.t.Fatalf("reset(): val==true")
+	}
+}
+
+// Установка хранимого значения
+func (sf *tester) set() {
+	sf.t.Log("set")
+	sf.sbr.Set()
+	if !sf.sbr.Get() {
+		sf.t.Fatalf("set(): SafeBool==true")
+	}
+	sf.sbr.Set()
+	if !sf.sbr.Get() {
+		sf.t.Fatalf("set(): SafeBool==true")
+	}
+	if !sf.val {
+		sf.t.Fatalf("set(): val==false")
+	}
+}
+
+// Создаёт потокобезопасный булевый признак
+func (sf *tester) create() {
+	sf.t.Log("create")
+	sf.sbr = NewSafeBoolReact()
+	if sf.sbr == nil {
+		sf.t.Fatalf("create(): SafeBool==nil")
+	}
+	if sf.sbr.Get() {
+		sf.t.Fatalf("create(): SafeBool==true")
+	}
+}

+ 14 - 0
kern.go

@@ -5,6 +5,8 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/kc/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/kc/safe_bool"
+	"gitp78su.ipnodns.ru/svi/kern/kc/safe_bool_react"
+	"gitp78su.ipnodns.ru/svi/kern/kc/safe_int"
 	. "gitp78su.ipnodns.ru/svi/kern/krn/kalias"
 	"gitp78su.ipnodns.ru/svi/kern/krn/kbus/kbus_http"
 	"gitp78su.ipnodns.ru/svi/kern/krn/kbus/kbus_http/client_bus_http"
@@ -130,3 +132,15 @@ func NewLogBuf() ILogBuf {
 	log := log_buf.NewLogBuf()
 	return log
 }
+
+// NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную
+func NewSafeBoolReact() ISafeBoolReact {
+	val := safe_bool_react.NewSafeBoolReact()
+	return val
+}
+
+// NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную
+func NewSafeInt() ISafeInt {
+	val := safe_int.NewSafeInt()
+	return val
+}

+ 8 - 1
kern_test.go

@@ -110,7 +110,14 @@ func (sf *tester) new() {
 	if logBuf == nil {
 		sf.t.Fatalf("new(): ILogBuf==nil")
 	}
-
+	boolReact := NewSafeBoolReact()
+	if boolReact == nil {
+		sf.t.Fatalf("new(): ISafeBoolReact==nil")
+	}
+	safeInt := NewSafeInt()
+	if safeInt == nil {
+		sf.t.Fatalf("new(): ISafeInt==nil")
+	}
 	kernServHttp := NewKernelServerHttp()
 	go kernServHttp.Run()
 	ctx.Cancel()

+ 10 - 0
krn/ktypes/isafe_bool_react.go

@@ -0,0 +1,10 @@
+package ktypes
+
+// ISafeBoolReact -- реактивный потокобезопасный булевый признак
+type ISafeBoolReact interface {
+	ISafeBool
+	// Add -- добавляет функцию обратного вызова
+	Add(key string, fn func(bool))
+	// Delete -- удаляет функцию обратного вызова по ключу
+	Delete(key string)
+}