#pragma once // Include Qt headers FIRST to prevent namespace pollution when RTI DDS headers include Qt #include #include #include #include #include namespace NGLLogger { class INGLLogger; } namespace DTC { class SubscriberListener; template class GenericDtcSC { public: using DataReaderObject = DRO_OBJECT; using SubscriberCallback = SC; using TopicType = typename DRO_OBJECT::TopicType; GenericDtcSC() = default; virtual ~GenericDtcSC() = default; virtual bool setSubscriberCallback(const SubscriberCallback& subscriberCallback) = 0; virtual dds::sub::LoanedSamples readAlive() const = 0; virtual bool readAlive(TopicType& data) = 0; virtual dds::sub::LoanedSamples takeAlive() const = 0; virtual bool takeAlive(TopicType& data) = 0; virtual dds::sub::LoanedSamples takeDisposed() const = 0; virtual bool takeDisposed(TopicType& data) = 0; virtual bool hasSamples() const = 0; virtual DataReaderObject* dataReader() const = 0; virtual bool waitForHistoricalData(int timeoutMSec) = 0; }; template class GenericDtc : public GenericDtcSC> { public: using BaseClass = GenericDtcSC>; using TopicType = typename BaseClass::TopicType; // Explicitly expose base class methods for accessibility through smart pointers using BaseClass::readAlive; using BaseClass::takeAlive; using BaseClass::takeDisposed; using BaseClass::SubscriberCallback; bool setSubscriberCallback(const typename BaseClass::SubscriberCallback& callback) override { return BaseClass::setSubscriberCallback(callback); } bool readAlive(TopicType& data) { return BaseClass::readAlive(data); } bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); } bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); } bool hasSamples() const { return BaseClass::hasSamples(); } std::shared_ptr dataReader() { return BaseClass::dataReader(); } bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); } }; template class GenericDtcSampleInfo : public GenericDtcSC> { public: using BaseClass = GenericDtcSC>; using TopicType = typename BaseClass::TopicType; // Explicitly expose base class methods for accessibility through smart pointers using BaseClass::readAlive; using BaseClass::takeAlive; using BaseClass::takeDisposed; void setSubscriberCallback(std::function callback) { BaseClass::setSubscriberCallback(callback); } bool readAlive(TopicType& data) { return BaseClass::readAlive(data); } bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); } bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); } bool hasSamples() const { return BaseClass::hasSamples(); } std::shared_ptr dataReader() { return BaseClass::dataReader(); } bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); } }; template class Ddtc : public GenericDtcSC< DRO_OBJECT, std::function> { public: using BaseClass = GenericDtcSC>; using TopicType = typename BaseClass::TopicType; // Explicitly expose base class methods for accessibility through smart pointers using BaseClass::readAlive; using BaseClass::takeAlive; using BaseClass::takeDisposed; void setSubscriberCallback(std::function callback) { BaseClass::setSubscriberCallback(callback); } bool readAlive(TopicType& data) { return BaseClass::readAlive(data); } bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); } bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); } bool hasSamples() const { return BaseClass::hasSamples(); } std::shared_ptr dataReader() { return BaseClass::dataReader(); } bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); } }; template class DdtcSampleInfo : public GenericDtcSC> { public: using BaseClass = GenericDtcSC>; using TopicType = typename BaseClass::TopicType; // Explicitly expose base class methods for accessibility through smart pointers using BaseClass::readAlive; using BaseClass::takeAlive; using BaseClass::takeDisposed; void setSubscriberCallback(std::function callback) { BaseClass::setSubscriberCallback(callback); } bool readAlive(TopicType& data) { return BaseClass::readAlive(data); } bool takeAlive(TopicType& data) { return BaseClass::takeAlive(data); } bool takeDisposed(TopicType& data) { return BaseClass::takeDisposed(data); } bool hasSamples() const { return BaseClass::hasSamples(); } std::shared_ptr dataReader() { return BaseClass::dataReader(); } bool waitForHistoricalData(int timeoutMSec) { return BaseClass::waitForHistoricalData(timeoutMSec); } }; } // namespace DTC