7 #include <mimir/Common.hh>
12 template <
typename Base>
15 using MakeFunc = std::function<std::unique_ptr<Base>()>;
22 void register_type(
const std::string& name, MakeFunc mf) { registry_map[name] = mf; }
24 std::unique_ptr<Base> make(
const std::string& type_name)
const {
25 auto it = registry_map.find(type_name);
26 if (it == registry_map.end()) {
32 std::unique_ptr<Base> make_and_configure(
const std::string& type_name,
const std::string& config_name)
const {
33 std::unique_ptr<Base> instance = make(type_name);
35 instance->SetName(GetConfigRepr(db_link));
36 RAT::info <<
"[MIMIR Factory] Configuring instance: " << instance->GetName() << newline;
37 if (!instance->Configure(db_link)) {
38 RAT::Log::Die(
"[MIMIR Factory] Failed to configure instance: " + instance->GetName());
44 std::map<std::string, MakeFunc> registry_map;
49 namespace Mimir::detail {
51 template <
class Base,
class Derived>
53 static const bool registered;
57 #define MIMIR_REGISTER_TYPE(BaseType, DerivedType, type_name) \
58 namespace Mimir::detail { \
60 const bool AutoRegistrar<BaseType, DerivedType>::registered = [] { \
61 Mimir::Factory<BaseType>::GetInstance().register_type(type_name, [] { return std::make_unique<DerivedType>(); }); \
Definition: Factory.hh:13
static void Die(std::string message, int return_code=1)
Definition: Log.cc:90
Definition: Factory.hh:52