20 #ifndef _OPENMBV_OBJECTFACTORY_H_
21 #define _OPENMBV_OBJECTFACTORY_H_
26 #include <mbxmlutilshelper/dom.h>
27 #include <xercesc/dom/DOMElement.hpp>
43 template<
class CreateType>
51 template<
class ContainerType>
52 static std::shared_ptr<ContainerType>
create(
const xercesc::DOMElement *element) {
54 static_assert(std::is_convertible<ContainerType*, Object*>::value,
55 "In OpenMBV::ObjectFactory::create<ContainerType>(...) ContainerType must be derived from Object.");
57 if(element==NULL)
return std::shared_ptr<ContainerType>();
59 std::pair<MapIt, MapIt> range=instance().registeredType.equal_range(MBXMLUtils::E(element)->getTagName());
60 for(MapIt it=range.first; it!=range.second; it++) {
62 std::shared_ptr<Object> ele=it->second();
64 std::shared_ptr<ContainerType> ret=std::dynamic_pointer_cast<ContainerType>(ele);
70 throw std::runtime_error(
"No class named "+
MBXMLUtils::X()%element->getTagName()+
" found which is of type "+
71 typeid(ContainerType).name()+
".");
75 template<
class CreateType>
76 static std::shared_ptr<CreateType>
create() {
77 return std::shared_ptr<CreateType>(
new CreateType, &deleter<CreateType>);
81 template<
class CreateType>
82 static std::shared_ptr<CreateType>
create(
const std::shared_ptr<CreateType> &t) {
83 return std::shared_ptr<CreateType>(
new CreateType(*t.get()), &deleter<CreateType>);
89 typedef std::shared_ptr<Object> (*allocateFkt)();
92 typedef std::multimap<MBXMLUtils::FQN, allocateFkt> Map;
93 typedef typename Map::iterator MapIt;
102 static ObjectFactory& instance();
108 template<
class CreateType>
109 static std::shared_ptr<Object> allocate() {
110 return std::shared_ptr<CreateType>(
new CreateType, &deleter<CreateType>);
115 static void deleter(T *t) {
delete t; }
122 template<
class CreateType>
129 ObjectFactory::registerXMLName<CreateType>(name);
136 #define OPENMBV_OBJECTFACTORY_CONCAT1(X, Y) X##Y
137 #define OPENMBV_OBJECTFACTORY_CONCAT(X, Y) OPENMBV_OBJECTFACTORY_CONCAT1(X, Y)
138 #define OPENMBV_OBJECTFACTORY_APPENDLINE(X) OPENMBV_OBJECTFACTORY_CONCAT(X, __LINE__)
142 #define OPENMBV_OBJECTFACTORY_REGISTERXMLNAME(ThisType, name) \
143 static OpenMBV::ObjectFactoryRegisterXMLNameHelper<ThisType> \
144 OPENMBV_OBJECTFACTORY_APPENDLINE(objectFactoryRegistrationDummyVariable)(name);
static std::shared_ptr< ContainerType > create(const xercesc::DOMElement *element)
Definition: objectfactory.h:52
Definition: objectfactory.h:36
static void registerXMLName(const MBXMLUtils::FQN &name)
Definition: objectfactory.h:44
static std::shared_ptr< CreateType > create(const std::shared_ptr< CreateType > &t)
Definition: objectfactory.h:82
ObjectFactoryRegisterXMLNameHelper(const MBXMLUtils::FQN &name)
Definition: objectfactory.h:128
Definition: objectfactory.h:123
static std::shared_ptr< CreateType > create()
Definition: objectfactory.h:76