dict_topic.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // package dict_topic -- потокобезопасный словарь топиков
  2. package dict_topic
  3. import (
  4. "log"
  5. "sync"
  6. "p78git.ddns.net/svi/gobus/internal/dict_topic/topic"
  7. "p78git.ddns.net/svi/gobus/pkg/alias"
  8. "p78git.ddns.net/svi/gobus/pkg/types"
  9. )
  10. // DictTopic -- потокобезопасный словарь топиков
  11. type DictTopic struct {
  12. dict map[alias.TopicName]types.ITopic
  13. block sync.RWMutex
  14. }
  15. // NewDictTopic -- возвращает новый потокобезопасный словарь топиков
  16. func NewDictTopic() (*DictTopic, error) {
  17. sf := &DictTopic{
  18. dict: make(map[alias.TopicName]types.ITopic),
  19. }
  20. _ = types.IDictTopic(sf)
  21. return sf, nil
  22. }
  23. // Add -- добавляет новый топик
  24. func (sf *DictTopic) Add(name alias.TopicName) {
  25. sf.block.Lock()
  26. defer sf.block.Unlock()
  27. topic, err := topic.NewTopic(name)
  28. if err != nil {
  29. log.Printf("DictTopic.Add(): in create ITopic, err=\n\t%v\n", err)
  30. return
  31. }
  32. sf.dict[name] = topic
  33. }
  34. // Get -- возвращае ттопик по имени
  35. func (sf *DictTopic) Get(name alias.TopicName) types.ITopic {
  36. sf.block.RLock()
  37. defer sf.block.RUnlock()
  38. topic := sf.dict[name]
  39. return topic
  40. }
  41. // Len -- возвращает число всех топиков
  42. func (sf *DictTopic) Len() int {
  43. sf.block.RLock()
  44. defer sf.block.RUnlock()
  45. return len(sf.dict)
  46. }
  47. // Size -- возвращает размер всех тпоиков
  48. func (sf *DictTopic) Size() int {
  49. sf.block.RLock()
  50. defer sf.block.RUnlock()
  51. res := 0
  52. for _, topic := range sf.dict {
  53. res += topic.Size()
  54. }
  55. return res
  56. }