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);
42 Ptr create(
const std::string& class_name, ARG1 a1)
const
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
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));
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); \