parsehour.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package parsehour
  2. import (
  3. "fmt"
  4. "strconv"
  5. "sync"
  6. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  7. )
  8. /*
  9. Потокобезопасно парсит из строки значение часа
  10. */
  11. // ParseHour -- потокобезопасный парсер часа из строки
  12. type ParseHour struct {
  13. val int // Значение часа
  14. block sync.RWMutex
  15. }
  16. // NewParseHour -- возвращает новый *ParseHour
  17. func NewParseHour() *ParseHour {
  18. return &ParseHour{}
  19. }
  20. // Get -- возвращает хранимое значение
  21. func (sf *ParseHour) Get() int {
  22. sf.block.RLock()
  23. defer sf.block.RUnlock()
  24. return sf.val
  25. }
  26. // String -- возвращает строковое значение часов
  27. func (sf *ParseHour) String() string {
  28. sf.block.RLock()
  29. defer sf.block.RUnlock()
  30. res := fmt.Sprintf("%02d", sf.val)
  31. return res
  32. }
  33. // Reset -- сбрасывает значение часов
  34. func (sf *ParseHour) Reset() {
  35. sf.block.Lock()
  36. defer sf.block.Unlock()
  37. sf.val = 0
  38. }
  39. // Parse -- устанавливает значение часов
  40. func (sf *ParseHour) Parse(strHour string) {
  41. sf.block.Lock()
  42. defer sf.block.Unlock()
  43. iHour, err := strconv.Atoi(strHour)
  44. Hassert(err == nil, "ParseHour.Parse(): часы(%q) не число, err=\n\t%w", strHour, err)
  45. sf.set(iHour)
  46. }
  47. // Set - -устанавливает числовое значение часов
  48. func (sf *ParseHour) Set(iHour int) {
  49. sf.block.Lock()
  50. defer sf.block.Unlock()
  51. sf.set(iHour)
  52. }
  53. // Внутренняя процедура для числовой установки часов без блокировки
  54. func (sf *ParseHour) set(iHour int) {
  55. Hassert(iHour >= 0, "ParseHour.set(): часы(%v) < 0", iHour)
  56. sf.val = iHour
  57. }