#pragma once #define SOLANA_PLUGIN_HOST #include #include #include #include #include // TODO: save plug name to instance // id -> version -> ptr extern std::map> g_instance_map; extern "C" { void* g_resolveInstance__internal(const char* id, const char* version); void g_provideInstance__internal(const char* id, const char* version, const char* plugin_name, void* instance); } // extern C namespace internal { template class g_type_version { typedef char yes[1]; typedef char no [2]; template static yes& test_version(decltype(&C::version)); template static no& test_version(...); static bool const has_version = sizeof(test_version(nullptr)) == sizeof(yes); static constexpr const char* get_version(void) { if constexpr (has_version) { return T::version; } else { return "UNK"; // default version } } public: static constexpr const char* version = get_version(); }; } // internal // templated helper, use or make sure vtable is right template void g_provideInstance(const char* id, const char* version, const char* plugin_name, T* instance) { g_provideInstance__internal(id, version, plugin_name, instance); } template void g_provideInstance(const char* id, const char* plugin_name, T* instance) { g_provideInstance__internal(id, internal::g_type_version::version, plugin_name, instance); } // only on host! struct PluginManager { SolanaAPI _sapi { &g_resolveInstance__internal, &g_provideInstance__internal, }; std::vector _plugins; ~PluginManager(void); bool add(const std::string& plug_path); // returns the minimum time until next call is wanted in seconds float tick(float delta); float render(float delta); };