dict_keys.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // package dict_keys -- словарь ключей для подстановки
  2. package dict_keys
  3. import (
  4. "fmt"
  5. "sync"
  6. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  7. "gitp78su.ipnodns.ru/svi/packer/pkg/types"
  8. )
  9. // СловКлючи -- словарь ключей для подстановки
  10. type СловКлючи struct {
  11. sync.RWMutex
  12. слов map[uint32]bool // Словарь ключей подстановки с частотой встреч (для частотника)
  13. }
  14. var (
  15. сам *СловКлючи
  16. блок sync.Mutex
  17. )
  18. // СловКлючиПолуч -- возвращает новый словарь для подстановки ключей
  19. func СловКлючиПолуч() *СловКлючи {
  20. блок.Lock()
  21. defer блок.Unlock()
  22. if сам != nil {
  23. return сам
  24. }
  25. сам = &СловКлючи{
  26. слов: map[uint32]bool{},
  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. словПервич := map[int]bool{}
  44. for инд := range 256 {
  45. словПервич[инд] = true
  46. }
  47. for _, знач := range бинТекст {
  48. delete(словПервич, int(знач))
  49. }
  50. for ключ := range словПервич {
  51. сам.слов[uint32(ключ)] = true
  52. }
  53. }
  54. // Доб -- добавляет ключ в словарь
  55. func (сам *СловКлючи) Доб(ключ uint32) {
  56. сам.Lock()
  57. defer сам.Unlock()
  58. _, еслиЕсть := сам.слов[ключ]
  59. Hassert(!еслиЕсть, "СловКлючи.Доб(): ключ(%v) уже есть", ключ)
  60. сам.слов[ключ] = true
  61. }
  62. // Стата -- отдаёт статистику словаря
  63. func (сам *СловКлючи) Стата() string {
  64. сам.RLock()
  65. defer сам.RUnlock()
  66. res := fmt.Sprintf("СловКлючи.Стата(): всего=%v", len(сам.слов))
  67. return res
  68. }
  69. // ЕслиЕсть -- проверяет существует ли такой ключ
  70. func (сам *СловКлючи) ЕслиЕсть(key uint32) bool {
  71. сам.RLock()
  72. defer сам.RUnlock()
  73. _, isOk := сам.слов[key]
  74. return isOk
  75. }
  76. // Всего -- возвращает размер словаря ключей
  77. func (сам *СловКлючи) Всего() int {
  78. сам.RLock()
  79. defer сам.RUnlock()
  80. return len(сам.слов)
  81. }