11 #include <mvsim/basic_types.h>
24 template <
class CLASS,
typename ARG1 =
void,
typename ARG2 =
int>
28 using Ptr = std::shared_ptr<CLASS>;
32 CLASS* (*ptr_factory1)(ARG1);
33 CLASS* (*ptr_factory2)(ARG1, ARG2);
34 TClassData() : ptr_factory1(
nullptr), ptr_factory2(
nullptr) {}
37 void do_register(
const std::string& class_name,
const TClassData& data)
39 classes_[class_name] = data;
42 Ptr create(
const std::string& class_name, ARG1 a1)
const
44 auto it = classes_.find(class_name);
45 if (it == classes_.end())
46 throw std::runtime_error(
47 (std::string(
"ClassFactory: Unknown class ") + class_name).c_str());
48 if (!it->second.ptr_factory1)
49 throw std::runtime_error(
50 (std::string(
"ClassFactory: factory(1) pointer is nullptr for ") + class_name)
52 return Ptr((*it->second.ptr_factory1)(a1));
54 Ptr create(
const std::string& class_name, ARG1 a1, ARG2 a2)
const
56 auto it = classes_.find(class_name);
57 if (it == classes_.end())
58 throw std::runtime_error(
59 (std::string(
"ClassFactory: Unknown class ") + class_name).c_str());
60 if (!it->second.ptr_factory2)
61 throw std::runtime_error(
62 (std::string(
"ClassFactory: factory(2) pointer is nullptr for ") + class_name)
64 return Ptr((*it->second.ptr_factory2)(a1, a2));
68 std::map<std::string, TClassData> classes_;
71 #define DECLARES_REGISTER_CLASS1(CLASS_NAME, BASE_CLASS, ARG1) \
73 static BASE_CLASS* Create(ARG1 a1) { return new CLASS_NAME(a1); }
74 #define DECLARES_REGISTER_CLASS2(CLASS_NAME, BASE_CLASS, ARG1, ARG2) \
76 static BASE_CLASS* Create(ARG1 a1, ARG2 a2) { return new CLASS_NAME(a1, a2); }
78 #define REGISTER_CLASS1(FACTORY_TYPE, FACTORY_OBJ, TEXTUAL_NAME, CLASS_NAME) \
80 FACTORY_TYPE::TClassData data; \
81 data.ptr_factory1 = &CLASS_NAME::Create; \
82 FACTORY_OBJ.do_register(TEXTUAL_NAME, data); \
85 #define REGISTER_CLASS2(FACTORY_TYPE, FACTORY_OBJ, TEXTUAL_NAME, CLASS_NAME) \
87 FACTORY_TYPE::TClassData data; \
88 data.ptr_factory2 = &CLASS_NAME::Create; \
89 FACTORY_OBJ.do_register(TEXTUAL_NAME, data); \
Definition: ClassFactory.h:26
Definition: ClassFactory.h:31