#pragma once #include "componentbasic_global.h" #include #include /// /// 消息响应处理单元基类 /// /// 输入类型 /// 输出类型 template class WsRespond { public: using SelfType = WsRespond; virtual ~WsRespond() = default; /// /// Respond的类型签名 /// /// static WsRespondSignatureType signature() { return std::make_pair(MsgA().topicString(), MsgB().topicString()); } /// /// 子类中实际处理函数 /// /// /// virtual void execute(std::shared_ptr in, QList>& out) = 0; /// /// WsRespond构造函数 /// /// 注册函数 explicit WsRespond(QHash& map) { WsRespondEntry ins = [=](std::shared_ptr in, QList>& out) { QList> o_ptrs; this->execute(std::static_pointer_cast(in), o_ptrs); std::transform(o_ptrs.begin(), o_ptrs.end(), std::back_inserter(out), [](std::shared_ptr v) { return std::static_pointer_cast(v); }); }; map[SelfType::signature()] = ins; } }; template struct _RespondRoute; /// /// 响应路由数据基类 /// template <> struct COMPONENTBASIC_EXPORT _RespondRoute<> { QHash _execute_map; _RespondRoute() = default; }; /// /// 消息响应路由综合基类 /// /// 类型 /// 其余类型列表 template struct _RespondRoute : public _RespondRoute, public RespSig { _RespondRoute() : _RespondRoute(), RespSig(_RespondRoute<>::_execute_map) {} }; /// /// 消息响应列表 /// /// template struct RespondRoute : virtual public WsSpecializedSystem, public _RespondRoute { RespondRoute() : _RespondRoute() {} // 通过 WsComponent 继承 virtual QList respondSignatures() const { return _RespondRoute<>::_execute_map.keys(); } virtual QList getRespondWithSignature(const WsRespondSignatureType& t) const { QList list; if (_RespondRoute<>::_execute_map.contains(t)) list << _RespondRoute<>::_execute_map[t]; return list; } virtual QList getRespondWithInType(const QString& msg_type) const { QList list; for (auto key : _RespondRoute<>::_execute_map.keys()) { if (key.first == msg_type) list.append(_RespondRoute<>::_execute_map[key]); } return list; } }; // =========================================================== /// /// Request发送接口 /// /// /// template class WsRequest { public: using SelfType = WsRequest; virtual ~WsRequest() = default; /// /// Request的类型签名 /// /// static WsRequestSignatureType signature() { return std::make_pair(MsgA().topicString(), MsgB().topicString()); } /// /// 子类中实际处理函数 /// /// /// static void request(std::weak_ptr e, std::shared_ptr in, QList>& out) { auto entries = e.lock()->getRespondWithSignature(SelfType::signature()); QList> o_list; for (auto func_it : entries) { func_it(in, o_list); } for (auto msg : o_list) { auto conv = std::dynamic_pointer_cast(msg); if (conv) out << conv; } } static QList> impl(std::weak_ptr e, std::shared_ptr in) { QList> out; WsRequest::request(e, in, out); return out; } /// /// WsRequest构造函数 /// /// Request类型列表 explicit WsRequest(QList& request_list) { request_list << SelfType::signature(); } }; template struct _RequestRoute; /// /// 请求发送数据基类 /// template<> struct COMPONENTBASIC_EXPORT _RequestRoute<> { QList _request_list; _RequestRoute() = default; QList> query(std::weak_ptr e, std::shared_ptr in) { auto binde = e.lock(); auto entries = binde->getRespondWithInType(in->topicString()); QList> out; for (auto func_it : entries) { func_it(in, out); } return out; } }; /// /// 消息发送综合基类 /// /// /// template struct _RequestRoute : public _RequestRoute, public ReqsSig { _RequestRoute() : _RequestRoute(), ReqsSig(_RequestRoute<>::_request_list) {} }; /// /// 消息发送注册基类 /// /// template struct RequestRoute : virtual public WsSpecializedSystem, public _RequestRoute { RequestRoute() : _RequestRoute() {} virtual QList requestSignatures() const { return _RequestRoute<>::_request_list; } };