OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
PluginFactory.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2//
3// Copyright 2026 Caleb Buahin
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
55
56#ifndef OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP
57#define OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP
58
59#include <string>
60#include <vector>
61#include <unordered_map>
62#include <functional>
63
64// Forward declarations
65namespace openswmm {
67 class IInputPlugin;
68 class IOutputPlugin;
69 class IReportPlugin;
70 class IStateIOPlugin;
71 struct SimulationContext;
72 struct SimulationSnapshot;
73 struct PluginSpec;
74 enum class PluginType;
75}
76
77namespace openswmm {
78
89public:
100
101 // Non-copyable, movable
102 PluginFactory(const PluginFactory&) = delete;
104 PluginFactory(PluginFactory&&) noexcept = default;
105 PluginFactory& operator=(PluginFactory&&) noexcept = default;
106
107 // -----------------------------------------------------------------------
108 // Discovery and resolution
109 // -----------------------------------------------------------------------
110
120 void discover(std::function<void(const std::string&)> warn_cb = {});
121
130 const std::string& path,
131 std::function<void(const std::string&)> warn_cb = {}
132 );
133
148 IPluginComponentInfo* find_component(
149 const std::string& id_or_path,
150 std::function<void(const std::string&)> warn_cb = {}
151 );
152
160 std::string id;
161 std::string version;
162 bool has_input = false;
163 bool has_output = false;
164 bool has_report = false;
165 bool has_state_io = false;
167
174 bool is_builtin = false;
175 };
176 std::vector<ComponentEntry> discovered_components() const;
177
178 // -----------------------------------------------------------------------
179 // Loading (from specs or explicit paths)
180 // -----------------------------------------------------------------------
181
192 int load_plugins(
193 const std::vector<PluginSpec>& specs,
194 std::function<void(const std::string&)> warn_cb = {}
195 );
196
197 // -----------------------------------------------------------------------
198 // Lifecycle dispatch (main thread — call in order)
199 // -----------------------------------------------------------------------
200
204 int update_all(const SimulationSnapshot& snapshot);
207
208 // -----------------------------------------------------------------------
209 // Introspection
210 // -----------------------------------------------------------------------
211
212 const std::vector<IInputPlugin*>& input_plugins() const noexcept { return input_plugins_; }
213 const std::vector<IOutputPlugin*>& output_plugins() const noexcept { return output_plugins_; }
214 const std::vector<IReportPlugin*>& report_plugins() const noexcept { return report_plugins_; }
215 const std::vector<IStateIOPlugin*>& state_io_plugins() const noexcept { return state_io_plugins_; }
216
217 int plugin_count() const noexcept {
218 return static_cast<int>(input_plugins_.size()
219 + output_plugins_.size()
220 + report_plugins_.size()
221 + state_io_plugins_.size());
222 }
223
224 bool empty() const noexcept { return plugin_count() == 0; }
225
226 void unload_all();
227
228 // -----------------------------------------------------------------------
229 // Plugin injection (for built-in / programmatic plugins)
230 // -----------------------------------------------------------------------
231
232 void add_output_plugin(IOutputPlugin* plugin, std::vector<std::string> args = {});
233 void add_report_plugin(IReportPlugin* plugin);
234 void add_input_plugin(IInputPlugin* plugin);
235 void add_state_io_plugin(IStateIOPlugin* plugin);
236
237private:
238 // -----------------------------------------------------------------------
239 // Internal types
240 // -----------------------------------------------------------------------
241
242 struct LibEntry {
243 void* handle = nullptr;
244 IPluginComponentInfo* info = nullptr;
245 std::string path;
246 };
247
248 // -----------------------------------------------------------------------
249 // Component registry
250 // -----------------------------------------------------------------------
251
253 std::unordered_map<std::string, std::size_t> registry_;
254
255 // -----------------------------------------------------------------------
256 // Plugin storage
257 // -----------------------------------------------------------------------
258
259 std::vector<LibEntry> libs_;
260 std::vector<IInputPlugin*> input_plugins_;
261 std::vector<IOutputPlugin*> output_plugins_;
262 std::vector<IReportPlugin*> report_plugins_;
263 std::vector<IStateIOPlugin*> state_io_plugins_;
264 std::vector<std::vector<std::string>> init_args_;
265
266 // -----------------------------------------------------------------------
267 // Helpers
268 // -----------------------------------------------------------------------
269
270 void scan_directory(const std::string& dir_path,
271 std::function<void(const std::string&)> warn_cb);
272
283 void register_builtin_infos();
284
292 void validate_filter_invariant(IPluginComponentInfo* info,
293 const std::string& source_path,
294 std::function<void(const std::string&)> warn_cb);
295
296 static bool is_file_path(const std::string& str);
297 static bool is_shared_library(const std::string& filename);
298 static std::string get_library_directory();
299
300 static void* platform_load(const std::string& path);
301 static void platform_unload(void* handle) noexcept;
302 static void* platform_sym(void* handle, const char* sym) noexcept;
303 static std::string platform_error() noexcept;
304};
305
306} /* namespace openswmm */
307
308#endif /* OPENSWMM_ENGINE_PLUGIN_FACTORY_HPP */
Interface for input file reader/writer plugins.
Definition IInputPlugin.hpp:59
Interface for output-writing plugins.
Definition IOutputPlugin.hpp:73
Describes a plugin component: metadata, capabilities, and factory methods.
Definition IPluginComponentInfo.hpp:195
Interface for report-writing plugins.
Definition IReportPlugin.hpp:61
Interface for state / hot-start IO plugins.
Definition IStateIOPlugin.hpp:69
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:316
int prepare_all(SimulationContext &ctx)
Definition PluginFactory.cpp:488
int validate_all(SimulationContext &ctx)
Definition PluginFactory.cpp:464
~PluginFactory()
Definition PluginFactory.cpp:82
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:247
PluginFactory(PluginFactory &&) noexcept=default
void add_input_plugin(IInputPlugin *plugin)
Definition PluginFactory.cpp:572
void add_output_plugin(IOutputPlugin *plugin, std::vector< std::string > args={})
Definition PluginFactory.cpp:562
int write_summary_all(SimulationContext &ctx)
Definition PluginFactory.cpp:549
void discover(std::function< void(const std::string &)> warn_cb={})
Scan standard directories for compatible plugin libraries.
Definition PluginFactory.cpp:204
const std::vector< IReportPlugin * > & report_plugins() const noexcept
Definition PluginFactory.hpp:214
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:372
bool empty() const noexcept
Definition PluginFactory.hpp:224
void unload_all()
Definition PluginFactory.cpp:584
const std::vector< IStateIOPlugin * > & state_io_plugins() const noexcept
Definition PluginFactory.hpp:215
PluginFactory(const PluginFactory &)=delete
int initialize_all(SimulationContext &ctx)
Definition PluginFactory.cpp:413
int finalize_all(SimulationContext &ctx)
Definition PluginFactory.cpp:528
const std::vector< IInputPlugin * > & input_plugins() const noexcept
Definition PluginFactory.hpp:212
void add_state_io_plugin(IStateIOPlugin *plugin)
Definition PluginFactory.cpp:576
const std::vector< IOutputPlugin * > & output_plugins() const noexcept
Definition PluginFactory.hpp:213
int update_all(const SimulationSnapshot &snapshot)
Definition PluginFactory.cpp:507
PluginFactory & operator=(const PluginFactory &)=delete
int plugin_count() const noexcept
Definition PluginFactory.hpp:217
std::vector< ComponentEntry > discovered_components() const
Definition PluginFactory.cpp:344
void add_report_plugin(IReportPlugin *plugin)
Definition PluginFactory.cpp:568
PluginFactory()
Construct and auto-discover plugins in standard directories.
Definition PluginFactory.cpp:77
PluginType
Identifies a plugin capability.
Definition IPluginComponentInfo.hpp:75
Definition NodeCoupling.cpp:16
List all discovered component info entries.
Definition PluginFactory.hpp:159
std::string id
Definition PluginFactory.hpp:160
bool has_state_io
Definition PluginFactory.hpp:165
bool has_output
Definition PluginFactory.hpp:163
bool is_builtin
Definition PluginFactory.hpp:174
std::string version
Definition PluginFactory.hpp:161
bool has_input
Definition PluginFactory.hpp:162
IPluginComponentInfo * info
Definition PluginFactory.hpp:166
bool has_report
Definition PluginFactory.hpp:164
One plugin entry from the [PLUGINS] section.
Definition SimulationContext.hpp:132
Central, reentrant simulation context.
Definition SimulationContext.hpp:353
Complete simulation state snapshot at one output time step.
Definition SimulationSnapshot.hpp:117