dict_keys.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // package dict_keys -- словарь ключей для подстановки
  2. package dict_keys
  3. import (
  4. "fmt"
  5. "sync"
  6. mKh "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
  7. "gitp78su.ipnodns.ru/svi/packer/lev0/alias"
  8. "gitp78su.ipnodns.ru/svi/packer/lev0/types"
  9. )
  10. // СловКлючи -- словарь ключей для подстановки
  11. type СловКлючи struct {
  12. блок sync.RWMutex
  13. словКлюч map[alias.ArchKey]bool // Словарь ключей подстановки с количеством встреч (для частотника)
  14. ключТекущ alias.ArchKey // Кандидат на следующий ключ
  15. }
  16. var (
  17. сам *СловКлючи
  18. блок sync.Mutex
  19. )
  20. // СловКлючиПолуч -- возвращает новый словарь ключей c количеством встреч
  21. func СловКлючиПолуч() *СловКлючи {
  22. блок.Lock()
  23. defer блок.Unlock()
  24. if сам != nil {
  25. return сам
  26. }
  27. сам = &СловКлючи{
  28. словКлюч: map[alias.ArchKey]bool{},
  29. }
  30. _ = types.ИСловКлючи(сам)
  31. return сам
  32. }
  33. // Ключи -- возвращает список ключей
  34. func (сам *СловКлючи) Ключи() []alias.ArchKey {
  35. сам.блок.RLock()
  36. defer сам.блок.RUnlock()
  37. lstKey := make([]alias.ArchKey, 0, len(сам.словКлюч))
  38. for key := range сам.словКлюч {
  39. lstKey = append(lstKey, key)
  40. }
  41. return lstKey
  42. }
  43. // ВозможноКлюч -- возвращает возможный ключ словаря
  44. //
  45. // Должен быть отброшен, если такое значение уже есть в архивных значениях
  46. func (сам *СловКлючи) ВозможноКлюч() alias.ArchKey {
  47. defer func() {
  48. сам.ключТекущ += 1
  49. }()
  50. return сам.ключТекущ
  51. }
  52. // Доб -- добавляет ключ в словарь
  53. func (сам *СловКлючи) Доб(ключ alias.ArchKey) {
  54. сам.блок.Lock()
  55. defer сам.блок.Unlock()
  56. _, еслиЕсть := сам.словКлюч[ключ]
  57. mKh.Hassert(!еслиЕсть, "СловКлючи.Доб(): ключ(%v) уже есть", ключ)
  58. сам.словКлюч[ключ] = true
  59. }
  60. // Стата -- отдаёт статистику словаря
  61. func (сам *СловКлючи) Стата() string {
  62. сам.блок.RLock()
  63. defer сам.блок.RUnlock()
  64. res := fmt.Sprintf("СловКлючи.Стата(): всего=%v", len(сам.словКлюч))
  65. return res
  66. }
  67. // ЕслиЕсть -- проверяет существует ли такой ключ
  68. func (сам *СловКлючи) ЕслиЕсть(key alias.ArchKey) bool {
  69. сам.блок.RLock()
  70. defer сам.блок.RUnlock()
  71. _, isOk := сам.словКлюч[key]
  72. return isOk
  73. }
  74. // Всего -- возвращает размер словаря ключей
  75. func (сам *СловКлючи) Всего() int {
  76. сам.блок.RLock()
  77. defer сам.блок.RUnlock()
  78. return len(сам.словКлюч)
  79. }