diff --git a/client/src/client_msg_recv.cc b/client/src/client_msg_recv.cc index e03216af95..e9ea633069 100644 --- a/client/src/client_msg_recv.cc +++ b/client/src/client_msg_recv.cc @@ -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(obj); + auto &r = *static_cast(obj.get()); this->svr_name = r.svr_name; this->svr_version = r.ver; this->self_member_id.emplace(r.member_id); @@ -93,7 +93,7 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::ping_status: { - auto r = std::get(obj); + auto &r = *static_cast(obj.get()); this->ping_status = r.status; StrSet1 members; { @@ -121,28 +121,30 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::sync: { - auto r = std::get(obj); + auto &r = *static_cast(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>(obj); + auto &r = *static_cast< + webcface::message::Res *>(obj.get()); onRecvRes(this, r, r.data, this->value_store, this->value_change_event); break; } case MessageKind::text + MessageKind::res: { - auto r = - std::get>(obj); + auto &r = + *static_cast *>( + 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>(obj); + auto &r = + *static_cast *>(obj.get()); auto links_data = std::make_shared< std::vector>>(); links_data->reserve(r.data.size()); @@ -155,8 +157,9 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::view + MessageKind::res: { - auto r = - std::get>(obj); + auto &r = + *static_cast *>( + obj.get()); std::lock_guard lock_s(this->view_store.mtx); auto [member, field] = this->view_store.getReq(r.req_id, r.sub_field); @@ -190,9 +193,9 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::canvas3d + MessageKind::res: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Res *>( + obj.get()); std::lock_guard lock_s(this->canvas3d_store.mtx); auto [member, field] = this->canvas3d_store.getReq(r.req_id, r.sub_field); @@ -227,9 +230,9 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::canvas2d + MessageKind::res: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Res *>( + obj.get()); std::lock_guard lock_s(this->canvas2d_store.mtx); auto [member, field] = this->canvas2d_store.getReq(r.req_id, r.sub_field); @@ -262,13 +265,13 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::image + MessageKind::res: { - auto r = - std::get>(obj); + auto &r = *static_cast< + webcface::message::Res *>(obj.get()); onRecvRes(this, r, r, this->image_store, this->image_change_event); break; } case MessageKind::log: { - auto r = std::get(obj); + auto &r = *static_cast(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); @@ -291,7 +294,7 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::call: { - auto r = std::get(obj); + auto &r = *static_cast(obj.get()); auto func_info = this->func_store.getRecv(this->self_member_name, r.field); if (func_info) { @@ -307,7 +310,8 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::call_response: { - auto r = std::get(obj); + auto &r = + *static_cast(obj.get()); try { this->func_result_store.getResult(r.caller_id) ->setter() @@ -327,7 +331,7 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::call_result: { - auto r = std::get(obj); + auto &r = *static_cast(obj.get()); try { if (r.is_error) { this->func_result_store.getResult(r.caller_id) @@ -352,7 +356,7 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::sync_init: { - auto r = std::get(obj); + auto &r = *static_cast(obj.get()); { std::lock_guard lock(this->entry_m); this->member_entry.emplace(r.member_name); @@ -380,58 +384,57 @@ void internal::ClientData::onRecv(const std::string &message) { break; } case MessageKind::entry + MessageKind::value: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Entry *>( + obj.get()); onRecvEntry(this, r, this->value_store, this->value_entry_event); break; } case MessageKind::entry + MessageKind::text: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Entry *>(obj.get()); onRecvEntry(this, r, this->text_store, this->text_entry_event); break; } case MessageKind::entry + MessageKind::view: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Entry *>(obj.get()); onRecvEntry(this, r, this->view_store, this->view_entry_event); break; } case MessageKind::entry + MessageKind::canvas3d: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Entry *>( + obj.get()); onRecvEntry(this, r, this->canvas3d_store, this->canvas3d_entry_event); break; } case MessageKind::entry + MessageKind::canvas2d: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Entry *>( + 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>(obj); + auto &r = *static_cast< + webcface::message::Entry *>( + obj.get()); onRecvEntry(this, r, this->robot_model_store, this->robot_model_entry_event); break; } case MessageKind::entry + MessageKind::image: { - auto r = - std::get>( - obj); + auto &r = *static_cast< + webcface::message::Entry *>( + obj.get()); onRecvEntry(this, r, this->image_store, this->image_entry_event); break; } case MessageKind::func_info: { - auto r = std::get(obj); + auto &r = *static_cast(obj.get()); auto member = this->getMemberNameFromId(r.member_id); this->func_store.setEntry(member, r.field); this->func_store.setRecv(member, r.field, diff --git a/message/include/webcface/message/message.h b/message/include/webcface/message/message.h index 7b09574bf6..e446fae737 100644 --- a/message/include/webcface/message/message.h +++ b/message/include/webcface/message/message.h @@ -737,20 +737,11 @@ struct Res : public MessageBase, MSGPACK_NVP("p", cmp_mode_)) }; -using MessageVariant = - std::variant, - Req, Req, Req, Req, - Req, Req, Entry, Entry, - Entry, Entry, Entry, Entry, - Entry, Res, Res, Res, - Res, Res, Res, Res>; /*! - * \brief msgpackのメッセージをパースしstd::anyで返す + * \brief msgpackのメッセージをパースし返す * */ -std::vector> +std::vector>> unpack(const std::string &message, const std::shared_ptr &logger); diff --git a/message/src/message.cc b/message/src/message.cc index d1149f00e0..e99ce5243b 100644 --- a/message/src/message.cc +++ b/message/src/message.cc @@ -16,11 +16,11 @@ static void printMsg(const std::shared_ptr &logger, // } // std::cerr << std::endl; } -std::vector> +std::vector>> unpack(const std::string &message, const std::shared_ptr &logger) { if (message.size() == 0) { - return std::vector>{}; + return std::vector>>{}; } try { msgpack::object_handle result; @@ -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>{}; + return std::vector>>{}; } - std::vector> ret; + std::vector>> ret; for (std::size_t i = 0; i < obj.via.array.size; i += 2) { auto kind = obj.via.array.ptr[i].as(); - MessageVariant obj_u; + std::shared_ptr obj_u; switch (kind) { #define MSG_PARSE(type) \ case type::kind: \ try { \ - obj_u = obj.via.array.ptr[i + 1].as(); \ + obj_u = \ + std::make_shared(obj.via.array.ptr[i + 1].as()); \ } catch (const std::exception &e) { \ logger->error("unpack error: {} at index={}, kind={}", e.what(), \ i + 1, static_cast(type::kind)); \ @@ -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>{}; + return std::vector>>{}; } } } // namespace message diff --git a/server-store/src/member_data.cc b/server-store/src/member_data.cc index f1eadc52d2..1cb163b703 100644 --- a/server-store/src/member_data.cc +++ b/server-store/src/member_data.cc @@ -155,7 +155,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::sync_init: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); this->name = v.member_name; auto member_id_before = this->member_id; auto prev_cli_it = std::find_if( @@ -283,7 +283,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::sync: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); v.member_id = this->member_id; logger->debug("sync"); // 1つ以上リクエストしているクライアントにはsyncの情報を流す @@ -296,7 +296,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::call: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); v.caller_member_id = this->member_id; logger->debug( "call caller_id={}, target_id={}, field={}, with {} args", @@ -322,7 +322,8 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::call_response: { - auto v = std::get(obj); + auto &v = + *static_cast(obj.get()); logger->debug("call_response to (member_id {}, caller_id {}), {}", v.caller_member_id, v.caller_id, v.started); this->pending_calls[v.caller_member_id][v.caller_id] = 1; @@ -336,7 +337,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::call_result: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug( "call_result to (member_id {}, caller_id {}), {} as {}", v.caller_member_id, v.caller_id, @@ -355,7 +356,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::value: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); if (v.data->size() == 1) { logger->debug("value {} = {}", v.field.decode(), (*v.data)[0]); } else { @@ -391,7 +392,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::text: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug("text {} = {}", v.field.decode(), static_cast(*v.data)); if (!this->text.count(v.field) && @@ -424,7 +425,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::robot_model: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug("robot model {}", v.field.decode()); if (!this->robot_model.count(v.field) && !v.field.startsWith(field_separator)) { @@ -457,7 +458,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::view: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug("view {} diff={}, length={}", v.field.decode(), v.data_diff.size(), v.length); if (!this->view.count(v.field) && @@ -492,7 +493,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::canvas3d: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug("canvas3d {} diff={}, length={}", v.field.decode(), v.data_diff.size(), v.length); if (!this->canvas3d.count(v.field) && @@ -528,7 +529,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::canvas2d: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug("canvas2d {} diff={}, length={}", v.field.decode(), v.data_diff.size(), v.length); if (!this->canvas2d.count(v.field) && @@ -568,7 +569,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::image: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); logger->debug("image {} ({} x {})", v.field.decode(), v.width_, v.height_); if (!this->image.count(v.field) && @@ -602,7 +603,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::log: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); v.member_id = this->member_id; logger->debug("log {} lines", v.log->size()); if (store->keep_log >= 0 && @@ -632,7 +633,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::func_info: { - auto v = std::get(obj); + auto &v = *static_cast(obj.get()); v.member_id = this->member_id; logger->debug("func_info {}", v.field.decode()); if (!this->func.count(v.field) && @@ -649,8 +650,8 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::value: { - auto s = - std::get>(obj); + auto &s = *static_cast< + webcface::message::Req *>(obj.get()); logger->debug("request value ({}): {} from {}", s.req_id, s.field.decode(), s.member.decode()); // 指定した値を返す @@ -683,8 +684,9 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::text: { - auto s = - std::get>(obj); + auto &s = + *static_cast *>( + obj.get()); logger->debug("request text ({}): {} from {}", s.req_id, s.field.decode(), s.member.decode()); // 指定した値を返す @@ -718,9 +720,9 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::robot_model: { - auto s = - std::get>( - obj); + auto &s = *static_cast< + webcface::message::Req *>( + obj.get()); logger->debug("request robot_model ({}): {} from {}", s.req_id, s.field.decode(), s.member.decode()); // 指定した値を返す @@ -753,8 +755,9 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::view: { - auto s = - std::get>(obj); + auto &s = + *static_cast *>( + obj.get()); logger->debug("request view ({}): {} from {}", s.req_id, s.field.decode(), s.member.decode()); // 指定した値を返す @@ -794,9 +797,9 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::canvas3d: { - auto s = - std::get>( - obj); + auto &s = *static_cast< + webcface::message::Req *>( + obj.get()); logger->debug("request canvas3d ({}): {} from {}", s.req_id, s.field.decode(), s.member.decode()); // 指定した値を返す @@ -836,9 +839,9 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::canvas2d: { - auto s = - std::get>( - obj); + auto &s = *static_cast< + webcface::message::Req *>( + obj.get()); logger->debug("request canvas2d ({}): {} from {}", s.req_id, s.field.decode(), s.member.decode()); // 指定した値を返す @@ -882,8 +885,8 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::req + MessageKind::image: { - auto s = - std::get>(obj); + auto &s = *static_cast< + webcface::message::Req *>(obj.get()); logger->debug("request image ({}): {} from {}, {} x {}, color={}, " "mode={}, q={}, fps={}", s.req_id, s.field.decode(), s.member.decode(), @@ -908,7 +911,7 @@ void MemberData::onRecv(const std::string &message) { break; } case MessageKind::log_req: { - auto s = std::get(obj); + auto &s = *static_cast(obj.get()); logger->debug("request log from {}", s.member.decode()); log_req.insert(s.member); // 指定した値を返す diff --git a/tests/dummy_client.h b/tests/dummy_client.h index 0f6a84b382..3f829c2021 100644 --- a/tests/dummy_client.h +++ b/tests/dummy_client.h @@ -6,7 +6,7 @@ using namespace webcface; struct DummyClient { - std::vector> recv_data; + std::vector>> recv_data; // clientからT型のメッセージを受信していればf1, そうでなければf2を実行する template @@ -14,7 +14,7 @@ struct DummyClient { std::lock_guard lock(client_m); for (const auto &m : recv_data) { if (m.first == T::kind) { - on_ok(std::get(m.second)); + on_ok(*static_cast(m.second.get())); return; } } @@ -28,7 +28,7 @@ struct DummyClient { std::lock_guard lock(client_m); for (const auto &m : recv_data) { if (m.first == T::kind) { - on_ok(std::get(m.second)); + on_ok(*static_cast(m.second.get())); return; } } diff --git a/tests/dummy_server.h b/tests/dummy_server.h index d37092828e..aacdb4a328 100644 --- a/tests/dummy_server.h +++ b/tests/dummy_server.h @@ -6,7 +6,7 @@ using namespace webcface; struct DummyServer { - std::vector> recv_data; + std::vector>> recv_data; // clientからT型のメッセージを受信していればf1, そうでなければf2を実行する template @@ -14,7 +14,7 @@ struct DummyServer { std::lock_guard lock(server_m); for (const auto &m : recv_data) { if (m.first == T::kind) { - on_ok(std::get(m.second)); + on_ok(*static_cast(m.second.get())); return; } } @@ -28,7 +28,7 @@ struct DummyServer { std::lock_guard lock(server_m); for (const auto &m : recv_data) { if (m.first == T::kind) { - on_ok(std::get(m.second)); + on_ok(*static_cast(m.second.get())); return; } }