Skip to main content

AVxcelerate Simulation Framework 2026 R1 SP01

File topic.h

Last update: 22.04.2026

Location: core/communication/topic.h

Classes

Namespaces

Includes

Included by

Source



#ifndef SIMFWK_CORE_COMMUNICATION_TOPIC_H
#define SIMFWK_CORE_COMMUNICATION_TOPIC_H

#include "core/communication/i_topic.h"
#include <functional>
#include <stdexcept>

namespace simulation_framework
{
namespace core
{

using TopicId = std::string;

template <typename TopicMsgType>
class Topic : public ITopic
{
  public:
    using PublisherCallback = std::function<TopicMsgType()>;
    using SubscriberMessageCallback = std::function<void(const TopicMsgType&)>;
    using TopicMessageType = TopicMsgType;

    Topic(const TopicId& topic_id, const TopicType topic_type = TopicType::kRTIDDS)
        : ITopic{}, topic_id_(topic_id), topic_type_(topic_type)
    {
    }

    TopicId GetId() const override { return topic_id_; }
    TopicType GetType() const override { return topic_type_; }

    void AddPublisher(std::unique_ptr<IPublisher> pub_ptr) override
    {
        if (publishers_.size() == 1)
        {
            throw std::range_error("Already a Publisher for topic " + topic_id_ +
                                   " has been set. Multiple publishers for same topic is NOT allowed! ");
        }
        publishers_.push_back(std::move(pub_ptr));
    }
    void AddSubscriber(std::unique_ptr<ISubscriber> sub_ptr) override { subscribers_.push_back(std::move(sub_ptr)); }

    std::size_t SubscriberCount() const override { return subscribers_.size(); }
    std::size_t PublisherCount() const override { return publishers_.size(); }

    void ClearPubSub() override
    {
        publishers_.clear();
        subscribers_.clear();
    }

    const Subscribers& GetSubscribers() const override { return subscribers_; }
    const Publishers& GetPublishers() const override { return publishers_; }

  private:
    TopicId topic_id_{};
    Subscribers subscribers_{};
    Publishers publishers_{};

    const core::TopicType topic_type_{core::TopicType::kRTIDDS};
};

}  // namespace core
}  // namespace simulation_framework

#endif  // SIMFWK_CORE_COMMUNICATION_TOPIC_H

Connect with Ansys