#pragma once #include "ddkit/access/ITopic.hpp" #include "ddkit/access/IQosStrategy.hpp" #include "ddkit/access/TopicStrategy.hpp" #include "ddkit/access/Topic.hpp" // Topic is included and only forward declares Reader,Writer - for writing-only-users we additionaly need the read-side // for template-instantiiation ... so include everything just in case ... #include "ddkit/access/Reader.hpp" #include "ddkit/access/Writer.hpp" #include "ddkit/utils/string.hpp" namespace ddkit { namespace access { // TopicPool very well could be the (abstract) base-class for TopicPoolRead and TopicPoolWrite again class TopicPool final { public: TopicPool( dds::domain::DomainParticipant& domainParticipant, const IQosStrategyPtr& qosStrategy, const ITopicStrategyPtr& topicStrategy); template std::string getTopicName() { DDKIT_LOG_TRACE; std::string className = dds::topic::topic_type_name::value(); ddkit::log::trace() << DDKIT_LOG_VAR_VALUE(className); std::string topicName = m_topicStrategy->get(className); ddkit::log::trace() << DDKIT_LOG_VAR_VALUE(topicName); TopicStrategyMapChars topicStrategyMapChars; std::string topicNameSafe = topicStrategyMapChars.get(topicName); ddkit::log::trace() << DDKIT_LOG_VAR_VALUE(topicNameSafe); return topicNameSafe; } /// @brief create or get template std::shared_ptr> topic() { DDKIT_LOG_TRACE; std::string topicName = getTopicName(); if (!hasTopic(topicName)) { std::string className = dds::topic::topic_type_name::value(); ddkit::utils::string::removePrefixIf(className, "VendorData::"); std::string::size_type pos = className.rfind("::"); std::string partFirst = (pos == std::string::npos) ? "no-module" : className.substr(0, pos); std::string partLast = (pos == std::string::npos) ? className : className.substr(pos + 2); std::string topicNameModule = partFirst; std::string topicNameTopic = partLast; m_name2topic.insert(std::make_pair(topicName, std::make_shared>( m_domainParticipant, topicName, topicNameModule, topicNameTopic, m_qosStrategy->selectQosPattern(className).qosTopic() ))); } return std::dynamic_pointer_cast>(getTopic(topicName)); } QosPattern qosPattern(const std::string& typeName) { return m_qosStrategy->selectQosPattern(typeName); } template // probably not needed with template-param QosPattern qosPattern() { std::string typeName = dds::topic::topic_type_name::value(); return qosPattern(typeName); } bool hasTopic(const std::string& topicName); std::shared_ptr getTopic(const std::string& topicName); bool hasReaders(); void closeReaders(); void closeWriters(); void unloadReaders(); private: dds::domain::DomainParticipant& m_domainParticipant; IQosStrategyPtr m_qosStrategy; ITopicStrategyPtr m_topicStrategy; std::recursive_mutex m_mutex; std::map> m_name2topic; // no copying TopicPool(TopicPool const&) = delete; TopicPool(TopicPool&&) = delete; void operator=(TopicPool const&) = delete; }; typedef std::shared_ptr TopicPoolPtr; } // namespace access } // namespace ddkit