| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // package dict_topic -- потокобезопасный словарь топиков
- package dict_topic
- import (
- "log"
- "sync"
- "p78git.ddns.net/svi/gobus/internal/dict_topic/topic"
- "p78git.ddns.net/svi/gobus/pkg/alias"
- "p78git.ddns.net/svi/gobus/pkg/types"
- )
- // DictTopic -- потокобезопасный словарь топиков
- type DictTopic struct {
- dict map[alias.TopicName]types.ITopic
- block sync.RWMutex
- }
- // NewDictTopic -- возвращает новый потокобезопасный словарь топиков
- func NewDictTopic() (*DictTopic, error) {
- sf := &DictTopic{
- dict: make(map[alias.TopicName]types.ITopic),
- }
- _ = types.IDictTopic(sf)
- return sf, nil
- }
- // Add -- добавляет новый топик
- func (sf *DictTopic) Add(name alias.TopicName) {
- sf.block.Lock()
- defer sf.block.Unlock()
- topic, err := topic.NewTopic(name)
- if err != nil {
- log.Printf("DictTopic.Add(): in create ITopic, err=\n\t%v\n", err)
- return
- }
- sf.dict[name] = topic
- }
- // Get -- возвращае ттопик по имени
- func (sf *DictTopic) Get(name alias.TopicName) types.ITopic {
- sf.block.RLock()
- defer sf.block.RUnlock()
- topic := sf.dict[name]
- return topic
- }
- // Len -- возвращает число всех топиков
- func (sf *DictTopic) Len() int {
- sf.block.RLock()
- defer sf.block.RUnlock()
- return len(sf.dict)
- }
- // Size -- возвращает размер всех тпоиков
- func (sf *DictTopic) Size() int {
- sf.block.RLock()
- defer sf.block.RUnlock()
- res := 0
- for _, topic := range sf.dict {
- res += topic.Size()
- }
- return res
- }
|