Specialize deserializer for strings (#3)

As std::string is not a basic type, "new" must sometimes be called to
initialze the memory before passing it as a reference.
This commit is contained in:
Erik Boasson 2019-06-07 11:16:37 +02:00
parent 16acb73821
commit 2090d067c1

View file

@ -421,6 +421,38 @@ void deserialize_field(
}
}
template<>
inline void deserialize_field<std::string>(
const rosidl_typesupport_introspection_cpp::MessageMember * member,
void * field,
cycdeser & deser,
bool call_new)
{
if (!member->is_array_) {
if (call_new) {
// Because std::string is a complex datatype, we need to make sure that
// the memory is initialized to something reasonable before eventually
// passing it as a reference.
new(field) std::string();
}
deser >> *static_cast<std::string *>(field);
} else if (member->array_size_ && !member->is_upper_bound_) {
std::string * array = static_cast<std::string *>(field);
if (call_new) {
for (size_t i = 0; i < member->array_size_; ++i) {
new(&array[i]) std::string();
}
}
deser.deserializeA(array, member->array_size_);
} else {
auto & vector = *reinterpret_cast<std::vector<std::string> *>(field);
if (call_new) {
new(&vector) std::vector<std::string>;
}
deser >> vector;
}
}
template<typename T>
void deserialize_field(
const rosidl_typesupport_introspection_c__MessageMember * member,