archive_stat_combo.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // package archive_stat_combo -- статистика архивных комбо по частоте встречи
  2. package archive_stat_combo
  3. import (
  4. "fmt"
  5. "gitp78su.ipnodns.ru/svi/packer/lev0/alias"
  6. "gitp78su.ipnodns.ru/svi/packer/lev1/archive_combo"
  7. )
  8. // ArchiveStatCombo -- статистика архивных комбо по частоте
  9. type ArchiveStatCombo struct {
  10. dict map[alias.ArchCombo]*archive_combo.ArchiveCombo // Частота встречи комбо
  11. }
  12. // NewArchiveStatVal -- возвращает новую статистику архивных значений
  13. func NewArchiveStatVal(binData []uint32) *ArchiveStatCombo {
  14. dict := map[alias.ArchCombo]*archive_combo.ArchiveCombo{}
  15. valHi := alias.ArchVal(binData[0])
  16. for _, binVal1 := range binData[1:] {
  17. valLow := alias.ArchVal(binVal1)
  18. combo := alias.ArchCombo(valHi*65535 + valLow)
  19. _, isOk := dict[combo]
  20. if isOk {
  21. dict[combo].Inc()
  22. } else {
  23. dict[combo] = archive_combo.NewArchiveCombo(valHi, valLow)
  24. }
  25. valHi = valLow
  26. }
  27. sf := &ArchiveStatCombo{
  28. dict: dict,
  29. }
  30. return sf
  31. }
  32. // Len -- возвращает размер словаря архивных комбо
  33. func (sf *ArchiveStatCombo) Len() int {
  34. return len(sf.dict)
  35. }
  36. // String -- возвращает строковое представление статистики архивных комбо
  37. func (sf *ArchiveStatCombo) String() string {
  38. return fmt.Sprintf("{len=%v}", len(sf.dict))
  39. }
  40. // Max -- возвращает следующее самое частотное значение
  41. func (sf *ArchiveStatCombo) Max() *archive_combo.ArchiveCombo {
  42. var (
  43. val *archive_combo.ArchiveCombo
  44. )
  45. for _, _val := range sf.dict {
  46. if _val.Count() >= val.Count() {
  47. val = _val
  48. }
  49. }
  50. return val
  51. }