6#include <brenta/engine.hpp>
10using namespace brenta;
16std::vector<std::reference_wrapper<subsystem>> engine::subsystems;
17const std::string engine::subsystem_name =
"engine";
18bool engine::initialized =
false;
24std::expected<void, subsystem::error> engine::initialize()
28 for (
auto& s : this->subsystems)
30 auto ret = s.get().initialize();
32 return std::unexpected(engine::subsystem_name +
": failed to initialize "
33 + s.get().name() +
": " + ret.error());
36 engine::initialized =
true;
37 INFO(
"{}: initialized", engine::subsystem_name);
41std::expected<void, subsystem::error> engine::terminate()
45 for (
auto it = this->subsystems.rbegin();
46 it != this->subsystems.rend(); ++it)
50 auto ret = s.get().terminate();
52 return std::unexpected(engine::subsystem_name +
"failed to terminate "
53 + s.get().name() +
": " + ret.error());
56 engine::initialized =
false;
57 INFO(
"{}: terminated", engine::subsystem_name);
63 return engine::subsystem_name;
68 return engine::initialized;
86std::expected<void, std::string>
89 std::reference_wrapper<brenta::subsystem> s =
builder.build();
90 if (!s.get().initialize().has_value())
91 return std::unexpected(s.get().name());
92 engine::subsystems.push_back(s);
101 ERROR(
"engine::manager: failed to initialize subsystem, {}", ret.error());
102 throw std::runtime_error(
"engine::manager: failed to initialize subsystem,"
110 if (!ret.has_value())
112 ERROR(
"engine::manager: failed to terminate subsystem, {}", ret.error());
123 this->subsystems.push_back(
builder.build());
130 this->subsystems.push_back(builder.build());
136 engine::subsystems = this->subsystems;
Automatically initialize and terminate engine with RAII.
~manager()
Terminates all subsystems.
manager()
Initializes all subsystems, throws and exeption in case of failure.
std::string name() override
Returns the name of the sybsystem.
static std::expected< void, std::string > with(subsystem::builder &&builder)
Initialize a subsystem and add it to the managed subsystems (will be terminated with the others).
bool is_initialized() override
Returns true if the subsystem is initialized.
static engine & instance()
Get a static object instance.