#ifndef KYTY_COMMON_SUBSYSTEMS_H_ #define KYTY_COMMON_SUBSYSTEMS_H_ #include "common/common.h" #include #include namespace Common { class Subsystems { public: using Callback = void (*)(); explicit Subsystems(bool print = false); ~Subsystems(); template void Initialize() { Lifecycle::initialize(); m_active.push_back({ShutdownCallback(), EmergencyCallback()}); if (m_print) { std::printf("Initialized: %s\n", Lifecycle::name); } } void Destroy(); void EmergencyShutdown(); static void EmergencyShutdownActive(); KYTY_CLASS_NO_COPY(Subsystems); private: template static consteval Callback ShutdownCallback() { if constexpr (requires { Lifecycle::shutdown; }) { return Lifecycle::shutdown; } return nullptr; } template static consteval Callback EmergencyCallback() { if constexpr (requires { Lifecycle::emergency_shutdown; }) { return Lifecycle::emergency_shutdown; } return nullptr; } struct Entry { Callback shutdown; Callback emergency_shutdown; }; std::vector m_active; bool m_print; }; } // namespace Common #endif /* KYTY_COMMON_SUBSYSTEMS_H_ */