9#if defined(CARLA_ROS2_MIDDLEWARE_CYCLONEDDS) || defined(CARLA_ROS2_MIDDLEWARE_TESTING)
32template <
typename Frag,
typename PayloadOf>
33inline size_t carla_cdr_gather_fragments(
36 const Frag* fragchain,
40 for (
const Frag* f = fragchain; f !=
nullptr; f = f->nextfrag) {
41 const size_t min =
static_cast<size_t>(f->min);
42 const size_t maxp1 = (
static_cast<size_t>(f->maxp1) > size)
44 :
static_cast<size_t>(f->maxp1);
45 if (maxp1 <= off || min > off) {
continue; }
46 const uint8_t* payload = payload_of(f);
47 memcpy(dest + off, payload + (off -
min), maxp1 - off);
61#ifndef CARLA_ROS2_MIDDLEWARE_TESTING
62#ifdef CARLA_ROS2_MIDDLEWARE_CYCLONEDDS
69#include <dds/ddsi/ddsi_serdata.h>
70#include <dds/ddsi/ddsi_sertype.h>
84struct carla_cdr_serdata {
85 struct ddsi_serdata
sd;
94struct carla_cdr_sertype {
95 struct ddsi_sertype c;
101static_assert(
sizeof(
struct carla_cdr_serdata) % 4 == 0,
102 "carla_cdr_serdata size must be 4-byte aligned for CDR encoding");
109inline const uint8_t* carla_cdr_data(
const struct ddsi_serdata*
sd) {
110 const struct carla_cdr_serdata*
csd =
111 reinterpret_cast<const struct carla_cdr_serdata*
>(
sd);
112 return reinterpret_cast<const uint8_t*
>(
csd + 1);
116inline uint32_t carla_cdr_size(
const struct ddsi_serdata*
sd) {
117 return reinterpret_cast<const struct carla_cdr_serdata*
>(
sd)->cdr_size;
127extern const struct ddsi_serdata_ops carla_cdr_serdata_ops;
128extern const struct ddsi_sertype_ops carla_cdr_sertype_ops;
132extern struct ddsi_serdata* carla_cdr_alloc_serdata(
133 const struct ddsi_sertype* type,
134 enum ddsi_serdata_kind kind,
147extern dds_entity_t carla_cdr_get_participant();
166inline dds_entity_t carla_cdr_create_topic(
167 dds_entity_t participant,
168 const char* topic_name,
169 const char* type_name,
170 struct ddsi_sertype** registered_sertype)
172 struct carla_cdr_sertype* st =
173 reinterpret_cast<struct carla_cdr_sertype*
>(
174 malloc(
sizeof(
struct carla_cdr_sertype)));
175 if (!st) {
return static_cast<dds_entity_t
>(DDS_RETCODE_OUT_OF_RESOURCES); }
176 ddsi_sertype_init_flags(
179 &carla_cdr_sertype_ops,
180 &carla_cdr_serdata_ops,
181 DDSI_SERTYPE_FLAG_TOPICKIND_NO_KEY);
182 *registered_sertype = &st->c;
183 dds_entity_t topic = dds_create_topic_sertype(
184 participant, topic_name, registered_sertype,
185 nullptr,
nullptr,
nullptr);
189 ddsi_sertype_fini(&st->c);
191 *registered_sertype =
nullptr;
205inline struct ddsi_serdata* carla_cdr_wrap(
206 const struct ddsi_sertype* type,
207 const uint8_t* cdr_data,
210 struct ddsi_serdata*
sd = carla_cdr_alloc_serdata(type, SDK_DATA, cdr_size);
211 if (!
sd) {
return nullptr; }
212 uint8_t* dest =
reinterpret_cast<uint8_t*
>(
213 reinterpret_cast<struct carla_cdr_serdata*
>(
sd) + 1);
214 memcpy(dest, cdr_data,
static_cast<size_t>(cdr_size));
double min(double v1, double v2)
This file contains definitions of common data structures used in traffic manager.