diff --git a/rclcpp/include/rclcpp/intra_process_manager_impl.hpp b/rclcpp/include/rclcpp/intra_process_manager_impl.hpp index 8b44b8f587..863fa4ed6c 100644 --- a/rclcpp/include/rclcpp/intra_process_manager_impl.hpp +++ b/rclcpp/include/rclcpp/intra_process_manager_impl.hpp @@ -16,6 +16,7 @@ #define RCLCPP__INTRA_PROCESS_MANAGER_IMPL_HPP_ #include +#include #include #include #include @@ -28,6 +29,8 @@ #include #include +#include "rmw/validate_full_topic_name.h" + #include "rclcpp/macros.hpp" #include "rclcpp/mapped_ring_buffer.hpp" #include "rclcpp/publisher.hpp" @@ -98,9 +101,7 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase add_subscription(uint64_t id, SubscriptionBase::SharedPtr subscription) { subscriptions_[id] = subscription; - // subscription->get_topic_name() -> const char * can be used as the key, - // since subscriptions_ shares the ownership of subscription - subscription_ids_by_topic_[subscription->get_topic_name()].insert(id); + subscription_ids_by_topic_[fixed_size_string(subscription->get_topic_name())].insert(id); } void @@ -175,7 +176,8 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase } // Figure out what subscriptions should receive the message. - auto & destined_subscriptions = subscription_ids_by_topic_[publisher->get_topic_name()]; + auto & destined_subscriptions = + subscription_ids_by_topic_[fixed_size_string(publisher->get_topic_name())]; // Store the list for later comparison. if (info.target_subscriptions_by_message_sequence.count(message_seq) == 0) { info.target_subscriptions_by_message_sequence.emplace( @@ -263,7 +265,8 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase if (!publisher) { throw std::runtime_error("publisher has unexpectedly gone out of scope"); } - auto sub_map_it = subscription_ids_by_topic_.find(publisher->get_topic_name()); + auto sub_map_it = + subscription_ids_by_topic_.find(fixed_size_string(publisher->get_topic_name())); if (sub_map_it == subscription_ids_by_topic_.end()) { // No intraprocess subscribers return 0; @@ -274,6 +277,16 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase private: RCLCPP_DISABLE_COPY(IntraProcessManagerImpl) + using FixedSizeString = std::array; + + FixedSizeString + fixed_size_string(const char * str) const + { + FixedSizeString ret; + std::strncpy(ret.data(), str, ret.size()); + return ret; + } + template using RebindAlloc = typename std::allocator_traits::template rebind_alloc; @@ -285,19 +298,11 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase std::hash, std::equal_to, RebindAlloc>>; - struct strcmp_wrapper - { - bool - operator()(const char * lhs, const char * rhs) const - { - return std::strcmp(lhs, rhs) < 0; - } - }; using IDTopicMap = std::map< - const char *, + FixedSizeString, AllocSet, - strcmp_wrapper, - RebindAlloc>>; + std::less, + RebindAlloc>>; SubscriptionMap subscriptions_;