20 #ifndef COIL_FACTORY_H 21 #define COIL_FACTORY_H 31 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) 32 # ifdef LIBRARY_EXPORTS 34 # define DLL_PLUGIN __declspec(dllexport) 36 # define EXTERN extern 37 # define DLL_PLUGIN __declspec(dllimport) 43 #endif // ifndef EXTERN 46 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) 47 #pragma warning( push ) 48 #pragma warning( disable : 4251 ) 64 template <
class AbstractClass,
class ConcreteClass>
67 return new ConcreteClass();
81 template <
class AbstractClass,
class ConcreteClass>
84 if (obj == 0) {
return; }
85 ConcreteClass* tmp =
dynamic_cast<ConcreteClass*
>(obj);
86 if (tmp == 0) {
return; }
106 typename Identifier = std::string,
107 typename Compare = std::less<Identifier>,
108 typename Creator = AbstractClass* (*)(),
109 typename Destructor =
void (*)(AbstractClass*&)
116 typedef std::map<Identifier, FactoryEntry>
FactoryMap;
118 typedef std::map<AbstractClass*, FactoryEntry>
ObjectMap;
156 if (m_creators.count(
id) == 0) {
return false; }
181 std::vector<Identifier> idlist;
182 idlist.reserve(m_creators.size());
184 FactoryMapIt it(m_creators.begin());
185 FactoryMapIt it_end(m_creators.end());
189 idlist.push_back(it->first);
230 if (creator == 0 || destructor == 0) {
return INVALID_ARG; }
231 if (m_creators.count(
id) != 0) {
return ALREADY_EXISTS; }
232 FactoryEntry f(
id, creator, destructor);
264 if (m_creators.count(
id) == 0) {
return NOT_FOUND; }
265 m_creators.erase(
id);
294 if (m_creators.count(
id) == 0) {
return 0; }
295 AbstractClass* obj = m_creators[id].creator_();
296 assert(m_objects.count(obj) == 0);
297 m_objects[obj] = m_creators[id];
324 if (m_creators.count(
id) == 0)
326 return deleteObject(obj);
328 m_creators[id].destructor_(obj);
329 m_objects.erase(obj);
354 if (m_objects.count(obj) == 0) {
return NOT_FOUND; }
355 AbstractClass* tmp(obj);
356 m_objects[obj].destructor_(obj);
357 m_objects.erase(tmp);
382 std::vector<AbstractClass*> objects;
383 for (ObjectMapIt it(m_objects.begin()); it != m_objects.end(); ++it)
385 objects.push_back(it->first);
413 return m_objects.count(obj) != 0;
441 if (m_objects.count(obj) == 0) {
return NOT_FOUND; }
442 id = m_objects[obj].id_;
473 return m_objects[obj].creator_;
503 return m_objects[obj].destructor_;
524 explicit FactoryEntry()
549 FactoryEntry(Identifier
id, Creator creator,
Destructor destructor)
550 : id_(
id), creator_(creator), destructor_(destructor)
557 FactoryMap m_creators;
578 typename Identifier = std::string,
579 typename Compare = std::less<Identifier>,
580 typename Creator = AbstractClass* (*)(),
581 typename Destructor =
void (*)(AbstractClass*&)
634 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) 635 #pragma warning( pop ) 638 #endif // COIL_FACTORY_H bool hasFactory(const Identifier &id)
ファクトリー有無チェック
Definition: Factory.h:154
ObjectMap::iterator ObjectMapIt
Definition: Factory.h:119
FactoryMap::iterator FactoryMapIt
Definition: Factory.h:117
AbstractClass * Creator()
Creator テンプレート
Definition: Factory.h:65
ReturnCode removeFactory(const Identifier &id)
ファクトリー削除
Definition: Factory.h:262
ReturnCode
Definition: Factory.h:121
ReturnCode addFactory(const Identifier &id, Creator creator, Destructor destructor)
ファクトリー登録
Definition: Factory.h:226
GlobalFactory テンプレートクラス
Definition: Factory.h:583
Definition: Factory.h:123
std::vector< Identifier > getIdentifiers()
ファクトリーIDリスト取得
Definition: Factory.h:179
Definition: Factory.h:125
Definition: Factory.h:127
Destructor objectToDestructor(AbstractClass *obj)
オブジェクトのデストラクタを取得する
Definition: Factory.h:501
std::vector< AbstractClass * > createdObjects()
生成済みオブジェクトリストの取得
Definition: Factory.h:380
Singleton template class.
Definition: Factory.h:126
Singleton テンプレートクラス
Definition: Singleton.h:106
Definition: Factory.h:124
AbstractClass * createObject(const Identifier &id)
ファクトリーオブジェクト生成
Definition: Factory.h:292
ReturnCode objectToIdentifier(AbstractClass *obj, Identifier &id)
オブジェクトからクラス識別子(ID)を取得する
Definition: Factory.h:439
Factory テンプレートクラス
Definition: Factory.h:111
std::map< AbstractClass *, FactoryEntry > ObjectMap
Definition: Factory.h:118
std::map< Identifier, FactoryEntry > FactoryMap
Definition: Factory.h:113
void Destructor(AbstractClass *&obj)
Destructor テンプレート
Definition: Factory.h:82
ReturnCode deleteObject(AbstractClass *&obj)
ファクトリーオブジェクト削除
Definition: Factory.h:352
bool isProducerOf(AbstractClass *obj)
オブジェクトがこのファクトリの生成物かどうか調べる
Definition: Factory.h:411
Creator objectToCreator(AbstractClass *obj)
オブジェクトのコンストラクタを取得する
Definition: Factory.h:471
ReturnCode deleteObject(const Identifier &id, AbstractClass *&obj)
ファクトリーオブジェクト削除
Definition: Factory.h:322
Common Object Interface Layer.
Definition: Affinity.h:28