34#ifndef MESSAGE_SERIALIZATION_H_
35#define MESSAGE_SERIALIZATION_H_
48#define INTROSPECTION_C_MEMBER rosidl_typesupport_introspection_c__MessageMember
49#define INTROSPECTION_CPP_MEMBER rosidl_typesupport_introspection_cpp::MessageMember
51#define INTROSPECTION_C_MEMBERS rosidl_typesupport_introspection_c__MessageMembers
52#define INTROSPECTION_CPP_MEMBERS rosidl_typesupport_introspection_cpp::MessageMembers
54#define INTROSPECTION_C_SERVICE_MEMBERS rosidl_typesupport_introspection_c__ServiceMembers
55#define INTROSPECTION_CPP_SERVICE_MEMBERS rosidl_typesupport_introspection_cpp::ServiceMembers
84 if (!member->is_array_)
86 stream << * static_cast<T *>(field);
88 else if (member->array_size_ && !member->is_upper_bound_)
94 std::vector<T> & data = *
reinterpret_cast<std::vector<T> *
>(field);
114 if constexpr(std::is_same_v<T, std::string>)
116 if (!member->is_array_)
120 else if (member->array_size_ && !member->is_upper_bound_)
126 printf(
"WARNING: non-fixed size sequences are currently sperimental\n");
131 else if constexpr(std::is_same_v<T, std::u16string>)
133 if (!member->is_array_)
137 else if (member->array_size_ && !member->is_upper_bound_)
143 printf(
"WARNING: non-fixed size sequences are currently sperimental\n");
150 if (!member->is_array_)
152 stream << * static_cast<T *>(field);
154 else if (member->array_size_ && !member->is_upper_bound_)
160 printf(
"WARNING: non-fixed size sequences are currently sperimental\n");
164 stream << (uint32_t)data.size;
183 template<
typename MembersType>
186 for (uint32_t i = 0; i < casted_members->member_count_; ++i) {
187 const auto member = casted_members->members_ + i;
188 void * field =
const_cast<char *
>(
static_cast<const char *
>(msg)) + member->offset_;
189 switch (member->type_id_) {
190 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_MESSAGE:
192 auto sub_members =
static_cast<const MembersType *
>(member->members_->data);
193 if (!member->is_array_) {
196 else if (member->array_size_ && !member->is_upper_bound_)
198 for (
size_t index = 0; index < member->array_size_; ++index) {
199 serialize(member->get_function(field, index), sub_members, stream);
204 size_t array_size = member->size_function(field);
206 if (member->is_upper_bound_ && array_size > member->array_size_)
208 throw std::runtime_error(
"Sequence overcomes the maximum length");
212 stream << (uint32_t)array_size;
214 for (
size_t index = 0; index < array_size; ++index) {
215 serialize(member->get_function(field, index), sub_members, stream);
220 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_BOOLEAN:
221 if (!member->is_array_)
224 stream << (*static_cast<uint8_t *>(field) ? true :
false);
231 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_OCTET:
234 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT8:
237 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_CHAR:
240 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT8:
243 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_FLOAT:
246 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_DOUBLE:
249 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT16:
252 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT16:
255 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT32:
258 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT32:
261 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT64:
264 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT64:
267 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_STRING:
270 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_WSTRING:
274 throw std::runtime_error(
"unknown type");
296 else if (
member->array_size_ && !
member->is_upper_bound_)
302 auto &
vector = *
reinterpret_cast<std::vector<T> *
>(
field);
303 new(&
vector) std::vector<T>;
323 if constexpr(std::is_same_v<T, std::string>)
331 else if (
member->array_size_ && !
member->is_upper_bound_)
340 printf(
"WARNING: non-fixed size sequences are currently sperimental\n");
348 else if constexpr(std::is_same_v<T, std::u16string>)
356 else if (
member->array_size_ && !
member->is_upper_bound_)
365 printf(
"WARNING: non-fixed size sequences are currently sperimental\n");
379 else if (
member->array_size_ && !
member->is_upper_bound_)
385 printf(
"WARNING: non-fixed size sequences are currently sperimental\n");
389 size_t dsize =
static_cast<size_t>(
size);
393 throw std::runtime_error(
"unable to initialize GenericCSequence");
414 template<
typename MembersType>
420 switch (
member->type_id_) {
421 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_MESSAGE:
427 else if (
member->array_size_ && !
member->is_upper_bound_)
439 auto vector =
reinterpret_cast<std::vector<unsigned char> *
>(
field);
440 new(
vector) std::vector<unsigned char>;
449 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_BOOLEAN:
452 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_OCTET:
455 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT8:
458 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_CHAR:
461 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT8:
464 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_FLOAT:
467 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_DOUBLE:
470 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT16:
473 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT16:
476 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT32:
479 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT32:
482 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_INT64:
485 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_UINT64:
488 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_STRING:
491 case ::rosidl_typesupport_introspection_cpp::ROS_TYPE_WSTRING:
495 throw std::runtime_error(
"unknown type");
Classes used to convert data types into a CBOR encoded stream.
Namespace containing C sequence handling functions.
Definition CBorStream.h:244
Definition CBorStream.h:87
TxStream & serialize_sequence(const T *items, size_t size)
Serialize a sequence of uniform elements.
Definition CBorStream.h:218
Header containing C sequence macros.
void assign_vector_string(std::vector< std::string > cpp_string_vector, void *str_array, size_t size)
Assing to a rosidl_runtime_c__String the value contained in a vector of std::string.
Definition CStringHelper.cpp:69
void assign_vector_u16string_to_sequence(std::vector< std::u16string > cpp_string_vector, void *str_seq)
Assing to a rosidl_runtime_c__U16String__Sequence the value contained in a vector of std::u16string.
Definition CStringHelper.cpp:117
std::vector< std::string > convert_to_std_vector_string(void *str_array, size_t size)
Convert a rosidl_runtime_c__String into a vector of std::string.
Definition CStringHelper.cpp:9
std::u16string convert_to_std_u16string(void *str)
Convert a rosidl_runtime_c__U16String into std::u16string.
Definition CStringHelper.cpp:33
std::vector< std::u16string > convert_to_std_vector_u16string(void *str_array, size_t size)
Convert a rosidl_runtime_c__U16String into a vector of std::u16string.
Definition CStringHelper.cpp:39
void assign_vector_string_to_sequence(std::vector< std::string > cpp_string_vector, void *str_seq)
Assing to a rosidl_runtime_c__String__Sequence the value contained in a vector of std::string.
Definition CStringHelper.cpp:81
std::vector< std::u16string > convert_sequence_to_std_vector_u16string(void *str_seq)
Convert a rosidl_runtime_c__U16String__Sequence into a vector of std::u16string.
Definition CStringHelper.cpp:51
void assign_string(std::string str, void *field)
Assing to a rosidl_runtime_c__String the value contained in a std::string.
Definition CStringHelper.cpp:63
void assign_u16string(std::u16string str, void *field)
Assing to a rosidl_runtime_c__U16String the value contained in a std::u16string.
Definition CStringHelper.cpp:99
void assign_vector_u16string(std::vector< std::u16string > cpp_string_vector, void *str_array, size_t size)
Assing to a rosidl_runtime_c__U16String the value contained in a vector of std::u16string.
Definition CStringHelper.cpp:105
std::vector< std::string > convert_sequence_to_std_vector_string(void *str_seq)
Convert a rosidl_runtime_c__String__Sequence into a vector of std::string.
Definition CStringHelper.cpp:21
std::string convert_to_std_string(void *str)
Convert a rosidl_runtime_c__String into std::string.
Definition CStringHelper.cpp:3
Namespace containing serialization functions.
void serialize_field(const INTROSPECTION_CPP_MEMBER *member, void *field, cbor::TxStream &stream)
Serialize a C++ field.
Definition MessageSerialization.h:82
void deserialize(void *msg, const MembersType *casted_members, cbor::RxStream &stream)
Deserialize a ROS message, request or response.
Definition MessageSerialization.h:415
void serialize(const void *msg, const MembersType *casted_members, cbor::TxStream &stream)
Serialize a ROS message, request or response.
Definition MessageSerialization.h:184
void deserialize_field(const INTROSPECTION_CPP_MEMBER *member, void *field, cbor::RxStream &stream)
Deserialize a C++ field.
Definition MessageSerialization.h:291