|
@@ -5,15 +5,15 @@ import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
"sync"
|
|
"sync"
|
|
|
|
|
|
|
|
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
|
|
|
|
|
|
|
+ mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
|
|
|
|
|
|
|
|
- "gitp78su.ipnodns.ru/svi/packer/pkg/types"
|
|
|
|
|
|
|
+ "gitp78su.ipnodns.ru/svi/packer/lev0/types"
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// СловКлючи -- словарь ключей для подстановки
|
|
// СловКлючи -- словарь ключей для подстановки
|
|
|
type СловКлючи struct {
|
|
type СловКлючи struct {
|
|
|
- sync.RWMutex
|
|
|
|
|
- слов map[uint32]bool // Словарь ключей подстановки с частотой встреч (для частотника)
|
|
|
|
|
|
|
+ блок sync.RWMutex
|
|
|
|
|
+ слов map[uint32]uint32 // Словарь ключей подстановки с количеством встреч (для частотника)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
var (
|
|
@@ -21,7 +21,7 @@ var (
|
|
|
блок sync.Mutex
|
|
блок sync.Mutex
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
-// СловКлючиПолуч -- возвращает новый словарь для подстановки ключей
|
|
|
|
|
|
|
+// СловКлючиПолуч -- возвращает новый словарь ключей c количеством встреч
|
|
|
func СловКлючиПолуч() *СловКлючи {
|
|
func СловКлючиПолуч() *СловКлючи {
|
|
|
блок.Lock()
|
|
блок.Lock()
|
|
|
defer блок.Unlock()
|
|
defer блок.Unlock()
|
|
@@ -29,16 +29,16 @@ func СловКлючиПолуч() *СловКлючи {
|
|
|
return сам
|
|
return сам
|
|
|
}
|
|
}
|
|
|
сам = &СловКлючи{
|
|
сам = &СловКлючи{
|
|
|
- слов: map[uint32]bool{},
|
|
|
|
|
|
|
+ слов: map[uint32]uint32{},
|
|
|
}
|
|
}
|
|
|
_ = types.ИСловКлючи(сам)
|
|
_ = types.ИСловКлючи(сам)
|
|
|
return сам
|
|
return сам
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Ключи -- возвращает словарь ключей
|
|
|
|
|
|
|
+// Ключи -- возвращает список ключей
|
|
|
func (сам *СловКлючи) Ключи() []uint32 {
|
|
func (сам *СловКлючи) Ключи() []uint32 {
|
|
|
- сам.RLock()
|
|
|
|
|
- defer сам.RUnlock()
|
|
|
|
|
|
|
+ сам.блок.RLock()
|
|
|
|
|
+ defer сам.блок.RUnlock()
|
|
|
lstKey := make([]uint32, 0, len(сам.слов))
|
|
lstKey := make([]uint32, 0, len(сам.слов))
|
|
|
for key := range сам.слов {
|
|
for key := range сам.слов {
|
|
|
lstKey = append(lstKey, key)
|
|
lstKey = append(lstKey, key)
|
|
@@ -48,46 +48,49 @@ func (сам *СловКлючи) Ключи() []uint32 {
|
|
|
|
|
|
|
|
// ПервичЗаполн -- заполняет первичные ключи
|
|
// ПервичЗаполн -- заполняет первичные ключи
|
|
|
func (сам *СловКлючи) ПервичЗаполн(бинТекст []uint32) {
|
|
func (сам *СловКлючи) ПервичЗаполн(бинТекст []uint32) {
|
|
|
- словПервич := map[int]bool{}
|
|
|
|
|
- for инд := range 256 {
|
|
|
|
|
- словПервич[инд] = true
|
|
|
|
|
|
|
+ сам.блок.Lock()
|
|
|
|
|
+ defer сам.блок.Unlock()
|
|
|
|
|
+ for инд := range uint32(256) {
|
|
|
|
|
+ сам.слов[uint32(инд)] = 0
|
|
|
}
|
|
}
|
|
|
for _, знач := range бинТекст {
|
|
for _, знач := range бинТекст {
|
|
|
- delete(словПервич, int(знач))
|
|
|
|
|
|
|
+ delete(сам.слов, знач)
|
|
|
}
|
|
}
|
|
|
- for ключ := range словПервич {
|
|
|
|
|
- сам.слов[uint32(ключ)] = true
|
|
|
|
|
|
|
+ for _, ключ := range бинТекст {
|
|
|
|
|
+ ключЧаст := сам.слов[ключ]
|
|
|
|
|
+ ключЧаст += 1
|
|
|
|
|
+ сам.слов[ключ] = ключЧаст
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Доб -- добавляет ключ в словарь
|
|
// Доб -- добавляет ключ в словарь
|
|
|
func (сам *СловКлючи) Доб(ключ uint32) {
|
|
func (сам *СловКлючи) Доб(ключ uint32) {
|
|
|
- сам.Lock()
|
|
|
|
|
- defer сам.Unlock()
|
|
|
|
|
|
|
+ сам.блок.Lock()
|
|
|
|
|
+ defer сам.блок.Unlock()
|
|
|
_, еслиЕсть := сам.слов[ключ]
|
|
_, еслиЕсть := сам.слов[ключ]
|
|
|
- Hassert(!еслиЕсть, "СловКлючи.Доб(): ключ(%v) уже есть", ключ)
|
|
|
|
|
- сам.слов[ключ] = true
|
|
|
|
|
|
|
+ mKh.Hassert(!еслиЕсть, "СловКлючи.Доб(): ключ(%v) уже есть", ключ)
|
|
|
|
|
+ сам.слов[ключ] = 0
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Стата -- отдаёт статистику словаря
|
|
// Стата -- отдаёт статистику словаря
|
|
|
func (сам *СловКлючи) Стата() string {
|
|
func (сам *СловКлючи) Стата() string {
|
|
|
- сам.RLock()
|
|
|
|
|
- defer сам.RUnlock()
|
|
|
|
|
|
|
+ сам.блок.RLock()
|
|
|
|
|
+ defer сам.блок.RUnlock()
|
|
|
res := fmt.Sprintf("СловКлючи.Стата(): всего=%v", len(сам.слов))
|
|
res := fmt.Sprintf("СловКлючи.Стата(): всего=%v", len(сам.слов))
|
|
|
return res
|
|
return res
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ЕслиЕсть -- проверяет существует ли такой ключ
|
|
// ЕслиЕсть -- проверяет существует ли такой ключ
|
|
|
func (сам *СловКлючи) ЕслиЕсть(key uint32) bool {
|
|
func (сам *СловКлючи) ЕслиЕсть(key uint32) bool {
|
|
|
- сам.RLock()
|
|
|
|
|
- defer сам.RUnlock()
|
|
|
|
|
|
|
+ сам.блок.RLock()
|
|
|
|
|
+ defer сам.блок.RUnlock()
|
|
|
_, isOk := сам.слов[key]
|
|
_, isOk := сам.слов[key]
|
|
|
return isOk
|
|
return isOk
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Всего -- возвращает размер словаря ключей
|
|
// Всего -- возвращает размер словаря ключей
|
|
|
func (сам *СловКлючи) Всего() int {
|
|
func (сам *СловКлючи) Всего() int {
|
|
|
- сам.RLock()
|
|
|
|
|
- defer сам.RUnlock()
|
|
|
|
|
|
|
+ сам.блок.RLock()
|
|
|
|
|
+ defer сам.блок.RUnlock()
|
|
|
return len(сам.слов)
|
|
return len(сам.слов)
|
|
|
}
|
|
}
|