    

 ## On this page

  

 

 # topic

 Last update: 16.07.2025 

<a id="l00001" name="l00001"></a> 1 

<a id="l00005" name="l00005"></a> 5 

<a id="l00006" name="l00006"></a> 6 \#pragma once

<a id="l00007" name="l00007"></a> 7 

<a id="l00008" name="l00008"></a> 8 \#include "core/communication/i\_topic.h"

<a id="l00009" name="l00009"></a> 9 \#include &lt;functional&gt;

<a id="l00010" name="l00010"></a> 10 \#include &lt;stdexcept&gt;

<a id="l00011" name="l00011"></a> 11 

<a id="l00012" name="l00012"></a> 12 namespace [simulation\_framework](namespacesimulation__framework.xhtml)

<a id="l00013" name="l00013"></a> 13 {

<a id="l00014" name="l00014"></a> 14 namespace [core](namespacecore.xhtml)

<a id="l00015" name="l00015"></a> 15 {

<a id="l00016" name="l00016"></a> 16 

<a id="l00017" name="l00017"></a> 17 using TopicId = std::string;

<a id="l00018" name="l00018"></a> 18 

<a id="l00032" name="l00032"></a> 32 template &lt;typename TopicMsgType&gt;

<a id="l00033" name="l00033"></a>[ 33](classsimulation__framework_1_1core_1_1Topic.xhtml) class [Topic](classsimulation__framework_1_1core_1_1Topic.xhtml) : public [ITopic](classsimulation__framework_1_1core_1_1ITopic.xhtml)

<a id="l00034" name="l00034"></a> 34 {

<a id="l00035" name="l00035"></a> 35 public:

<a id="l00036" name="l00036"></a> 36 using PublisherCallback = std::function&lt;TopicMsgType()&gt;;

<a id="l00037" name="l00037"></a> 37 using SubscriberMessageCallback = std::function&lt;void(const TopicMsgType&amp;)&gt;;

<a id="l00038" name="l00038"></a> 38 using TopicMessageType = TopicMsgType;

<a id="l00039" name="l00039"></a> 39 

<a id="l00040" name="l00040"></a> 40 [Topic](classsimulation__framework_1_1core_1_1Topic.xhtml)(const TopicId&amp; topic_id, const TopicType topic_type = TopicType::kRTIDDS)

<a id="l00041" name="l00041"></a> 41 : [ITopic](classsimulation__framework_1_1core_1_1ITopic.xhtml){}, topic_id_(topic_id), topic_type_(topic_type)

<a id="l00042" name="l00042"></a> 42 {

<a id="l00043" name="l00043"></a> 43 }

<a id="l00044" name="l00044"></a> 44 

<a id="l00045" name="l00045"></a>[ 45](classsimulation__framework_1_1core_1_1Topic.xhtml#a6cef83adabcaab8aabd20cd3184dca3c) TopicId [GetId](classsimulation__framework_1_1core_1_1Topic.xhtml#a6cef83adabcaab8aabd20cd3184dca3c)() const override { return topic_id_; }

<a id="l00046" name="l00046"></a>[ 46](classsimulation__framework_1_1core_1_1Topic.xhtml#a6f459336816bf96dd43d4a827043485d) TopicType [GetType](classsimulation__framework_1_1core_1_1Topic.xhtml#a6f459336816bf96dd43d4a827043485d)() const override { return topic_type_; }

<a id="l00047" name="l00047"></a> 47 

<a id="l00048" name="l00048"></a>[ 48](classsimulation__framework_1_1core_1_1Topic.xhtml#aa43d088454862297433595172d653ac4) void [AddPublisher](classsimulation__framework_1_1core_1_1Topic.xhtml#aa43d088454862297433595172d653ac4)(PublisherPtr pub_ptr) override

<a id="l00049" name="l00049"></a> 49  {

<a id="l00050" name="l00050"></a> 50 if (publishers_.size() == 1)

<a id="l00051" name="l00051"></a> 51 {

<a id="l00052" name="l00052"></a> 52 throw std::range_error("Already a Publisher for topic " + topic_id_ +

<a id="l00053" name="l00053"></a> 53 " has been set. Multiple publishers for same topic is NOT allowed! ");

<a id="l00054" name="l00054"></a> 54 }

<a id="l00055" name="l00055"></a> 55 publishers_.push_back(std::move(pub_ptr));

<a id="l00056" name="l00056"></a> 56 }

<a id="l00057" name="l00057"></a>[ 57](classsimulation__framework_1_1core_1_1Topic.xhtml#a4ef6fa59f00c18ca651be82620d7fc1c) void [AddSubscriber](classsimulation__framework_1_1core_1_1Topic.xhtml#a4ef6fa59f00c18ca651be82620d7fc1c)(SubscriberPtr sub_ptr) override { subscribers_.push_back(std::move(sub_ptr)); }

<a id="l00058" name="l00058"></a> 58 

<a id="l00059" name="l00059"></a>[ 59](classsimulation__framework_1_1core_1_1Topic.xhtml#a71ce3df423a48cbc555cf9fb322726df) std::size_t [SubscriberCount](classsimulation__framework_1_1core_1_1Topic.xhtml#a71ce3df423a48cbc555cf9fb322726df)() const override { return subscribers_.size(); }

<a id="l00060" name="l00060"></a>[ 60](classsimulation__framework_1_1core_1_1Topic.xhtml#a9056b30c90efc165ee8559b41e8a9064) std::size_t [PublisherCount](classsimulation__framework_1_1core_1_1Topic.xhtml#a9056b30c90efc165ee8559b41e8a9064)() const override { return publishers_.size(); }

<a id="l00061" name="l00061"></a> 61 

<a id="l00062" name="l00062"></a>[ 62](classsimulation__framework_1_1core_1_1Topic.xhtml#ac366c5dd53e4c5770b1a5f40ae2c8956) void [ClearPubSub](classsimulation__framework_1_1core_1_1Topic.xhtml#ac366c5dd53e4c5770b1a5f40ae2c8956)() override

<a id="l00063" name="l00063"></a> 63  {

<a id="l00064" name="l00064"></a> 64 publishers_.clear();

<a id="l00065" name="l00065"></a> 65 subscribers_.clear();

<a id="l00066" name="l00066"></a> 66 }

<a id="l00067" name="l00067"></a> 67 

<a id="l00068" name="l00068"></a>[ 68](classsimulation__framework_1_1core_1_1Topic.xhtml#a866d022f0c5454919d3c2b58c63eff72) const Subscribers&amp; [GetSubscribers](classsimulation__framework_1_1core_1_1Topic.xhtml#a866d022f0c5454919d3c2b58c63eff72)() const override { return subscribers_; }

<a id="l00069" name="l00069"></a>[ 69](classsimulation__framework_1_1core_1_1Topic.xhtml#add9a23a5901f71c1161b94c5a19b3ccf) const Publishers&amp; [GetPublishers](classsimulation__framework_1_1core_1_1Topic.xhtml#add9a23a5901f71c1161b94c5a19b3ccf)() const override { return publishers_; }

<a id="l00070" name="l00070"></a> 70 

<a id="l00071" name="l00071"></a> 71 private:

<a id="l00072" name="l00072"></a> 72 TopicId topic_id_{};

<a id="l00073" name="l00073"></a> 73 Subscribers subscribers_{};

<a id="l00074" name="l00074"></a> 74 Publishers publishers_{};

<a id="l00075" name="l00075"></a> 75 

<a id="l00076" name="l00076"></a> 76 const core::TopicType topic_type_{core::TopicType::kRTIDDS};

<a id="l00077" name="l00077"></a> 77 };

<a id="l00078" name="l00078"></a> 78 

<a id="l00079" name="l00079"></a> 79 } // namespace core

<a id="l00080" name="l00080"></a> 80 } // namespace simulation\_framework