sophiar_manager.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #ifndef SOPHIAR2_SOPHIAR_MANAGER_H
  2. #define SOPHIAR2_SOPHIAR_MANAGER_H
  3. #include "utility/tiny_signal.hpp"
  4. #include "utility/signal_muxer.hpp"
  5. #include "utility/slot_demuxer.hpp"
  6. #include <boost/asio/awaitable.hpp>
  7. #include <fmt/format.h>
  8. #include <nlohmann/json.hpp>
  9. #include <cassert>
  10. #include <exception>
  11. #include <memory>
  12. #include <string>
  13. #include <type_traits>
  14. namespace sophiar {
  15. class sophiar_obj;
  16. class sophiar_manager {
  17. public:
  18. using obj_factory_func_type = sophiar_obj *(*)();
  19. void build_from_config(const nlohmann::json &config);
  20. boost::asio::awaitable<bool> switch_mode(const std::string &mode_name);
  21. std::string get_object_name(sophiar_obj *obj) const;
  22. void notify_object_stop(sophiar_obj *obj);
  23. template<typename Derived>
  24. void register_object_type(const std::string &type_name) {
  25. static_assert(std::is_convertible_v<decltype(Derived::new_instance()), sophiar_obj *>);
  26. register_object_type_impl(type_name, &Derived::new_instance);
  27. }
  28. template<typename ...Args>
  29. void register_signal(sophiar_obj *obj,
  30. const std::string &signal_name,
  31. tiny_signal<Args...> &signal) {
  32. tiny_signal_base *base_ptr = &signal;
  33. register_signal_impl(obj, signal_name, base_ptr);
  34. }
  35. // 将套用 slot_demuxer
  36. template<typename ...Args>
  37. void register_slot(sophiar_obj *obj,
  38. const std::string &slot_name,
  39. typename tiny_signal<Args...>::slot_type &slot) {
  40. tiny_slot_base *slot_base = &slot;
  41. slot_demuxer_base *demuxer_base = new slot_demuxer<Args...>(slot);
  42. register_slot_impl(obj, slot_name, slot_base, demuxer_base);
  43. }
  44. sophiar_manager();
  45. ~sophiar_manager();
  46. private:
  47. struct impl;
  48. std::unique_ptr<impl> pimpl;
  49. void register_object_type_impl(const std::string &type_name, obj_factory_func_type func);
  50. // 记录 signal 的归属信息
  51. void register_signal_impl(sophiar_obj *obj,
  52. const std::string &signal_name,
  53. tiny_signal_base *signal_base);
  54. // 记录 slot 的归属信息
  55. void register_slot_impl(sophiar_obj *obj,
  56. const std::string &slot_name,
  57. tiny_slot_base *slot_base,
  58. slot_demuxer_base *demuxer_base);
  59. };
  60. extern sophiar_manager global_sophiar_manager;
  61. #define REGISTER_TYPE(DerivedT) \
  62. global_sophiar_manager.register_object_type<DerivedT>(#DerivedT)
  63. }
  64. #endif //SOPHIAR2_SOPHIAR_MANAGER_H