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