util::dynamic_import

Futex implementation
This commit is contained in:
Nekotekina 2017-01-24 16:52:15 +03:00 committed by Ivan
parent 8ad31d2559
commit 98fc131d47
3 changed files with 183 additions and 175 deletions

View file

@ -38,4 +38,43 @@ namespace utils
bool loaded() const;
explicit operator bool() const;
};
// (assume the lib is always loaded)
void* get_proc_address(const char* lib, const char* name);
template <typename F>
struct dynamic_import
{
static_assert(sizeof(F) == 0, "Invalid function type");
};
template <typename R, typename... Args>
struct dynamic_import<R(Args...)>
{
R(*ptr)(Args...);
const char* const lib;
const char* const name;
// Constant initialization
constexpr dynamic_import(const char* lib, const char* name)
: ptr(nullptr)
, lib(lib)
, name(name)
{
}
// Caller
R operator()(Args... args)
{
if (!ptr)
{
// TODO: atomic
ptr = reinterpret_cast<R(*)(Args...)>(get_proc_address(lib, name));
}
return ptr(args...);
}
};
}
#define DYNAMIC_IMPORT(lib, name, ...) static utils::dynamic_import<__VA_ARGS__> name(lib, #name);