File builtin_topic_data.hpp

File List > astutedds > dcps > builtin_topic_data.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 builtin_topic_data.hpp
// @brief OMG DDS 1.4 built-in topic data structures (§2.2.2.2.1)
//
// These structures carry the QoS + identification information that DDS
// applications retrieve via the discovery/introspection APIs on
// DomainParticipant, DataWriter and DataReader:
//   - ParticipantBuiltinTopicData    §2.2.2.2.1  (DCPSParticipant)
//   - TopicBuiltinTopicData          §2.2.2.2.1  (DCPSTopic)
//   - PublicationBuiltinTopicData    §2.2.2.2.1  (DCPSPublication)
//   - SubscriptionBuiltinTopicData   §2.2.2.2.1  (DCPSSubscription)
//
// The structures mirror the OMG IDL closely.  Fields not tracked by the
// current AstuteDDS discovery pipeline are exposed with sensible spec-
// default values so callers can still consume them uniformly.
//

#ifndef ASTUTEDDS_DCPS_BUILTIN_TOPIC_DATA_HPP
#define ASTUTEDDS_DCPS_BUILTIN_TOPIC_DATA_HPP

#include <astutedds/dcps/qos.hpp>
#include <astutedds/dcps/dds_psm_types.hpp>
#include <astutedds/rtps/rtps_types.hpp>

#include <cstdint>
#include <string>
#include <vector>

namespace astutedds::dcps
{
    // BuiltinTopicKey_t is defined by the DDS 1.4 PSM (§2.3.3) as
    // `long[3]` — 12 bytes — and is already declared as
    // `std::array<int32_t, 3>` in dds_psm_types.hpp.  We pack the 12-byte
    // RTPS guidPrefix into these three int32s so a full 128-bit endpoint
    // GUID is derivable when combined with topic/entity context.

    inline BuiltinTopicKey_t guid_to_builtin_key(const rtps::GUID_t& g) noexcept
    {
        BuiltinTopicKey_t k{};
        // Pack the 12-byte guidPrefix into three big-endian int32_ts so the
        // resulting key is stable and endian-portable across processes.
        for (int i = 0; i < 3; ++i)
        {
            const int base = i * 4;
            k[i] = (static_cast<int32_t>(g.guidPrefix.value[base]) << 24)
                 | (static_cast<int32_t>(g.guidPrefix.value[base + 1]) << 16)
                 | (static_cast<int32_t>(g.guidPrefix.value[base + 2]) << 8)
                 | (static_cast<int32_t>(g.guidPrefix.value[base + 3]));
        }
        return k;
    }

    struct ParticipantBuiltinTopicData
    {
        BuiltinTopicKey_t key{};
        UserDataQosPolicy user_data{};
    };

    struct TopicBuiltinTopicData
    {
        BuiltinTopicKey_t key{};
        std::string name;
        std::string type_name;
        DurabilityQosPolicy durability{};
        DurabilityServiceQosPolicy durability_service{};
        DeadlineQosPolicy deadline{};
        LatencyBudgetQosPolicy latency_budget{};
        LivelinessQosPolicy liveliness{};
        ReliabilityQosPolicy reliability{};
        TransportPriorityQosPolicy transport_priority{};
        LifespanQosPolicy lifespan{};
        DestinationOrderQosPolicy destination_order{};
        HistoryQosPolicy history{};
        ResourceLimitsQosPolicy resource_limits{};
        OwnershipQosPolicy ownership{};
        TopicDataQosPolicy topic_data{};
        DataRepresentationQosPolicy representation{};
    };

    struct PublicationBuiltinTopicData
    {
        BuiltinTopicKey_t key{};            // remote DataWriter GUID
        BuiltinTopicKey_t participant_key{}; // owning DomainParticipant GUID
        std::string topic_name;
        std::string type_name;
        DurabilityQosPolicy durability{};
        DurabilityServiceQosPolicy durability_service{};
        DeadlineQosPolicy deadline{};
        LatencyBudgetQosPolicy latency_budget{};
        LivelinessQosPolicy liveliness{};
        ReliabilityQosPolicy reliability{};
        LifespanQosPolicy lifespan{};
        UserDataQosPolicy user_data{};
        OwnershipQosPolicy ownership{};
        OwnershipStrengthQosPolicy ownership_strength{};
        DestinationOrderQosPolicy destination_order{};
        PresentationQosPolicy presentation{};
        PartitionQosPolicy partition{};
        TopicDataQosPolicy topic_data{};
        GroupDataQosPolicy group_data{};
        DataRepresentationQosPolicy representation{};
    };

    struct SubscriptionBuiltinTopicData
    {
        BuiltinTopicKey_t key{};            // remote DataReader GUID
        BuiltinTopicKey_t participant_key{}; // owning DomainParticipant GUID
        std::string topic_name;
        std::string type_name;
        DurabilityQosPolicy durability{};
        DeadlineQosPolicy deadline{};
        LatencyBudgetQosPolicy latency_budget{};
        LivelinessQosPolicy liveliness{};
        ReliabilityQosPolicy reliability{};
        OwnershipQosPolicy ownership{};
        DestinationOrderQosPolicy destination_order{};
        UserDataQosPolicy user_data{};
        TimeBasedFilterQosPolicy time_based_filter{};
        PresentationQosPolicy presentation{};
        PartitionQosPolicy partition{};
        TopicDataQosPolicy topic_data{};
        GroupDataQosPolicy group_data{};
        DataRepresentationQosPolicy representation{};
        TypeConsistencyEnforcementQosPolicy type_consistency{};
    };

}  // namespace astutedds::dcps

#endif  // ASTUTEDDS_DCPS_BUILTIN_TOPIC_DATA_HPP