Skip to content

Commit

Permalink
std::anyをvariantに変更
Browse files Browse the repository at this point in the history
  • Loading branch information
na-trium-144 committed Aug 30, 2024
1 parent 485493f commit dd795ed
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 113 deletions.
74 changes: 39 additions & 35 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::any_cast<webcface::message::SyncInitEnd>(obj);
auto r = std::get<webcface::message::SyncInitEnd>(obj);
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::any_cast<webcface::message::PingStatus>(obj);
auto r = std::get<webcface::message::PingStatus>(obj);
this->ping_status = r.status;
StrSet1 members;
{
Expand Down Expand Up @@ -121,30 +121,28 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::sync: {
auto r = std::any_cast<webcface::message::Sync>(obj);
auto r = std::get<webcface::message::Sync>(obj);
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::any_cast<webcface::message::Res<webcface::message::Value>>(
obj);
std::get<webcface::message::Res<webcface::message::Value>>(obj);
onRecvRes(this, r, r.data, this->value_store,
this->value_change_event);
break;
}
case MessageKind::text + MessageKind::res: {
auto r =
std::any_cast<webcface::message::Res<webcface::message::Text>>(
obj);
std::get<webcface::message::Res<webcface::message::Text>>(obj);
onRecvRes(this, r, r.data, this->text_store,
this->text_change_event);
break;
}
case MessageKind::robot_model + MessageKind::res: {
auto r = std::any_cast<message::Res<message::RobotModel>>(obj);
auto r = std::get<message::Res<message::RobotModel>>(obj);
auto links_data = std::make_shared<
std::vector<std::shared_ptr<internal::RobotLinkData>>>();
links_data->reserve(r.data.size());
Expand All @@ -158,8 +156,7 @@ void internal::ClientData::onRecv(const std::string &message) {
}
case MessageKind::view + MessageKind::res: {
auto r =
std::any_cast<webcface::message::Res<webcface::message::View>>(
obj);
std::get<webcface::message::Res<webcface::message::View>>(obj);
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 @@ -193,8 +190,9 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::canvas3d + MessageKind::res: {
auto r = std::any_cast<
webcface::message::Res<webcface::message::Canvas3D>>(obj);
auto r =
std::get<webcface::message::Res<webcface::message::Canvas3D>>(
obj);
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 @@ -229,8 +227,9 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::canvas2d + MessageKind::res: {
auto r = std::any_cast<
webcface::message::Res<webcface::message::Canvas2D>>(obj);
auto r =
std::get<webcface::message::Res<webcface::message::Canvas2D>>(
obj);
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 @@ -264,13 +263,12 @@ void internal::ClientData::onRecv(const std::string &message) {
}
case MessageKind::image + MessageKind::res: {
auto r =
std::any_cast<webcface::message::Res<webcface::message::Image>>(
obj);
std::get<webcface::message::Res<webcface::message::Image>>(obj);
onRecvRes(this, r, r, this->image_store, this->image_change_event);
break;
}
case MessageKind::log: {
auto r = std::any_cast<webcface::message::Log>(obj);
auto r = std::get<webcface::message::Log>(obj);
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 @@ -293,7 +291,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::call: {
auto r = std::any_cast<webcface::message::Call>(obj);
auto r = std::get<webcface::message::Call>(obj);
auto func_info =
this->func_store.getRecv(this->self_member_name, r.field);
if (func_info) {
Expand All @@ -309,7 +307,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::call_response: {
auto r = std::any_cast<webcface::message::CallResponse>(obj);
auto r = std::get<webcface::message::CallResponse>(obj);
try {
this->func_result_store.getResult(r.caller_id)
->setter()
Expand All @@ -329,7 +327,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::call_result: {
auto r = std::any_cast<webcface::message::CallResult>(obj);
auto r = std::get<webcface::message::CallResult>(obj);
try {
if (r.is_error) {
this->func_result_store.getResult(r.caller_id)
Expand All @@ -354,7 +352,7 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::sync_init: {
auto r = std::any_cast<webcface::message::SyncInit>(obj);
auto r = std::get<webcface::message::SyncInit>(obj);
{
std::lock_guard lock(this->entry_m);
this->member_entry.emplace(r.member_name);
Expand Down Expand Up @@ -382,52 +380,58 @@ void internal::ClientData::onRecv(const std::string &message) {
break;
}
case MessageKind::entry + MessageKind::value: {
auto r = std::any_cast<
webcface::message::Entry<webcface::message::Value>>(obj);
auto r =
std::get<webcface::message::Entry<webcface::message::Value>>(
obj);
onRecvEntry(this, r, this->value_store, this->value_entry_event);
break;
}
case MessageKind::entry + MessageKind::text: {
auto r = std::any_cast<
webcface::message::Entry<webcface::message::Text>>(obj);
auto r =
std::get<webcface::message::Entry<webcface::message::Text>>(
obj);
onRecvEntry(this, r, this->text_store, this->text_entry_event);
break;
}
case MessageKind::entry + MessageKind::view: {
auto r = std::any_cast<
webcface::message::Entry<webcface::message::View>>(obj);
auto r =
std::get<webcface::message::Entry<webcface::message::View>>(
obj);
onRecvEntry(this, r, this->view_store, this->view_entry_event);
break;
}
case MessageKind::entry + MessageKind::canvas3d: {
auto r = std::any_cast<
webcface::message::Entry<webcface::message::Canvas3D>>(obj);
auto r =
std::get<webcface::message::Entry<webcface::message::Canvas3D>>(
obj);
onRecvEntry(this, r, this->canvas3d_store,
this->canvas3d_entry_event);
break;
}
case MessageKind::entry + MessageKind::canvas2d: {
auto r = std::any_cast<
webcface::message::Entry<webcface::message::Canvas2D>>(obj);
auto r =
std::get<webcface::message::Entry<webcface::message::Canvas2D>>(
obj);
onRecvEntry(this, r, this->canvas2d_store,
this->canvas2d_entry_event);
break;
}
case MessageKind::entry + MessageKind::robot_model: {
auto r = std::any_cast<
auto r = std::get<
webcface::message::Entry<webcface::message::RobotModel>>(obj);
onRecvEntry(this, r, this->robot_model_store,
this->robot_model_entry_event);
break;
}
case MessageKind::entry + MessageKind::image: {
auto r = std::any_cast<
webcface::message::Entry<webcface::message::Image>>(obj);
auto r =
std::get<webcface::message::Entry<webcface::message::Image>>(
obj);
onRecvEntry(this, r, this->image_store, this->image_entry_event);
break;
}
case MessageKind::func_info: {
auto r = std::any_cast<webcface::message::FuncInfo>(obj);
auto r = std::get<webcface::message::FuncInfo>(obj);
auto member = this->getMemberNameFromId(r.member_id);
this->func_store.setEntry(member, r.field);
this->func_store.setRecv(member, r.field,
Expand Down
30 changes: 11 additions & 19 deletions message/include/webcface/message/message.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include <utility>
#include <vector>
#include <deque>
#include <any>
#include <cstdint>
#include <spdlog/logger.h>
#include "webcface/message/u8string.h"
Expand Down Expand Up @@ -576,14 +575,6 @@ struct Req : public MessageBase<T::kind + MessageKind::req> {
MSGPACK_DEFINE_MAP(MSGPACK_NVP("i", req_id), MSGPACK_NVP("M", member),
MSGPACK_NVP("f", field))
};
#if WEBCFACE_SYSTEM_DLLEXPORT
extern template struct Req<Value>;
extern template struct Req<Text>;
extern template struct Req<View>;
extern template struct Req<Canvas2D>;
extern template struct Req<Canvas3D>;
extern template struct Req<RobotModel>;
#endif
struct ImageReq {
std::optional<int> rows = std::nullopt, cols = std::nullopt;
std::optional<ImageColorMode> color_mode = std::nullopt;
Expand Down Expand Up @@ -628,15 +619,6 @@ struct Entry : public MessageBase<T::kind + MessageKind::entry> {
SharedString field;
MSGPACK_DEFINE_MAP(MSGPACK_NVP("m", member_id), MSGPACK_NVP("f", field))
};
#if WEBCFACE_SYSTEM_DLLEXPORT
extern template struct Entry<Value>;
extern template struct Entry<Text>;
extern template struct Entry<View>;
extern template struct Entry<Canvas2D>;
extern template struct Entry<Image>;
extern template struct Entry<Canvas3D>;
extern template struct Entry<RobotModel>;
#endif
template <typename T>
struct Res {};
/*!
Expand Down Expand Up @@ -754,11 +736,21 @@ struct Res<Image> : public MessageBase<MessageKind::image + MessageKind::res>,
MSGPACK_NVP("h", height_), MSGPACK_NVP("l", color_mode_),
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で返す
*
*/
std::vector<std::pair<int, std::any>>
std::vector<std::pair<int, MessageVariant>>
unpack(const std::string &message,
const std::shared_ptr<spdlog::logger> &logger);

Expand Down
26 changes: 6 additions & 20 deletions message/src/message.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,6 @@

WEBCFACE_NS_BEGIN
namespace message {
template struct WEBCFACE_DLL_INSTANCE_DEF Req<Value>;
template struct WEBCFACE_DLL_INSTANCE_DEF Req<Text>;
template struct WEBCFACE_DLL_INSTANCE_DEF Req<View>;
template struct WEBCFACE_DLL_INSTANCE_DEF Req<Canvas2D>;
template struct WEBCFACE_DLL_INSTANCE_DEF Req<Canvas3D>;
template struct WEBCFACE_DLL_INSTANCE_DEF Req<RobotModel>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<Value>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<Text>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<View>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<Canvas2D>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<Image>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<Canvas3D>;
template struct WEBCFACE_DLL_INSTANCE_DEF Entry<RobotModel>;

static void printMsg(const std::shared_ptr<spdlog::logger> &logger,
const std::string &message) {
std::stringstream ss;
Expand All @@ -30,11 +16,11 @@ static void printMsg(const std::shared_ptr<spdlog::logger> &logger,
// }
// std::cerr << std::endl;
}
std::vector<std::pair<int, std::any>>
std::vector<std::pair<int, MessageVariant>>
unpack(const std::string &message,
const std::shared_ptr<spdlog::logger> &logger) {
if (message.size() == 0) {
return std::vector<std::pair<int, std::any>>{};
return std::vector<std::pair<int, MessageVariant>>{};
}
try {
msgpack::object_handle result;
Expand All @@ -44,12 +30,12 @@ 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, std::any>>{};
return std::vector<std::pair<int, MessageVariant>>{};
}
std::vector<std::pair<int, std::any>> ret;
std::vector<std::pair<int, MessageVariant>> ret;
for (std::size_t i = 0; i < obj.via.array.size; i += 2) {
auto kind = obj.via.array.ptr[i].as<int>();
std::any obj_u;
MessageVariant obj_u;
switch (kind) {

#define MSG_PARSE(type) \
Expand Down Expand Up @@ -106,7 +92,7 @@ unpack(const std::string &message,
} catch (const std::exception &e) {
logger->error("unpack error: {}", e.what());
printMsg(logger, message);
return std::vector<std::pair<int, std::any>>{};
return std::vector<std::pair<int, MessageVariant>>{};
}
}
} // namespace message
Expand Down
Loading

0 comments on commit dd795ed

Please sign in to comment.