40#ifndef OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP
41#define OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP
45#include <unordered_map>
50 class IPluginComponentInfo;
55 struct SimulationContext;
56 struct SimulationSnapshot;
104 void discover(std::function<
void(const std::
string&)> warn_cb = {});
114 const std::string& path,
115 std::function<
void(
const std::string&)> warn_cb = {}
133 const std::string& id_or_path,
134 std::function<
void(
const std::string&)> warn_cb = {}
177 const std::vector<PluginSpec>& specs,
178 std::function<
void(
const std::string&)> warn_cb = {}
196 const std::vector<IInputPlugin*>&
input_plugins() const noexcept {
return input_plugins_; }
197 const std::vector<IOutputPlugin*>&
output_plugins() const noexcept {
return output_plugins_; }
198 const std::vector<IReportPlugin*>&
report_plugins() const noexcept {
return report_plugins_; }
199 const std::vector<IStateIOPlugin*>&
state_io_plugins() const noexcept {
return state_io_plugins_; }
202 return static_cast<int>(input_plugins_.size()
203 + output_plugins_.size()
204 + report_plugins_.size()
205 + state_io_plugins_.size());
227 void* handle =
nullptr;
228 IPluginComponentInfo* info =
nullptr;
237 std::unordered_map<std::string, std::size_t> registry_;
243 std::vector<LibEntry> libs_;
244 std::vector<IInputPlugin*> input_plugins_;
245 std::vector<IOutputPlugin*> output_plugins_;
246 std::vector<IReportPlugin*> report_plugins_;
247 std::vector<IStateIOPlugin*> state_io_plugins_;
248 std::vector<std::vector<std::string>> init_args_;
254 void scan_directory(
const std::string& dir_path,
255 std::function<
void(
const std::string&)> warn_cb);
267 void register_builtin_infos();
276 void validate_filter_invariant(IPluginComponentInfo* info,
277 const std::string& source_path,
278 std::function<
void(
const std::string&)> warn_cb);
280 static bool is_file_path(
const std::string& str);
281 static bool is_shared_library(
const std::string& filename);
282 static std::string get_library_directory();
284 static void* platform_load(
const std::string& path);
285 static void platform_unload(
void* handle)
noexcept;
286 static void* platform_sym(
void* handle,
const char* sym)
noexcept;
287 static std::string platform_error() noexcept;
Interface for output-writing plugins.
Definition IOutputPlugin.hpp:57
Describes a plugin component: metadata, capabilities, and factory methods.
Definition IPluginComponentInfo.hpp:179
Manages plugin discovery, loading, and lifecycle for one engine instance.
Definition PluginFactory.hpp:72
IPluginComponentInfo * find_component(const std::string &id_or_path, std::function< void(const std::string &)> warn_cb={})
Resolve a plugin identifier to its component info.
Definition PluginFactory.cpp:284
int prepare_all(SimulationContext &ctx)
Definition PluginFactory.cpp:456
int validate_all(SimulationContext &ctx)
Definition PluginFactory.cpp:432
~PluginFactory()
Definition PluginFactory.cpp:62
IPluginComponentInfo * load_library(const std::string &path, std::function< void(const std::string &)> warn_cb={})
Load a single shared library and register it in the component registry.
Definition PluginFactory.cpp:215
PluginFactory(PluginFactory &&) noexcept=default
void add_input_plugin(IInputPlugin *plugin)
Definition PluginFactory.cpp:540
void add_output_plugin(IOutputPlugin *plugin, std::vector< std::string > args={})
Definition PluginFactory.cpp:530
int write_summary_all(SimulationContext &ctx)
Definition PluginFactory.cpp:517
void discover(std::function< void(const std::string &)> warn_cb={})
Scan standard directories for compatible plugin libraries.
Definition PluginFactory.cpp:172
const std::vector< IReportPlugin * > & report_plugins() const noexcept
Definition PluginFactory.hpp:198
int load_plugins(const std::vector< PluginSpec > &specs, std::function< void(const std::string &)> warn_cb={})
Load plugins from a list of specs (from [PLUGINS] section).
Definition PluginFactory.cpp:340
bool empty() const noexcept
Definition PluginFactory.hpp:208
void unload_all()
Definition PluginFactory.cpp:552
const std::vector< IStateIOPlugin * > & state_io_plugins() const noexcept
Definition PluginFactory.hpp:199
PluginFactory(const PluginFactory &)=delete
int initialize_all(SimulationContext &ctx)
Definition PluginFactory.cpp:381
int finalize_all(SimulationContext &ctx)
Definition PluginFactory.cpp:496
const std::vector< IInputPlugin * > & input_plugins() const noexcept
Definition PluginFactory.hpp:196
void add_state_io_plugin(IStateIOPlugin *plugin)
Definition PluginFactory.cpp:544
const std::vector< IOutputPlugin * > & output_plugins() const noexcept
Definition PluginFactory.hpp:197
int update_all(const SimulationSnapshot &snapshot)
Definition PluginFactory.cpp:475
PluginFactory & operator=(const PluginFactory &)=delete
int plugin_count() const noexcept
Definition PluginFactory.hpp:201
std::vector< ComponentEntry > discovered_components() const
Definition PluginFactory.cpp:312
void add_report_plugin(IReportPlugin *plugin)
Definition PluginFactory.cpp:536
PluginFactory()
Construct and auto-discover plugins in standard directories.
Definition PluginFactory.cpp:57
PluginType
Identifies a plugin capability.
Definition IPluginComponentInfo.hpp:59
Definition NodeCoupling.cpp:15
List all discovered component info entries.
Definition PluginFactory.hpp:143
std::string id
Definition PluginFactory.hpp:144
bool has_state_io
Definition PluginFactory.hpp:149
bool has_output
Definition PluginFactory.hpp:147
bool is_builtin
Definition PluginFactory.hpp:158
std::string version
Definition PluginFactory.hpp:145
bool has_input
Definition PluginFactory.hpp:146
IPluginComponentInfo * info
Definition PluginFactory.hpp:150
bool has_report
Definition PluginFactory.hpp:148
Central, reentrant simulation context.
Definition SimulationContext.hpp:274
Complete simulation state snapshot at one output time step.
Definition SimulationSnapshot.hpp:92