Skip to content

Commit

Permalink
cosmetic touchups
Browse files Browse the repository at this point in the history
Signed-off-by: Karsten Knese <karsten@openrobotics.org>
  • Loading branch information
Karsten1987 committed Apr 21, 2020
1 parent 1b87de0 commit e455702
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 113 deletions.
109 changes: 20 additions & 89 deletions rclcpp/include/rclcpp/serialization.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,31 @@

#include "rosidl_typesupport_cpp/message_type_support.hpp"


namespace rclcpp
{

class SerializedMessage;

namespace serialization_traits
{
// trait to check if type is the object oriented serialized message
template<typename T>
struct is_serialized_message_class : std::false_type
{};

template<>
struct is_serialized_message_class<rcl_serialized_message_t> : std::true_type
{};

template<>
struct is_serialized_message_class<SerializedMessage> : std::true_type
{};
} // namespace serialization_traits

/// Interface to (de)serialize a message
class RCLCPP_PUBLIC_TYPE SerializationBase
{
protected:
public:
explicit SerializationBase(const rosidl_message_type_support_t * type_support);

virtual ~SerializationBase() = default;
Expand Down Expand Up @@ -67,97 +82,13 @@ class Serialization : public SerializationBase
public:
Serialization()
: SerializationBase(rosidl_typesupport_cpp::get_message_type_support_handle<MessageT>())
{}

void serialize_message(
const MessageT & ros_message, SerializedMessage & serialized_message) const
{
SerializationBase::serialize_message(
reinterpret_cast<const void *>(&ros_message),
&serialized_message);
}

void deserialize_message(
const SerializedMessage & serialized_message, MessageT & ros_message) const
{
SerializationBase::deserialize_message(
&serialized_message,
reinterpret_cast<void *>(&ros_message));
static_assert(
!serialization_traits::is_serialized_message_class<MessageT>::value,
"Serialization of serialized message to serialized message is not possible.");
}
};

template<>
class Serialization<SerializedMessage>: public SerializationBase
{
public:
Serialization()
: SerializationBase(nullptr)
{}

void serialize_message(
const SerializedMessage & ros_message,
SerializedMessage & serialized_message) const
{
(void)ros_message;
(void)serialized_message;
throw std::runtime_error(
"Serialization of serialized message to serialized message is not possible.");
}

void deserialize_message(
const SerializedMessage & serialized_message,
SerializedMessage & ros_message) const
{
(void)ros_message;
(void)serialized_message;
throw std::runtime_error(
"Deserialization of serialized message to serialized message is not possible.");
}
};

template<>
class Serialization<rcl_serialized_message_t>: public SerializationBase
{
public:
Serialization()
: SerializationBase(nullptr)
{}

void serialize_message(
rcl_serialized_message_t & ros_message,
const SerializedMessage & serialized_message) const
{
(void)ros_message;
(void)serialized_message;
throw std::runtime_error(
"Serialization of serialized message to serialized message is not possible.");
}

void deserialize_message(
const SerializedMessage & serialized_message,
rcl_serialized_message_t & ros_message) const
{
(void)ros_message;
(void)serialized_message;
throw std::runtime_error(
"Deserialization of serialized message to serialized message is not possible.");
}
};

// trait to check if type is the object oriented serialized message
template<typename T>
struct is_serialized_message_class : std::false_type
{};

template<>
struct is_serialized_message_class<rcl_serialized_message_t>: std::false_type
{};

template<>
struct is_serialized_message_class<SerializedMessage>
: std::true_type
{};

} // namespace rclcpp

#endif // RCLCPP__SERIALIZATION_HPP_
3 changes: 1 addition & 2 deletions rclcpp/src/rclcpp/serialization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,7 @@ void SerializationBase::serialize_message(
}
}

void
SerializationBase::deserialize_message(
void SerializationBase::deserialize_message(
const SerializedMessage * serialized_message, void * ros_message) const
{
rcpputils::check_true(type_support_ != nullptr, "Typesupport is nullpointer.");
Expand Down
26 changes: 4 additions & 22 deletions rclcpp/test/test_serialized_message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,11 @@ TEST(TestSerializedMessage, serialization) {
for (const auto & ros_msg : basic_type_ros_msgs) {
// convert ros msg to serialized msg
rclcpp::SerializedMessage serialized_msg;
serializer.serialize_message(*ros_msg, serialized_msg);
serializer.serialize_message(ros_msg.get(), &serialized_msg);

// convert serialized msg back to ros msg
MessageT deserialized_ros_msg;
serializer.deserialize_message(serialized_msg, deserialized_ros_msg);
serializer.deserialize_message(&serialized_msg, &deserialized_ros_msg);

EXPECT_EQ(*ros_msg, deserialized_ros_msg);
}
Expand All @@ -135,7 +135,7 @@ void test_empty_msg_serialize()
MessageT ros_msg;
rclcpp::SerializedMessage serialized_msg;

serializer.serialize_message(ros_msg, serialized_msg);
serializer.serialize_message(&ros_msg, &serialized_msg);
}

template<typename MessageT>
Expand All @@ -145,23 +145,5 @@ void test_empty_msg_deserialize()
MessageT ros_msg;
rclcpp::SerializedMessage serialized_msg;

serializer.deserialize_message(serialized_msg, ros_msg);
}

TEST(TestSerializedMessage, serialization_invalid) {
// serialized messages (used as ROS message) should throw an exception while (de)serialization

EXPECT_THROW(
test_empty_msg_serialize<rclcpp::SerializedMessage>(),
std::runtime_error);
EXPECT_THROW(
test_empty_msg_serialize<rcl_serialized_message_t>(),
std::runtime_error);

EXPECT_THROW(
test_empty_msg_deserialize<rclcpp::SerializedMessage>(),
std::runtime_error);
EXPECT_THROW(
test_empty_msg_deserialize<rcl_serialized_message_t>(),
std::runtime_error);
serializer.deserialize_message(&serialized_msg, &ros_msg);
}

0 comments on commit e455702

Please sign in to comment.