Prepare module management
This commit is contained in:
parent
ba39587135
commit
ff277cfa6e
23
src/loader/module_loader.cpp
Normal file
23
src/loader/module_loader.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "module_loader.hpp"
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<module>>* module_loader::modules_ = nullptr;
|
||||||
|
|
||||||
|
void module_loader::register_module(std::unique_ptr<module>&& module_)
|
||||||
|
{
|
||||||
|
if(!module_loader::modules_)
|
||||||
|
{
|
||||||
|
module_loader::modules_ = new std::vector<std::unique_ptr<module>>();
|
||||||
|
atexit(module_loader::destroy_modules);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_loader::modules_->push_back(std::move(module_));
|
||||||
|
}
|
||||||
|
|
||||||
|
void module_loader::destroy_modules()
|
||||||
|
{
|
||||||
|
if(!module_loader::modules_) return;
|
||||||
|
|
||||||
|
delete module_loader::modules_;
|
||||||
|
module_loader::modules_ = nullptr;
|
||||||
|
}
|
31
src/loader/module_loader.hpp
Normal file
31
src/loader/module_loader.hpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "module.hpp"
|
||||||
|
|
||||||
|
class module_loader final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename T>
|
||||||
|
class installer
|
||||||
|
{
|
||||||
|
static_assert(std::is_base_of<module, T>::value, "Module has invalid base class");
|
||||||
|
|
||||||
|
public:
|
||||||
|
installer()
|
||||||
|
{
|
||||||
|
register_module(std::make_unique<T>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void register_module(std::unique_ptr<module>&& module);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::vector<std::unique_ptr<module>>* modules_;
|
||||||
|
|
||||||
|
static void destroy_modules();
|
||||||
|
};
|
||||||
|
|
||||||
|
#define REGISTER_MODULE(name) \
|
||||||
|
namespace \
|
||||||
|
{ \
|
||||||
|
static module_loader::installer<name> $_##name; \
|
||||||
|
}
|
18
src/module/ceg.cpp
Normal file
18
src/module/ceg.cpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/module_loader.hpp"
|
||||||
|
|
||||||
|
class ceg final : public module
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ceg()
|
||||||
|
{
|
||||||
|
OutputDebugStringA("+ CEG\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
~ceg()
|
||||||
|
{
|
||||||
|
OutputDebugStringA("- CEG\n");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
REGISTER_MODULE(ceg)
|
18
src/module/dw.cpp
Normal file
18
src/module/dw.cpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/module_loader.hpp"
|
||||||
|
|
||||||
|
class dw final : public module
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
dw()
|
||||||
|
{
|
||||||
|
OutputDebugStringA("+ DW\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
~dw()
|
||||||
|
{
|
||||||
|
OutputDebugStringA("- DW\n");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
REGISTER_MODULE(dw)
|
Loading…
Reference in New Issue
Block a user