Brenta Engine 1.2
Loading...
Searching...
No Matches
engine.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/engine.hpp>
7
8#include <stdexcept>
9
10using namespace brenta;
11
12//
13// Static variables
14//
15
16std::vector<std::reference_wrapper<subsystem>> engine::subsystems;
17const std::string engine::subsystem_name = "engine";
18bool engine::initialized = false;
19
20//
21// Subsystem interface
22//
23
24std::expected<void, subsystem::error> engine::initialize()
25{
26 if (this->is_initialized()) return {};
27
28 for (auto& s : this->subsystems)
29 {
30 auto ret = s.get().initialize();
31 if (!ret.has_value())
32 return std::unexpected(engine::subsystem_name + ": failed to initialize "
33 + s.get().name() + ": " + ret.error());
34 }
35
36 engine::initialized = true;
37 INFO("{}: initialized", engine::subsystem_name);
38 return {};
39}
40
41std::expected<void, subsystem::error> engine::terminate()
42{
43 if (!this->is_initialized()) return {};
44
45 for (auto it = this->subsystems.rbegin();
46 it != this->subsystems.rend(); ++it)
47 {
48 auto& s = *it;
49
50 auto ret = s.get().terminate();
51 if (!ret.has_value())
52 return std::unexpected(engine::subsystem_name + "failed to terminate "
53 + s.get().name() + ": " + ret.error());
54 }
55
56 engine::initialized = false;
57 INFO("{}: terminated", engine::subsystem_name);
58 return {};
59}
60
61std::string engine::name()
62{
63 return engine::subsystem_name;
64}
65
67{
68 return engine::initialized;
69}
70
71//
72// Member functions
73//
74
76{
77 static brenta::engine _instance;
78 return _instance;
79}
80
81engine::manager engine::managed()
82{
83 return engine::manager();
84}
85
86std::expected<void, std::string>
88{
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);
93 return {};
94}
95
97{
98 auto ret = engine::instance().initialize();
99 if (!ret.has_value())
100 {
101 ERROR("engine::manager: failed to initialize subsystem, {}", ret.error());
102 throw std::runtime_error("engine::manager: failed to initialize subsystem,"
103 + ret.error());
104 }
105}
106
108{
109 auto ret = engine::instance().terminate();
110 if (!ret.has_value())
111 {
112 ERROR("engine::manager: failed to terminate subsystem, {}", ret.error());
113 }
114}
115
116//
117// Builder
118//
119
121engine::builder::with(subsystem::builder &builder)
122{
123 this->subsystems.push_back(builder.build());
124 return *this;
125}
126
128engine::builder::with(subsystem::builder &&builder)
129{
130 this->subsystems.push_back(builder.build());
131 return *this;
132}
133
134subsystem &engine::builder::build()
135{
136 engine::subsystems = this->subsystems;
137 return engine::instance();
138}
Engine builder.
Definition engine.hpp:107
Automatically initialize and terminate engine with RAII.
Definition engine.hpp:89
~manager()
Terminates all subsystems.
Definition engine.cpp:107
manager()
Initializes all subsystems, throws and exeption in case of failure.
Definition engine.cpp:96
Engine class.
Definition engine.hpp:46
std::string name() override
Returns the name of the sybsystem.
Definition engine.cpp:61
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).
Definition engine.cpp:87
bool is_initialized() override
Returns true if the subsystem is initialized.
Definition engine.cpp:66
static engine & instance()
Get a static object instance.
Definition engine.cpp:75
Builder interface.
Definition subsystem.hpp:49
Subsystem interface.
Definition subsystem.hpp:22