OpenSWMM Engine  6.0.0-alpha.1
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.1)
Loading...
Searching...
No Matches
PluginFactory.hpp
Go to the documentation of this file.
1
40#ifndef OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP
41#define OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP
42
43#include <string>
44#include <vector>
45#include <unordered_map>
46#include <functional>
47
48// Forward declarations
49namespace openswmm {
50 class IPluginComponentInfo;
51 class IInputPlugin;
52 class IOutputPlugin;
53 class IReportPlugin;
54 class IStateIOPlugin;
55 struct SimulationContext;
56 struct SimulationSnapshot;
57 struct PluginSpec;
58 enum class PluginType;
59}
60
61namespace openswmm {
62
73public:
84
85 // Non-copyable, movable
86 PluginFactory(const PluginFactory&) = delete;
88 PluginFactory(PluginFactory&&) noexcept = default;
89 PluginFactory& operator=(PluginFactory&&) noexcept = default;
90
91 // -----------------------------------------------------------------------
92 // Discovery and resolution
93 // -----------------------------------------------------------------------
94
104 void discover(std::function<void(const std::string&)> warn_cb = {});
105
114 const std::string& path,
115 std::function<void(const std::string&)> warn_cb = {}
116 );
117
132 IPluginComponentInfo* find_component(
133 const std::string& id_or_path,
134 std::function<void(const std::string&)> warn_cb = {}
135 );
136
144 std::string id;
145 std::string version;
146 bool has_input = false;
147 bool has_output = false;
148 bool has_report = false;
149 bool has_state_io = false;
151
158 bool is_builtin = false;
159 };
160 std::vector<ComponentEntry> discovered_components() const;
161
162 // -----------------------------------------------------------------------
163 // Loading (from specs or explicit paths)
164 // -----------------------------------------------------------------------
165
176 int load_plugins(
177 const std::vector<PluginSpec>& specs,
178 std::function<void(const std::string&)> warn_cb = {}
179 );
180
181 // -----------------------------------------------------------------------
182 // Lifecycle dispatch (main thread — call in order)
183 // -----------------------------------------------------------------------
184
188 int update_all(const SimulationSnapshot& snapshot);
191
192 // -----------------------------------------------------------------------
193 // Introspection
194 // -----------------------------------------------------------------------
195
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_; }
200
201 int plugin_count() const noexcept {
202 return static_cast<int>(input_plugins_.size()
203 + output_plugins_.size()
204 + report_plugins_.size()
205 + state_io_plugins_.size());
206 }
207
208 bool empty() const noexcept { return plugin_count() == 0; }
209
210 void unload_all();
211
212 // -----------------------------------------------------------------------
213 // Plugin injection (for built-in / programmatic plugins)
214 // -----------------------------------------------------------------------
215
216 void add_output_plugin(IOutputPlugin* plugin, std::vector<std::string> args = {});
217 void add_report_plugin(IReportPlugin* plugin);
218 void add_input_plugin(IInputPlugin* plugin);
219 void add_state_io_plugin(IStateIOPlugin* plugin);
220
221private:
222 // -----------------------------------------------------------------------
223 // Internal types
224 // -----------------------------------------------------------------------
225
226 struct LibEntry {
227 void* handle = nullptr;
228 IPluginComponentInfo* info = nullptr;
229 std::string path;
230 };
231
232 // -----------------------------------------------------------------------
233 // Component registry
234 // -----------------------------------------------------------------------
235
237 std::unordered_map<std::string, std::size_t> registry_;
238
239 // -----------------------------------------------------------------------
240 // Plugin storage
241 // -----------------------------------------------------------------------
242
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_;
249
250 // -----------------------------------------------------------------------
251 // Helpers
252 // -----------------------------------------------------------------------
253
254 void scan_directory(const std::string& dir_path,
255 std::function<void(const std::string&)> warn_cb);
256
267 void register_builtin_infos();
268
276 void validate_filter_invariant(IPluginComponentInfo* info,
277 const std::string& source_path,
278 std::function<void(const std::string&)> warn_cb);
279
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();
283
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;
288};
289
290} /* namespace openswmm */
291
292#endif /* OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP */
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