#include #include "component_loader.hpp" #include void component_loader::register_component(std::unique_ptr&& component_) { get_components().push_back(std::move(component_)); } bool component_loader::post_load() { static auto handled = false; if (handled) return true; handled = true; clean(); try { for (const auto& component_ : get_components()) { component_->post_load(); } } catch (premature_shutdown_trigger&) { return false; } return true; } void component_loader::post_unpack() { static auto handled = false; if (handled) return; handled = true; for (const auto& component_ : get_components()) { component_->post_unpack(); } } void component_loader::pre_destroy() { static auto handled = false; if (handled) return; handled = true; for (const auto& component_ : get_components()) { component_->pre_destroy(); } } void component_loader::clean() { auto& components = get_components(); for (auto i = components.begin(); i != components.end();) { if (!(*i)->is_supported()) { (*i)->pre_destroy(); i = components.erase(i); } else { ++i; } } } void component_loader::trigger_premature_shutdown() { throw premature_shutdown_trigger(); } std::vector>& component_loader::get_components() { using component_vector = std::vector>; using component_vector_container = std::unique_ptr>; static component_vector_container components(new component_vector, [](const component_vector* component_vector) { pre_destroy(); delete component_vector; }); return *components; } size_t operator"" _g(const size_t val) { static auto base = size_t(utils::nt::library{}.get_ptr()); assert(base && "Failed to resolve base"); return base + (val - 0x140000000); } size_t reverse_g(const size_t val) { static auto base = size_t(utils::nt::library{}.get_ptr()); assert(base && "Failed to resolve base"); return (val - base) + 0x140000000; } size_t reverse_g(const void* val) { return reverse_g(reinterpret_cast(val)); }