File topic_route.hpp

File List > astutedds > routing > topic_route.hpp

Go to the documentation of this file

//
// Copyright (c) 2026, Astute Systems PTY LTD
//
// This file is part of the Astute DDS developed by Astute Systems.
//
// See the commercial LICENSE file in the project root for full license details.
//
// @file topic_route.hpp
// @brief TopicRoute: bridges a single topic between two DomainParticipants.
//
// A TopicRoute subscribes to one topic on the input participant and
// republishes every received sample on the output participant.  An optional
// TransformPlugin may modify or drop samples before forwarding.
//

#ifndef ASTUTEDDS_ROUTING_TOPIC_ROUTE_HPP
#define ASTUTEDDS_ROUTING_TOPIC_ROUTE_HPP

#include <astutedds/routing/routing_config.hpp>
#include <astutedds/routing/transform_plugin.hpp>

#include <astutedds/dcps/dcps.hpp>

#include <atomic>
#include <memory>
#include <string>

namespace astutedds::routing
{

class TopicRoute
{
public:
    TopicRoute(const TopicRouteConfig& cfg,
               dcps::DomainParticipant* input_participant,
               dcps::DomainParticipant* output_participant);

    ~TopicRoute();

    // Non-copyable, non-movable (owns raw DDS entity pointers)
    TopicRoute(const TopicRoute&) = delete;
    TopicRoute& operator=(const TopicRoute&) = delete;
    TopicRoute(TopicRoute&&) = delete;
    TopicRoute& operator=(TopicRoute&&) = delete;

    bool start();

    void stop();

    // ── Optional transform ────────────────────────────────────────────────

    void set_transform(std::unique_ptr<TransformPlugin> plugin);

    // ── Accessors ─────────────────────────────────────────────────────────

    const TopicRouteConfig& config() const { return config_; }
    bool is_running() const { return running_.load(); }

    uint64_t samples_routed() const { return samples_routed_.load(); }

    uint64_t samples_dropped() const { return samples_dropped_.load(); }

private:
    void on_data_available(const dcps::ReceivedSample& sample);

    TopicRouteConfig config_;
    dcps::DomainParticipant* input_participant_;
    dcps::DomainParticipant* output_participant_;

    // DDS entities (non-owning; owned by the respective participants)
    dcps::Topic*      input_topic_{nullptr};
    dcps::Topic*      output_topic_{nullptr};
    dcps::Subscriber* subscriber_{nullptr};
    dcps::Publisher*  publisher_{nullptr};
    dcps::DataReader* reader_{nullptr};
    dcps::DataWriter* writer_{nullptr};

    std::unique_ptr<TransformPlugin> transform_;

    std::atomic<bool>     running_{false};
    std::atomic<uint64_t> samples_routed_{0};
    std::atomic<uint64_t> samples_dropped_{0};
};

} // namespace astutedds::routing

#endif // ASTUTEDDS_ROUTING_TOPIC_ROUTE_HPP