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:
parent
16acb73821
commit
2090d067c1
1 changed files with 32 additions and 0 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue