31 #ifndef PTLIB_FACTORY_H
32 #define PTLIB_FACTORY_H
46 #pragma warning(disable:4786)
142 return dynamic_cast<TheFactory&
>(
InternalGetFactory(
typeid(TheFactory).name(), CreateFactory<TheFactory>));
156 template <
class AbstractClass,
typename ParamType,
typename KeyType>
231 it->second->DestroySingleton();
246 typename WorkerMap_T::iterator it =
m_workers.find(key);
248 return it->second == worker;
258 typename WorkerMap_T::iterator it =
m_workers.find(key);
260 return it->second->m_singletonInstance == instance;
263 m_workers[key] =
PNEW WorkerBase(instance, autoDeleteInstance);
270 typename WorkerMap_T::iterator itOld =
m_workers.find(oldKey);
274 typename WorkerMap_T::iterator itNew =
m_workers.find(newKey);
276 return itNew->second == itOld->second;
293 if (it->second == instance) {
318 return entry ==
m_workers.end() ? NULL : entry->second->CreateInstance(param);
325 if (entry !=
m_workers.end() && !entry->second->IsSingleton())
333 return entry !=
m_workers.end() && entry->second->IsSingleton();
341 list.push_back(entry->first);
360 #define PFACTORY_STATICS(cls) \
361 static cls & GetFactory() { return PFactoryBase::GetFactoryAs<cls>(); } \
362 static bool Register(const Key_T & k, WorkerBase_T * w) { return GetFactory().InternalRegister(k, w); } \
363 static bool Register(const Key_T & k, Abstract_T * i, bool a = true) { return GetFactory().InternalRegister(k, i, a); } \
364 static bool RegisterAs(const Key_T & synonym, const Key_T & original){ return GetFactory().InternalRegisterAs(synonym, original); } \
365 static void Unregister(const Key_T & k) { GetFactory().InternalUnregister(k); } \
366 static void Unregister(WorkerBase_T * a) { GetFactory().InternalUnregister(a); } \
367 static void UnregisterAll() { GetFactory().InternalUnregisterAll(); } \
368 static bool IsRegistered(const Key_T & k) { return GetFactory().InternalIsRegistered(k); } \
369 static bool IsSingleton(const Key_T & k) { return GetFactory().InternalIsSingleton(k); } \
370 static typename Base_T::KeyList_T GetKeyList() { return GetFactory().InternalGetKeyList(); } \
371 static PMutex & GetMutex() { return GetFactory().m_mutex; } \
377 template <
class AbstractClass,
typename KeyType = PDefaultPFactoryKey>
389 template <
class ConcreteClass>
399 PAssert(Register(key,
this),
"Factory Worker already registered");
412 return new ConcreteClass();
418 return GetFactory().InternalCreateInstance(key, key);
421 template <
class Derived_T>
424 Abstract_T * instance = GetFactory().InternalCreateInstance(key, key);
425 Derived_T * derived =
dynamic_cast<Derived_T *
>(instance);
429 GetFactory().InternalDestroy(key, instance);
438 template <
class AbstractClass,
typename ParamType,
typename KeyType = PDefaultPFactoryKey>
450 template <
class ConcreteClass>
460 PAssert(Register(key,
this),
"Factory Worker already registered");
473 return new ConcreteClass(param);
479 return GetFactory().InternalCreateInstance(key, param);
482 template <
class Derived_T>
485 Abstract_T * instance = GetFactory().InternalCreateInstance(key, param);
486 Derived_T * derived =
dynamic_cast<Derived_T *
>(instance);
489 GetFactory().InternalDestroy(key, instance);
506 #define PFACTORY_CREATE(factory, ConcreteClass, ...) \
507 namespace PFactoryLoader { \
508 int ConcreteClass##_link() { return 0; } \
509 factory::Worker<ConcreteClass> ConcreteClass##_instance(__VA_ARGS__); \
512 #define PFACTORY_SYNONYM(factory, ConcreteClass, name, key) \
513 namespace PFactoryLoader { \
514 bool ConcreteClass##name##_synonym = factory::RegisterAs(key, ConcreteClass##_instance.GetKey()); \
517 #define PFACTORY_CREATE_SINGLETON(factory, ConcreteClass) \
518 PFACTORY_CREATE(factory, ConcreteClass, typeid(ConcreteClass).name(), true)
520 #define PFACTORY_GET_SINGLETON(factory, ConcreteClass) \
521 static ConcreteClass & GetInstance() { \
522 return *factory::CreateInstanceAs<ConcreteClass>(typeid(ConcreteClass).name()); \
531 #define PFACTORY_LOAD(ConcreteType) \
532 namespace PFactoryLoader { \
533 extern int ConcreteType##_link(); \
534 int const ConcreteType##_loader = ConcreteType##_link(); \
538 #endif // PTLIB_FACTORY_H