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