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