12 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
14 #include <mrpt/io/CMemoryStream.h>
15 #include <mrpt/serialization/CArchive.h>
38 void sendMessage(
const google::protobuf::MessageLite& m, zmq::socket_t& socket);
41 zmq::message_t receiveMessage(zmq::socket_t& s);
49 void parseMessage(
const zmq::message_t& msg, google::protobuf::MessageLite& out);
51 class UnexpectedMessageException :
public std::runtime_error
54 UnexpectedMessageException(
const char* reason) :
std::runtime_error(reason) {}
58 std::tuple<std::string, std::string> parseMessageToParts(
const zmq::message_t& msg);
60 template <
typename variant_t,
size_t IDX = 0>
61 variant_t recursiveParse(
const std::string& typeName,
const std::string& serializedData)
63 if constexpr (IDX < std::variant_size_v<variant_t>)
65 using this_t = std::variant_alternative_t<IDX, variant_t>;
67 const std::string expectedName = v.GetTypeName();
68 if (expectedName == typeName)
70 bool ok = v.ParseFromString(serializedData);
73 "Format error: protobuf could not decode binary message of "
79 return recursiveParse<variant_t, IDX + 1>(typeName, serializedData);
81 throw UnexpectedMessageException(
82 mrpt::format(
"Type '%s' not found in expected list of variant arguments.", typeName.c_str())
87 std::string get_zmq_endpoint(
const zmq::socket_t& s);
94 template <
typename variant_t>
95 variant_t parseMessageVariant(
const zmq::message_t& msg)
97 const auto [typeName, serializedData] = internal::parseMessageToParts(msg);
98 return internal::recursiveParse<variant_t>(typeName, serializedData);
102 template <
class... Ts>
103 struct overloaded : Ts...
105 using Ts::operator()...;
109 template <
class... Ts>
110 overloaded(Ts...) -> overloaded<Ts...>;