39 template <
class DerivedType>
43 if (factory_instance.children.find(name) !=
44 factory_instance.children.end()) {
45 svmp::raise<svmp::FE::InvalidArgumentException>(
46 "A model with name '" + name +
47 "' was already registered in the ionic model factory.");
50 factory_instance.children[name] = []() -> std::unique_ptr<BaseType> {
51 return std::make_unique<DerivedType>();
60 static std::unique_ptr<BaseType>
create(
const std::string &name) {
63 auto iter = factory_instance.children.find(name);
64 if (iter == factory_instance.children.end()) {
65 svmp::raise<svmp::FE::InvalidArgumentException>(
66 "No class with name '" + name +
"' was registered in the factory.");
69 return iter->second();
80 visit(
const std::function<
void(
const std::string &,
const BaseType &)> &f) {
83 for (
auto &[name, builder] : factory_instance.children) {
84 std::unique_ptr<BaseType> dummy = builder();
110 std::map<std::string, std::function<std::unique_ptr<BaseType>()>>
children;
116#define REGISTER_IN_FACTORY(BaseType, DerivedType, name) \
117 namespace FactoryInternals { \
118 static inline volatile const bool registered_##BaseType##_##DerivedType = \
119 Factory<BaseType>::register_child<DerivedType>(name); \
Exception hierarchy for error handling in the FE library.
Abstract self-registering factory.
Definition factory.h:30
static Factory & get_instance()
Access the singleton instance.
Definition factory.h:98
std::map< std::string, std::function< std::unique_ptr< BaseType >()> > children
Registered derived classes.
Definition factory.h:110
Factory()=default
Default constructor.
static bool register_child(const std::string &name)
Register a derived class in the factory.
Definition factory.h:40
static std::unique_ptr< BaseType > create(const std::string &name)
Instantiate a derived classs by name.
Definition factory.h:60
static void visit(const std::function< void(const std::string &, const BaseType &)> &f)
Iterate through the registered classes.
Definition factory.h:80