Skip to content

Commit

Permalink
variantではなくshared_ptrにした
Browse files Browse the repository at this point in the history
  • Loading branch information
na-trium-144 committed Aug 30, 2024
1 parent 97c8fc3 commit 540f3b3
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 101 deletions.
91 changes: 47 additions & 44 deletions client/src/client_msg_recv.cc
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ void internal::ClientData::onRecv(const std::string &message) {
const auto &[kind, obj] = m;
switch (kind) {
case MessageKind::sync_init_end: {
auto r = std::get<webcface::message::SyncInitEnd>(obj);
auto &r = *static_cast<webcface::message::SyncInitEnd *>(obj.get());
this->svr_name = r.svr_name;
this->svr_version = r.ver;
this->self_member_id.emplace(r.member_id);
Expand All @@ -93,7 +93,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::ping_status: {
auto r = std::get<webcface::message::PingStatus>(obj);
auto &r = *static_cast<webcface::message::PingStatus *>(obj.get());
this->ping_status = r.status;
StrSet1 members;
{
Expand Down Expand Up @@ -121,28 +121,30 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::sync: {
auto r = std::get<webcface::message::Sync>(obj);
auto &r = *static_cast<webcface::message::Sync *>(obj.get());
const auto &member = this->getMemberNameFromId(r.member_id);
this->sync_time_store.setRecv(member, r.getTime());
sync_members.push_back(member);
break;
}
case MessageKind::value + MessageKind::res: {
auto r =
std::get<webcface::message::Res<webcface::message::Value>>(obj);
auto &r = *static_cast<
webcface::message::Res<webcface::message::Value> *>(obj.get());
onRecvRes(this, r, r.data, this->value_store,
this->value_change_event);
break;
}
case MessageKind::text + MessageKind::res: {
auto r =
std::get<webcface::message::Res<webcface::message::Text>>(obj);
auto &r =
*static_cast<webcface::message::Res<webcface::message::Text> *>(
obj.get());
onRecvRes(this, r, r.data, this->text_store,
this->text_change_event);
break;
}
case MessageKind::robot_model + MessageKind::res: {
auto r = std::get<message::Res<message::RobotModel>>(obj);
auto &r =
*static_cast<message::Res<message::RobotModel> *>(obj.get());
auto links_data = std::make_shared<
std::vector<std::shared_ptr<internal::RobotLinkData>>>();
links_data->reserve(r.data.size());
Expand All @@ -155,8 +157,9 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::view + MessageKind::res: {
auto r =
std::get<webcface::message::Res<webcface::message::View>>(obj);
auto &r =
*static_cast<webcface::message::Res<webcface::message::View> *>(
obj.get());
std::lock_guard lock_s(this->view_store.mtx);
auto [member, field] =
this->view_store.getReq(r.req_id, r.sub_field);
Expand Down Expand Up @@ -190,9 +193,9 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::canvas3d + MessageKind::res: {
auto r =
std::get<webcface::message::Res<webcface::message::Canvas3D>>(
obj);
auto &r = *static_cast<
webcface::message::Res<webcface::message::Canvas3D> *>(
obj.get());
std::lock_guard lock_s(this->canvas3d_store.mtx);
auto [member, field] =
this->canvas3d_store.getReq(r.req_id, r.sub_field);
Expand Down Expand Up @@ -227,9 +230,9 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::canvas2d + MessageKind::res: {
auto r =
std::get<webcface::message::Res<webcface::message::Canvas2D>>(
obj);
auto &r = *static_cast<
webcface::message::Res<webcface::message::Canvas2D> *>(
obj.get());
std::lock_guard lock_s(this->canvas2d_store.mtx);
auto [member, field] =
this->canvas2d_store.getReq(r.req_id, r.sub_field);
Expand Down Expand Up @@ -262,13 +265,13 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::image + MessageKind::res: {
auto r =
std::get<webcface::message::Res<webcface::message::Image>>(obj);
auto &r = *static_cast<
webcface::message::Res<webcface::message::Image> *>(obj.get());
onRecvRes(this, r, r, this->image_store, this->image_change_event);
break;
}
case MessageKind::log: {
auto r = std::get<webcface::message::Log>(obj);
auto &r = *static_cast<webcface::message::Log *>(obj.get());
auto member = this->getMemberNameFromId(r.member_id);
std::lock_guard lock_s(this->log_store.mtx);
auto log_s = this->log_store.getRecv(member);
Expand All @@ -291,7 +294,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::call: {
auto r = std::get<webcface::message::Call>(obj);
auto &r = *static_cast<webcface::message::Call *>(obj.get());
auto func_info =
this->func_store.getRecv(this->self_member_name, r.field);
if (func_info) {
Expand All @@ -307,7 +310,8 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::call_response: {
auto r = std::get<webcface::message::CallResponse>(obj);
auto &r =
*static_cast<webcface::message::CallResponse *>(obj.get());
try {
this->func_result_store.getResult(r.caller_id)
->setter()
Expand All @@ -327,7 +331,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::call_result: {
auto r = std::get<webcface::message::CallResult>(obj);
auto &r = *static_cast<webcface::message::CallResult *>(obj.get());
try {
if (r.is_error) {
this->func_result_store.getResult(r.caller_id)
Expand All @@ -352,7 +356,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::sync_init: {
auto r = std::get<webcface::message::SyncInit>(obj);
auto &r = *static_cast<webcface::message::SyncInit *>(obj.get());
{
std::lock_guard lock(this->entry_m);
this->member_entry.emplace(r.member_name);
Expand Down Expand Up @@ -380,58 +384,57 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::entry + MessageKind::value: {
auto r =
std::get<webcface::message::Entry<webcface::message::Value>>(
obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::Value> *>(
obj.get());
onRecvEntry(this, r, this->value_store, this->value_entry_event);
break;
}
case MessageKind::entry + MessageKind::text: {
auto r =
std::get<webcface::message::Entry<webcface::message::Text>>(
obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::Text> *>(obj.get());
onRecvEntry(this, r, this->text_store, this->text_entry_event);
break;
}
case MessageKind::entry + MessageKind::view: {
auto r =
std::get<webcface::message::Entry<webcface::message::View>>(
obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::View> *>(obj.get());
onRecvEntry(this, r, this->view_store, this->view_entry_event);
break;
}
case MessageKind::entry + MessageKind::canvas3d: {
auto r =
std::get<webcface::message::Entry<webcface::message::Canvas3D>>(
obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::Canvas3D> *>(
obj.get());
onRecvEntry(this, r, this->canvas3d_store,
this->canvas3d_entry_event);
break;
}
case MessageKind::entry + MessageKind::canvas2d: {
auto r =
std::get<webcface::message::Entry<webcface::message::Canvas2D>>(
obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::Canvas2D> *>(
obj.get());
onRecvEntry(this, r, this->canvas2d_store,
this->canvas2d_entry_event);
break;
}
case MessageKind::entry + MessageKind::robot_model: {
auto r = std::get<
webcface::message::Entry<webcface::message::RobotModel>>(obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::RobotModel> *>(
obj.get());
onRecvEntry(this, r, this->robot_model_store,
this->robot_model_entry_event);
break;
}
case MessageKind::entry + MessageKind::image: {
auto r =
std::get<webcface::message::Entry<webcface::message::Image>>(
obj);
auto &r = *static_cast<
webcface::message::Entry<webcface::message::Image> *>(
obj.get());
onRecvEntry(this, r, this->image_store, this->image_entry_event);
break;
}
case MessageKind::func_info: {
auto r = std::get<webcface::message::FuncInfo>(obj);
auto &r = *static_cast<webcface::message::FuncInfo *>(obj.get());
auto member = this->getMemberNameFromId(r.member_id);
this->func_store.setEntry(member, r.field);
this->func_store.setRecv(member, r.field,
Expand Down
13 changes: 2 additions & 11 deletions message/include/webcface/message/message.h
Original file line number Diff line number Diff line change
Expand Up @@ -737,20 +737,11 @@ struct Res<Image> : public MessageBase<MessageKind::image + MessageKind::res>,
MSGPACK_NVP("p", cmp_mode_))
};

using MessageVariant =
std::variant<SyncInit, SyncInitEnd, Ping, PingStatus, PingStatusReq, Sync,
Call, CallResponse, CallResult, Value, Text, RobotModel, View,
Canvas3D, Canvas2D, Image, Log, LogReq, FuncInfo, Req<Value>,
Req<Text>, Req<View>, Req<Canvas2D>, Req<Canvas3D>,
Req<RobotModel>, Req<Image>, Entry<Value>, Entry<Text>,
Entry<View>, Entry<Canvas2D>, Entry<Image>, Entry<Canvas3D>,
Entry<RobotModel>, Res<Value>, Res<Text>, Res<RobotModel>,
Res<View>, Res<Canvas3D>, Res<Canvas2D>, Res<Image>>;
/*!
* \brief msgpackのメッセージをパースしstd::anyで返す
* \brief msgpackのメッセージをパースし返す
*
*/
std::vector<std::pair<int, MessageVariant>>
std::vector<std::pair<int, std::shared_ptr<void>>>
unpack(const std::string &message,
const std::shared_ptr<spdlog::logger> &logger);

Expand Down
17 changes: 9 additions & 8 deletions message/src/message.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ static void printMsg(const std::shared_ptr<spdlog::logger> &logger,
// }
// std::cerr << std::endl;
}
std::vector<std::pair<int, MessageVariant>>
std::vector<std::pair<int, std::shared_ptr<void>>>
unpack(const std::string &message,
const std::shared_ptr<spdlog::logger> &logger) {
if (message.size() == 0) {
return std::vector<std::pair<int, MessageVariant>>{};
return std::vector<std::pair<int, std::shared_ptr<void>>>{};
}
try {
msgpack::object_handle result;
Expand All @@ -30,18 +30,19 @@ unpack(const std::string &message,

if (obj.type != msgpack::type::ARRAY || obj.via.array.size % 2 != 0) {
logger->error("unpack error: invalid array length");
return std::vector<std::pair<int, MessageVariant>>{};
return std::vector<std::pair<int, std::shared_ptr<void>>>{};
}
std::vector<std::pair<int, MessageVariant>> ret;
std::vector<std::pair<int, std::shared_ptr<void>>> ret;
for (std::size_t i = 0; i < obj.via.array.size; i += 2) {
auto kind = obj.via.array.ptr[i].as<int>();
MessageVariant obj_u;
std::shared_ptr<void> obj_u;
switch (kind) {

#define MSG_PARSE(type) \
case type::kind: \
try { \
obj_u = obj.via.array.ptr[i + 1].as<type>(); \
obj_u = \
std::make_shared<type>(obj.via.array.ptr[i + 1].as<type>()); \
} catch (const std::exception &e) { \
logger->error("unpack error: {} at index={}, kind={}", e.what(), \
i + 1, static_cast<int>(type::kind)); \
Expand Down Expand Up @@ -86,13 +87,13 @@ unpack(const std::string &message,
}

// printMsg(message);
ret.push_back(std::make_pair(kind, obj_u));
ret.push_back(std::make_pair(kind, std::move(obj_u)));
}
return ret;
} catch (const std::exception &e) {
logger->error("unpack error: {}", e.what());
printMsg(logger, message);
return std::vector<std::pair<int, MessageVariant>>{};
return std::vector<std::pair<int, std::shared_ptr<void>>>{};
}
}
} // namespace message
Expand Down
Loading

0 comments on commit 540f3b3

Please sign in to comment.