dict_keys.go 2.9 KB

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