// 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(сам.слов) }