#pragma once #include #include #include #include class Messager { public: Messager() = delete; static void subcribe(const std::string &key, std::function func) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; funcs.push_back(func); } template static void subcribe(const std::string &key, std::function func) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; funcs.push_back(func); } template static void subcribe(const std::string &key, std::function func) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; funcs.push_back(func); } template static void subcribe(const std::string &key, std::function func) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; funcs.push_back(func); } template static void subcribe(const std::string &key, std::function func) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; funcs.push_back(func); } template static void subcribe(const std::string &key, std::function func) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; funcs.push_back(func); } static void publish(const std::string &key) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; for (const auto &func : funcs) { func(); } } template static void publish(const std::string &key, const T &value) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; for (const auto &func : funcs) { func(value); } } template static void publish(const std::string &key, const T0 &value0, const T1 &value1) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; for (const auto &func : funcs) { func(value0, value1); } } template static void publish(const std::string &key, const T0 &value0, const T1 &value1, const T2 &value2) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; for (const auto &func : funcs) { func(value0, value1, value2); } } template static void publish(const std::string &key, const T0 &value0, const T1 &value1, const T2 &value2, const T3 &value3) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; for (const auto &func : funcs) { func(value0, value1, value2, value3); } } template static void publish(const std::string &key, const T0 &value0, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4) { auto &messager_map = get_messager_map(); auto &funcs = messager_map[key]; for (const auto &func : funcs) { func(value0, value1, value2, value3, value4); } } template static void add_server_func(const std::string &key, std::function func) { auto &server_func = get_server_func(key); if (server_func) { publish("log_fatal", "server_func is already exists, key: " + key); throw std::bad_exception(); } server_func = func; } template static bool has_server(const std::string &key) { auto &server_func = get_server_func(key); if (server_func) { return true; } else { return false; } } template static void remove_server_func(const std::string &key) { auto &server_func = get_server_func(key); server_func = std::function(); } template static std::function &get_server_func(const std::string &key) { auto & server_func_map = get_server_map(); return server_func_map[key]; } public: template static void register_server_map() { get_server_map(); } static void register_data_map() { get_messager_map(); } template static void register_data_map() { get_messager_map(); } template static void register_data_map() { get_messager_map(); } template static void register_data_map() { get_messager_map(); } template static void register_data_map() { get_messager_map(); } template static void register_data_map() { get_messager_map(); } template static std::vector get_server_list() { std::vector keys; auto& server_map = get_server_map(); for (auto& server : server_map) { if (server.second) { keys.push_back(server.first); } } return keys; } private: template static std::map> &get_server_map() { static std::map> server_func_map; return server_func_map; } static std::map>> &get_messager_map() { static std::map>> messager_map; return messager_map; } template static std::map>> &get_messager_map() { static std::map>> messager_map; return messager_map; } template static std::map>> &get_messager_map() { static std::map>> messager_map; return messager_map; } template static std::map>> & get_messager_map() { static std::map>> messager_map; return messager_map; } template static std::map>> & get_messager_map() { static std::map>> messager_map; return messager_map; } template static std::map>> & get_messager_map() { static std::map>> messager_map; return messager_map; } };