diff options
author | 2016-11-18 14:06:11 -0500 | |
---|---|---|
committer | 2016-11-20 13:41:44 -0500 | |
commit | 17c9b0b7847e71ac49b756e6a0cfc0841ce52ac0 (patch) | |
tree | ddceeec41f182007d71f496189c9ce7f020fae62 /src/osd/modules/lib/osdlib.h | |
parent | e4c856dd1ff81ed945c7edd96993f3d909be9ded (diff) |
Created DYNAMIC_API macros for cleaner definition of dynamically linked functions
Diffstat (limited to 'src/osd/modules/lib/osdlib.h')
-rw-r--r-- | src/osd/modules/lib/osdlib.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib.h b/src/osd/modules/lib/osdlib.h index 7580c92dedd..8fcff19dac8 100644 --- a/src/osd/modules/lib/osdlib.h +++ b/src/osd/modules/lib/osdlib.h @@ -98,4 +98,42 @@ protected: } // namespace osd +//========================================================================================================================= +// Dynamic API helpers. Useful in creating a singleton object that can be called with DYNAMIC_CALL macro for an entire API +// Usage for defining an API is below +// +// DYNAMIC_API_BEGIN(dxgi, { "dxgi.dll" }) +// DYNAMIC_API_FN(DWORD, WINAPI, CreateDXGIFactory1, REFIID, void**) +// DYNAMIC_API_END() +// +// Calling then looks like: DYNAMIC_CALL(dxgi, CreateDXGIFactory1, p1, p2, etc) +//========================================================================================================================= + +#if !defined(OSD_UWP) + +#define DYNAMIC_API_BEGIN(apiname, ...) namespace osd { namespace dynamicapi { \ +class apiname##_api { \ +private: \ + osd::dynamic_module::ptr m_module = osd::dynamic_module::open( { __VA_ARGS__ } ); \ +public: \ + static apiname##_api &instance() { static apiname##_api api; return api; } + +#define DYNAMIC_API_FN(ret, conv, apifunc, ...) ret(conv *m_##apifunc##_pfn)( __VA_ARGS__ ) = m_module->bind<ret(conv *)( __VA_ARGS__ )>(#apifunc); + +#define DYNAMIC_API_END() };}} + +#define DYNAMIC_CALL(apiname, fname, ...) (*osd::dynamicapi::##apiname##_api::instance().m_##fname##_pfn) ( __VA_ARGS__ ) +#define DYNAMIC_API_TEST(apiname, fname) (osd::dynamicapi::##apiname##_api::instance().m_##fname##_pfn != nullptr) + +#else + +#define DYNAMIC_API_BEGIN(apiname, ...) +#define DYNAMIC_API_FN(ret, conv, apifunc, ...) +#define DYNAMIC_API_END() + +#define DYNAMIC_CALL(apiname, fname, ...) fname( __VA_ARGS__ ) +#define DYNAMIC_API_TEST(apiname, fname) (true) + +#endif + #endif /* __OSDLIB__ */ |