4#include "../Common/CompilerMacrosType.h"
5#include "../Common/PrimitiveDefinitions.h"
6#include "../Memory/Memory.h"
13#if SC_COMPILER_MSVC || SC_COMPILER_CLANG_CL
14#define SC_PLUGIN_EXPORT __declspec(dllexport)
16#define SC_PLUGIN_EXPORT __attribute__((visibility("default")))
20#define SC_PLUGIN_LINKER_OPERATORS \
21 void* operator new(SC::size_t len) { return SC::Memory::allocate(len, 8); } \
22 void* operator new[](SC::size_t len) { return SC::Memory::allocate(len, 8); } \
23 void operator delete(void* p, SC::size_t) noexcept \
27 SC::Memory::release(p); \
30 void operator delete(void* p) noexcept \
34 SC::Memory::release(p); \
39#define SC_PLUGIN_LINKER_DEFINITIONS \
40 SC_PLUGIN_LINKER_OPERATORS \
41 extern "C" void __CxxFrameHandler4() {} \
42 extern "C" void __CxxFrameHandler3() {} \
43 int __stdcall DllMain(void*, unsigned int, void*) { return 1; } \
44 extern "C" int _fltused = 0;
50#define SC_PLUGIN_LINKER_DEFINITIONS \
51 SC_PLUGIN_LINKER_OPERATORS \
52 extern "C" void bzero(void* s, SC::size_t n) \
54 unsigned char* p = reinterpret_cast<unsigned char*>(s); \
60 extern "C" int memcmp(const void* s1, const void* s2, SC::size_t n) \
62 const unsigned char* p1 = reinterpret_cast<const unsigned char*>(s1); \
63 const unsigned char* p2 = reinterpret_cast<const unsigned char*>(s2); \
77 extern "C" int __cxa_guard_acquire(SC::uint64_t* guard_object) \
79 if (*reinterpret_cast<const SC::uint8_t*>(guard_object) != 0) \
83 extern "C" void __cxa_guard_release(SC::uint64_t* guard_object) \
85 *reinterpret_cast<SC::uint8_t*>(guard_object) = 1; \
90#define SC_PLUGIN_LINKER_DEFINITIONS
96#define SC_PLUGIN_DEFINE(PluginName) \
97 SC_PLUGIN_LINKER_DEFINITIONS \
98 extern "C" SC_PLUGIN_EXPORT bool PluginName##Init(PluginName*& instance) \
100 instance = new PluginName(); \
101 return instance->init(); \
104 extern "C" SC_PLUGIN_EXPORT bool PluginName##Close(PluginName* instance) \
106 auto res = instance->close(); \
111#define SC_PLUGIN_EXPORT_INTERFACES(PluginName, ...) \
112 extern "C" SC_PLUGIN_EXPORT bool PluginName##QueryInterface(PluginName* plugin, SC::uint32_t hash, \
113 void** pluginInterface) \
115 return SC::PluginCastInterface<PluginName, __VA_ARGS__>()(plugin, hash, pluginInterface); \
121template <
typename PluginClass,
typename... InterfaceClasses>
122struct PluginCastInterface;
124template <
typename PluginClass>
125struct PluginCastInterface<PluginClass>
127 bool operator()(PluginClass*, uint32_t,
void**) {
return false; }
130template <
typename PluginClass,
typename InterfaceClass,
typename... InterfaceClasses>
131struct PluginCastInterface<PluginClass, InterfaceClass, InterfaceClasses...>
133 bool operator()(PluginClass* plugin, uint32_t hash,
void** pluginInterface)
135 if (hash == InterfaceClass::InterfaceHash)
137 *pluginInterface =
static_cast<InterfaceClass*
>(plugin);
140 return PluginCastInterface<PluginClass, InterfaceClasses...>()(plugin, hash, pluginInterface);