Skip to content

Commit

Permalink
Replace const char * with a std::array<char, TOPIC_NAME_LENGTH> as th…
Browse files Browse the repository at this point in the history
…e key of IPM IDTopicMap (ros2#671)

Use std::array<char, TOPIC_NAME_LENGTH> and not const char * as key in IPM IDTopicMap

Signed-off-by: ivanpauno <ivanpauno@ekumenlabs.com>
  • Loading branch information
ivanpauno authored and christopherho-ApexAI committed Jun 3, 2019
1 parent 4431ed6 commit 14bdcf9
Showing 1 changed file with 21 additions and 16 deletions.
37 changes: 21 additions & 16 deletions rclcpp/include/rclcpp/intra_process_manager_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#define RCLCPP__INTRA_PROCESS_MANAGER_IMPL_HPP_

#include <algorithm>
#include <array>
#include <atomic>
#include <cstring>
#include <functional>
Expand All @@ -28,6 +29,8 @@
#include <unordered_map>
#include <utility>

#include "rmw/validate_full_topic_name.h"

#include "rclcpp/macros.hpp"
#include "rclcpp/mapped_ring_buffer.hpp"
#include "rclcpp/publisher.hpp"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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;
Expand All @@ -274,6 +277,16 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase
private:
RCLCPP_DISABLE_COPY(IntraProcessManagerImpl)

using FixedSizeString = std::array<char, RMW_TOPIC_MAX_NAME_LENGTH + 1>;

FixedSizeString
fixed_size_string(const char * str) const
{
FixedSizeString ret;
std::strncpy(ret.data(), str, ret.size());
return ret;
}

template<typename T>
using RebindAlloc = typename std::allocator_traits<Allocator>::template rebind_alloc<T>;

Expand All @@ -285,19 +298,11 @@ class IntraProcessManagerImpl : public IntraProcessManagerImplBase
std::hash<uint64_t>, std::equal_to<uint64_t>,
RebindAlloc<std::pair<const uint64_t, SubscriptionBase::WeakPtr>>>;

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::pair<const char * const, AllocSet>>>;
std::less<FixedSizeString>,
RebindAlloc<std::pair<const FixedSizeString, AllocSet>>>;

SubscriptionMap subscriptions_;

Expand Down

0 comments on commit 14bdcf9

Please sign in to comment.