#pragma once #include #include #include #include "node.h" namespace rk3588 { class PluginLoader { public: explicit PluginLoader(std::string plugin_dir); ~PluginLoader(); PluginLoader(const PluginLoader&) = delete; PluginLoader& operator=(const PluginLoader&) = delete; PluginLoader(PluginLoader&& other) noexcept; PluginLoader& operator=(PluginLoader&& other) noexcept; NodePtr Create(const std::string& type, std::string& err); // Switch plugin directory. This will unload any cached plugins. void SetPluginDir(std::string plugin_dir); const std::string& PluginDir() const { return plugin_dir_; } private: struct PluginHandle { void* handle = nullptr; CreateNodeFn create = nullptr; DestroyNodeFn destroy = nullptr; GetTypeFn get_type = nullptr; GetAbiFn get_abi = nullptr; }; std::string BuildLibraryPath(const std::string& type) const; bool LoadPlugin(const std::string& type, PluginHandle& out, std::string& err); std::string plugin_dir_; std::map cache_; }; } // namespace rk3588