6#include <brenta/engine.hpp>
7#include <brenta/logger.hpp>
11using namespace brenta;
17tenno::vector<tenno::reference_wrapper<Subsystem>> Engine::subsystems;
18const std::string Engine::subsystem_name =
"engine";
19bool Engine::initialized =
false;
25std::expected<void, Subsystem::Error> Engine::initialize()
27 if (this->is_initialized())
return {};
29 for (
auto& s : this->subsystems)
31 auto ret = s.get().initialize();
33 return std::unexpected(Engine::subsystem_name +
": failed to initialize "
34 + s.get().name() +
": " + ret.error());
37 Engine::initialized =
true;
38 INFO(
"{}: initialized", Engine::subsystem_name);
42std::expected<void, Subsystem::Error> Engine::terminate()
44 if (!this->is_initialized())
return {};
46 for (
auto it = this->subsystems.rbegin();
47 it != this->subsystems.rend(); ++it)
51 auto ret = s.get().terminate();
53 return std::unexpected(Engine::subsystem_name +
"failed to terminate "
54 + s.get().name() +
": " + ret.error());
57 Engine::initialized =
false;
58 INFO(
"{}: terminated", Engine::subsystem_name);
62std::string Engine::name()
64 return Engine::subsystem_name;
67bool Engine::is_initialized()
69 return Engine::initialized;
87std::expected<void, std::string>
90 tenno::reference_wrapper<brenta::Subsystem> s = builder.build();
91 if (!s.get().initialize().has_value())
92 return std::unexpected(s.get().name());
93 Engine::subsystems.push_back(s);
97Engine::Manager::Manager()
99 auto ret = Engine::instance().initialize();
100 if (!ret.has_value())
102 ERROR(
"Engine::Manager: failed to initialize subsystem, {}", ret.error());
103 throw std::runtime_error(
"Engine::Manager: failed to initialize subsystem,"
109Engine::Manager::~Manager()
111 auto ret = Engine::instance().terminate();
112 if (!ret.has_value())
114 ERROR(
"Engine::Manager: failed to terminate subsystem, {}", ret.error());
126 this->subsystems.push_back(builder.build());
133 this->subsystems.push_back(builder.build());
139 Engine::subsystems = this->subsystems;
140 return Engine::instance();