Skip to content

Commit

Permalink
Keep implementation for rosidl_typesupport_introspection_c__MessageMe…
Browse files Browse the repository at this point in the history
…mber

Signed-off-by: Chen.Lihui <[email protected]>
Co-authored-by: Ivan Santiago Paunovic <[email protected]>
  • Loading branch information
Chen.Lihui and ivanpauno committed Sep 1, 2020
1 parent 39a0e92 commit 4d55d82
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,9 @@ struct StringHelper<rosidl_typesupport_introspection_cpp::MessageMembers>
return *(static_cast<std::string *>(data));
}

static void assign(cycdeser & deser, void * field, bool call_new)
static void assign(cycdeser & deser, void * field)
{
std::string & str = *(std::string *)field;
if (call_new) {
new(&str) std::string;
}
deser >> str;
}
};
Expand Down
49 changes: 33 additions & 16 deletions rmw_cyclonedds_cpp/include/rmw_cyclonedds_cpp/TypeSupport_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -405,18 +405,12 @@ inline size_t get_submessage_array_deserialize(
cycdeser & deser,
void * field,
void * & subros_message,
bool call_new,
size_t sub_members_size,
size_t max_align)
size_t,
size_t)
{
(void)member;
uint32_t vsize = deser.deserialize_len(1);
auto vector = reinterpret_cast<std::vector<unsigned char> *>(field);
if (call_new) {
new(vector) std::vector<unsigned char>;
}
vector->resize(vsize * align_int_(max_align, sub_members_size));
subros_message = reinterpret_cast<void *>(vector->data());
member->resize_function(field, vsize);
subros_message = member->get_function(field, 0);
return vsize;
}

Expand All @@ -425,7 +419,6 @@ inline size_t get_submessage_array_deserialize(
cycdeser & deser,
void * field,
void * & subros_message,
bool,
size_t sub_members_size,
size_t)
{
Expand All @@ -437,6 +430,29 @@ inline size_t get_submessage_array_deserialize(
return vsize;
}

inline void * get_submessage_pointer(
const rosidl_typesupport_introspection_cpp::MessageMember * member,
void * field,
size_t index,
void *,
size_t,
size_t)
{
return member->get_function(field, index);
}

inline void * get_submessage_pointer(
const rosidl_typesupport_introspection_c__MessageMember *,
void *,
size_t,
void * subros_message,
size_t sub_members_size,
size_t max_align)
{
subros_message = static_cast<char *>(subros_message) + sub_members_size;
return align_ptr_(max_align, subros_message);
}

template<typename MembersType>
bool TypeSupport<MembersType>::deserializeROSmessage(
cycdeser & deser, const MembersType * members, void * ros_message)
Expand Down Expand Up @@ -504,15 +520,16 @@ bool TypeSupport<MembersType>::deserializeROSmessage(
subros_message = field;
array_size = member->array_size_;
} else {
array_size = deser.deserialize_len(1);
member->resize_function(field, array_size);
subros_message = member->get_function(field, 0);
array_size = get_submessage_array_deserialize(
member, deser, field, subros_message,
sub_members_size, max_align);
}

for (size_t index = 0; index < array_size; ++index) {
deserializeROSmessage(deser, sub_members, subros_message);
subros_message = static_cast<char *>(subros_message) + sub_members_size;
subros_message = align_ptr_(max_align, subros_message);
subros_message = get_submessage_pointer(
member, field, index + 1, subros_message,
sub_members_size, max_align);
}
}
}
Expand Down

0 comments on commit 4d55d82

Please sign in to comment.