20 #ifndef COIL_FACTORY_H
21 #define COIL_FACTORY_H
30 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
31 # ifdef LIBRARY_EXPORTS
33 # define DLL_PLUGIN __declspec(dllexport)
35 # define EXTERN extern
36 # define DLL_PLUGIN __declspec(dllimport)
57 template <
class AbstractClass,
class ConcreteClass>
60 return new ConcreteClass();
74 template <
class AbstractClass,
class ConcreteClass>
77 if (obj == 0) {
return; }
78 ConcreteClass* tmp =
dynamic_cast<ConcreteClass*
>(obj);
79 if (tmp == 0) {
return; }
99 typename Identifier = std::string,
100 typename Compare = std::less<Identifier>,
101 typename Creator = AbstractClass* (*)(),
102 typename Destructor =
void (*)(AbstractClass*&)
109 typedef std::map<Identifier, FactoryEntry>
FactoryMap;
147 if (m_creators.count(
id) == 0) {
return false; }
172 std::vector<Identifier> idlist;
173 idlist.reserve(m_creators.size());
175 FactoryMapIt it(m_creators.begin());
176 FactoryMapIt it_end(m_creators.end());
180 idlist.push_back(it->first);
221 if (creator == 0 || destructor == 0) {
return INVALID_ARG; }
222 if (m_creators.count(
id) != 0) {
return ALREADY_EXISTS; }
223 FactoryEntry f(creator, destructor);
255 if (m_creators.count(
id) == 0) {
return NOT_FOUND; }
257 m_creators.erase(
id);
286 if (m_creators.count(
id) == 0) {
return 0; }
287 return m_creators[id].creator_();
313 if (m_creators.count(
id) == 0) {
return; }
314 m_creators[id].destructor_(obj);
338 FactoryMapIt it(m_creators.begin());
339 FactoryMapIt it_end(m_creators.end());
343 it->second.destructor_(obj);
366 explicit FactoryEntry()
392 : creator_(creator), destructor_(destructor)
398 FactoryMap m_creators;
418 typename Identifier = std::string,
419 typename Compare = std::less<Identifier>,
420 typename Creator = AbstractClass* (*)(),
421 typename Destructor =
void (*)(AbstractClass*&)
472 #endif // COIL_FACTORY_H
bool hasFactory(const Identifier &id)
Factory presence check.
Definition: coil/include/coil/Factory.h:145
FactoryMap::iterator FactoryMapIt
Definition: coil/include/coil/Factory.h:110
AbstractClass * Creator()
Creator template.
Definition: coil/include/coil/Factory.h:58
ReturnCode removeFactory(const Identifier &id)
Remove factory.
Definition: coil/include/coil/Factory.h:253
ReturnCode
Definition: coil/include/coil/Factory.h:112
ReturnCode addFactory(const Identifier &id, Creator creator, Destructor destructor)
Add factory.
Definition: coil/include/coil/Factory.h:217
GlobalFactory template class.
Definition: coil/include/coil/Factory.h:423
Definition: coil/include/coil/Factory.h:114
std::vector< Identifier > getIdentifiers()
Get factory ID list.
Definition: coil/include/coil/Factory.h:170
Definition: coil/include/coil/Factory.h:116
Definition: coil/include/coil/Factory.h:118
Singleton template class.
Definition: coil/include/coil/Factory.h:117
Singleton template class.
Definition: Singleton.h:106
Definition: coil/include/coil/Factory.h:115
void deleteObject(const Identifier &id, AbstractClass *&obj)
Delete factory object.
Definition: coil/include/coil/Factory.h:311
AbstractClass * createObject(const Identifier &id)
Create factory object.
Definition: coil/include/coil/Factory.h:284
Factory template class.
Definition: coil/include/coil/Factory.h:104
std::map< Identifier, FactoryEntry > FactoryMap
Definition: coil/include/coil/Factory.h:106
void Destructor(AbstractClass *&obj)
Destructor template.
Definition: coil/include/coil/Factory.h:75
void deleteObject(AbstractClass *&obj)
Delete factory object.
Definition: coil/include/coil/Factory.h:336