#ifndef SOPHIAR2_SOPHIAR_MANAGER_H #define SOPHIAR2_SOPHIAR_MANAGER_H #include "utility/tiny_signal.hpp" #include "utility/signal_muxer.hpp" #include "utility/slot_demuxer.hpp" #include #include #include #include #include #include #include #include namespace sophiar { class sophiar_obj; class sophiar_manager { public: using obj_factory_func_type = sophiar_obj *(*)(); void build_from_config(const nlohmann::json &config); boost::asio::awaitable switch_mode(const std::string &mode_name); std::string get_object_name(sophiar_obj *obj) const; void notify_object_stop(sophiar_obj *obj); template void register_object_type(const std::string &type_name) { static_assert(std::is_convertible_v); register_object_type_impl(type_name, &Derived::new_instance); } template void register_signal(sophiar_obj *obj, const std::string &signal_name, tiny_signal &signal) { tiny_signal_base *base_ptr = &signal; register_signal_impl(obj, signal_name, base_ptr); } // 将套用 slot_demuxer template void register_slot(sophiar_obj *obj, const std::string &slot_name, typename tiny_signal::slot_type &slot) { tiny_slot_base *slot_base = &slot; slot_demuxer_base *demuxer_base = new slot_demuxer(slot); register_slot_impl(obj, slot_name, slot_base, demuxer_base); } sophiar_manager(); ~sophiar_manager(); private: struct impl; std::unique_ptr pimpl; void register_object_type_impl(const std::string &type_name, obj_factory_func_type func); // 记录 signal 的归属信息 void register_signal_impl(sophiar_obj *obj, const std::string &signal_name, tiny_signal_base *signal_base); // 记录 slot 的归属信息 void register_slot_impl(sophiar_obj *obj, const std::string &slot_name, tiny_slot_base *slot_base, slot_demuxer_base *demuxer_base); }; extern sophiar_manager global_sophiar_manager; #define REGISTER_TYPE(DerivedT) \ global_sophiar_manager.register_object_type(#DerivedT) } #endif //SOPHIAR2_SOPHIAR_MANAGER_H