10#include <fastdds/dds/topic/TopicDataType.hpp>
11#include <fastrtps/rtps/common/SerializedPayload.h>
12#include <fastcdr/FastBuffer.h>
13#include <fastcdr/Cdr.h>
28template<
typename MsgType>
37 const uint32_t max_payload =
static_cast<uint32_t
>(
41 m_typeSize = max_payload +
42 static_cast<uint32_t
>(
43 eprosima::fastcdr::Cdr::alignment(max_payload, 4u)) +
45 m_isGetKeyDefined =
false;
60 const MsgType* msg =
static_cast<const MsgType*
>(data);
63 eprosima::fastcdr::FastBuffer fb;
67 eprosima::fastcdr::Cdr ser(
69 eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS,
70 eprosima::fastcdr::CdrVersion::XCDRv1);
71 payload->encapsulation = CDR_LE;
74 ser.serialize_encapsulation();
76 }
catch (eprosima::fastcdr::exception::Exception& ) {
80 const uint32_t len =
static_cast<uint32_t
>(ser.get_serialized_data_length());
81 if (len > payload->max_size) {
84 std::memcpy(payload->data, fb.getBuffer(), len);
85 payload->length = len;
97 eprosima::fastdds::dds::DataRepresentationId_t )
106 void* data)
override {
107 MsgType* msg =
static_cast<MsgType*
>(data);
109 eprosima::fastcdr::FastBuffer fastbuffer(
110 reinterpret_cast<char*
>(payload->data),
111 static_cast<size_t>(payload->length));
116 eprosima::fastcdr::Cdr deser(
118 eprosima::fastcdr::Cdr::LITTLE_ENDIANNESS,
119 eprosima::fastcdr::CdrVersion::XCDRv1);
122 deser.read_encapsulation();
123 payload->encapsulation = (deser.endianness() ==
124 eprosima::fastcdr::Cdr::BIG_ENDIANNESS) ? CDR_BE : CDR_LE;
126 }
catch (eprosima::fastcdr::exception::Exception& ) {
138 const MsgType* msg =
static_cast<const MsgType*
>(data);
139 return [msg]() -> uint32_t {
149 eprosima::fastdds::dds::DataRepresentationId_t )
156 return static_cast<void*
>(
new MsgType());
161 delete static_cast<MsgType*
>(data);
167 eprosima::fastrtps::rtps::InstanceHandle_t* ,
Generic FastDDS TopicDataType that serializes carla::ros2::msg::* POD structs directly to CDR via Cdr...
std::function< uint32_t()> getSerializedSizeProvider(void *data) override
Return a function that gives the actual CDR-serialized size for this specific message instance.
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
bool deserialize(SerializedPayload_t *payload, void *data) override
Deserialize a FastDDS payload buffer into a MsgType instance.
bool serialize(void *data, SerializedPayload_t *payload) override
Serialize a MsgType instance into the FastDDS payload buffer.
~GenericCdrPubSubType() override=default
void deleteData(void *data) override
Delete a MsgType previously returned by createData().
std::function< uint32_t()> getSerializedSizeProvider(void *data, eprosima::fastdds::dds::DataRepresentationId_t) override
FastDDS 2.13+ data-representation-aware size-provider overload.
void * createData() override
Allocate a new default-initialized MsgType on the heap.
bool serialize(void *data, SerializedPayload_t *payload, eprosima::fastdds::dds::DataRepresentationId_t) override
FastDDS 2.13+ data-representation-aware serialize overload.
bool getKey(void *, eprosima::fastrtps::rtps::InstanceHandle_t *, bool) override
CARLA topics are not keyed — always return false.
uint32_t cdr_serialized_size(const T &msg)
Return the exact CDR-serialized size in bytes for a message instance, including the 4-byte DDS encaps...
void deserialize_cdr(eprosima::fastcdr::Cdr &cdr, msg::Time &m)
void serialize_cdr(eprosima::fastcdr::Cdr &cdr, const msg::Time &m)
This file contains definitions of common data structures used in traffic manager.
Per-type metadata needed by the middleware layer.