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