2022-05-21 06:04:08 -04:00
|
|
|
#include <std_include.hpp>
|
|
|
|
#include "component_loader.hpp"
|
|
|
|
|
2022-05-27 13:08:39 -04:00
|
|
|
#include <utils/nt.hpp>
|
|
|
|
|
2022-05-21 06:04:08 -04:00
|
|
|
void component_loader::register_component(std::unique_ptr<component_interface>&& 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<std::unique_ptr<component_interface>>& component_loader::get_components()
|
|
|
|
{
|
|
|
|
using component_vector = std::vector<std::unique_ptr<component_interface>>;
|
|
|
|
using component_vector_container = std::unique_ptr<component_vector, std::function<void(component_vector*)>>;
|
|
|
|
|
|
|
|
static component_vector_container components(new component_vector, [](const component_vector* component_vector)
|
|
|
|
{
|
|
|
|
pre_destroy();
|
|
|
|
delete component_vector;
|
|
|
|
});
|
|
|
|
|
|
|
|
return *components;
|
|
|
|
}
|
2022-05-27 13:08:39 -04:00
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
2022-05-29 10:01:59 -04:00
|
|
|
|
|
|
|
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<size_t>(val));
|
|
|
|
}
|