diff --git a/rmw_cyclonedds_cpp/src/MessageTypeSupport_impl.hpp b/rmw_cyclonedds_cpp/src/MessageTypeSupport_impl.hpp index 7cbcac11..c0ba8160 100644 --- a/rmw_cyclonedds_cpp/src/MessageTypeSupport_impl.hpp +++ b/rmw_cyclonedds_cpp/src/MessageTypeSupport_impl.hpp @@ -17,8 +17,6 @@ #include #include -#include -#include #include #include "MessageTypeSupport.hpp" @@ -33,16 +31,31 @@ MessageTypeSupport::MessageTypeSupport(const MembersType * members) assert(members); this->members_ = members; - std::ostringstream ss; - std::string message_namespace(this->members_->message_namespace_); std::string message_name(this->members_->message_name_); - if (!message_namespace.empty()) { + + std::string name; + if (this->members_->message_namespace_ != nullptr && + this->members_->message_namespace_[0] != '\0') + { + std::string message_namespace(this->members_->message_namespace_); // Find and replace C namespace separator with C++, in case this is using C typesupport - message_namespace = std::regex_replace(message_namespace, std::regex("__"), "::"); - ss << message_namespace << "::"; + std::string::size_type pos = 0; + while ((pos = message_namespace.find("__", pos)) != std::string::npos) { + message_namespace.replace(pos, 2, "::"); + pos += 2; + } + name.reserve( + message_namespace.size() + 2 + 5 + message_name.size() + 1); // "::" + "dds_::" + "_" + name += message_namespace; + name += "::"; + } else { + name.reserve(5 + message_name.size() + 1); // "dds_::" + "_" } - ss << "dds_::" << message_name << "_"; - this->setName(ss.str().c_str()); + name += "dds_::"; + name += message_name; + name += '_'; + + this->setName(name); } } // namespace rmw_cyclonedds_cpp