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>
|
template<typename T>
|
||||||
void deserialize_field(
|
void deserialize_field(
|
||||||
const rosidl_typesupport_introspection_c__MessageMember * member,
|
const rosidl_typesupport_introspection_c__MessageMember * member,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue