2#ifndef LIBSBX_CORE_ENGINE_HPP_
3#define LIBSBX_CORE_ENGINE_HPP_
15#include <libsbx/utility/concepts.hpp>
16#include <libsbx/utility/noncopyable.hpp>
17#include <libsbx/utility/assert.hpp>
18#include <libsbx/utility/type_name.hpp>
19#include <libsbx/utility/timer.hpp>
20#include <libsbx/utility/logger.hpp>
22#include <libsbx/units/time.hpp>
24#include <libsbx/core/module.hpp>
25#include <libsbx/core/application.hpp>
26#include <libsbx/core/cli.hpp>
27#include <libsbx/core/profiler.hpp>
28#include <libsbx/core/settings.hpp>
34 using stage = module_manager::stage;
35 using module_base = module_manager::module_base;
36 using module_factory = module_manager::module_factory;
40 engine(std::span<std::string_view> args);
50 static auto quit() -> void;
56 template<
typename Module>
57 requires (std::is_base_of_v<module_base, Module>)
58 [[nodiscard]]
static auto get_module() -> Module& {
61 auto& modules = _instance->_modules;
63 if (type >= modules.size() || !modules[type]) {
64 throw std::runtime_error{fmt::format(
"Failed to find module '{}'", utility::type_name<Module>())};
67 return *
static_cast<Module*
>(modules[type]);
70 template<
typename Application = core::application>
71 requires (std::is_same_v<core::application, Application> || std::is_base_of_v<core::application, Application>)
72 [[nodiscard]]
static auto get_application() -> Application& {
73 utility::assert_that(_instance !=
nullptr,
"Engine instance does not exist");
74 utility::assert_that(_instance->_application !=
nullptr,
"Engine has no application running");
76 return *
static_cast<Application*
>(_instance->_application.get());
79 template<
typename Application,
typename... Args>
80 requires (std::is_base_of_v<core::application, Application> && std::is_constructible_v<Application, Args...>)
81 auto run(Args&&... args) ->
void {
82 utility::assert_that(_instance !=
nullptr,
"Engine instance does not exist");
83 utility::assert_that(!_is_running,
"Engine instance is already running");
85 _application = std::make_unique<Application>(std::forward<Args>(args)...);
92 auto _run_main_loop() -> void;
94 auto _create_module(
const std::uint32_t type,
const module_factory& factory) -> void;
96 auto _destroy_module(
const std::uint32_t type) -> void;
98 auto _update_stage(stage stage) -> void;
111 std::unique_ptr<application> _application;
113 std::vector<module_base*> _modules{};
114 std::map<stage, std::vector<std::uint32_t>> _module_by_stage{};
Definition: engine.hpp:32
Definition: settings.hpp:84
Definition: quantity.hpp:66
Definition: noncopyable.hpp:7
static auto value() noexcept -> std::uint32_t
Generates a unique ID for the type.
Definition: type_id.hpp:41