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>
229 it->second->DestroySingleton();
259 m_workers[key] =
PNEW WorkerBase(instance, autoDeleteInstance);
284 if (it->second == instance) {
309 return entry ==
m_workers.end() ? NULL : entry->second->CreateInstance(param);
316 if (entry !=
m_workers.end() && !entry->second->IsSingleton())
324 return entry !=
m_workers.end() && entry->second->IsSingleton();
332 list.push_back(entry->first);
351 #define PFACTORY_STATICS(cls) \
352 static cls & GetFactory() { return PFactoryBase::GetFactoryAs<cls>(); } \
353 static bool Register(const Key_T & k, WorkerBase_T * w) { return GetFactory().InternalRegister(k, w); } \
354 static bool Register(const Key_T & k, Abstract_T * i, bool a = true) { return GetFactory().InternalRegister(k, i, a); } \
355 static bool RegisterAs(const Key_T & synonym, const Key_T & original){ return GetFactory().InternalRegisterAs(synonym, original); } \
356 static void Unregister(const Key_T & k) { GetFactory().InternalUnregister(k); } \
357 static void Unregister(WorkerBase_T * a) { GetFactory().InternalUnregister(a); } \
358 static void UnregisterAll() { GetFactory().InternalUnregisterAll(); } \
359 static bool IsRegistered(const Key_T & k) { return GetFactory().InternalIsRegistered(k); } \
360 static bool IsSingleton(const Key_T & k) { return GetFactory().InternalIsSingleton(k); } \
361 static typename Base_T::KeyList_T GetKeyList() { return GetFactory().InternalGetKeyList(); } \
362 static PMutex & GetMutex() { return GetFactory().m_mutex; } \
368 template <
class AbstractClass,
typename KeyType = PDefaultPFactoryKey>
380 template <
class ConcreteClass>
393 return new ConcreteClass();
399 return GetFactory().InternalCreateInstance(key, key);
402 template <
class Derived_T>
405 Abstract_T * instance = GetFactory().InternalCreateInstance(key, key);
406 Derived_T * derived =
dynamic_cast<Derived_T *
>(instance);
410 GetFactory().InternalDestroy(key, instance);
419 template <
class AbstractClass,
typename ParamType,
typename KeyType = PDefaultPFactoryKey>
431 template <
class ConcreteClass>
444 return new ConcreteClass(param);
450 return GetFactory().InternalCreateInstance(key, param);
453 template <
class Derived_T>
456 Abstract_T * instance = GetFactory().InternalCreateInstance(key, param);
457 Derived_T * derived =
dynamic_cast<Derived_T *
>(instance);
460 GetFactory().InternalDestroy(key, instance);
477 #define PFACTORY_CREATE(factory, ConcreteClass, ...) \
478 namespace PFactoryLoader { \
479 int ConcreteClass##_link() { return 0; } \
480 factory::Worker<ConcreteClass> ConcreteClass##_instance(__VA_ARGS__); \
483 #define PFACTORY_CREATE_SINGLETON(factory, ConcreteClass) \
484 PFACTORY_CREATE(factory, ConcreteClass, typeid(ConcreteClass).name(), true)
486 #define PFACTORY_GET_SINGLETON(factory, ConcreteClass) \
487 static ConcreteClass & GetInstance() { \
488 return *factory::CreateInstanceAs<ConcreteClass>(typeid(ConcreteClass).name()); \
497 #define PFACTORY_LOAD(ConcreteType) \
498 namespace PFactoryLoader { \
499 extern int ConcreteType##_link(); \
500 int const ConcreteType##_loader = ConcreteType##_link(); \
504 #endif // PTLIB_FACTORY_H