31 #ifndef PTLIB_FACTORY_H
32 #define PTLIB_FACTORY_H
45 #pragma warning(disable:4786)
122 class FactoryMap :
public std::map<std::string, PFactoryBase *>
143 template <
class AbstractClass,
typename KeyType = PDefaultPFactoryKey>
205 template <
class ConcreteClass>
219 return new ConcreteClass;
265 template <
class Derived_T>
293 for (
typename KeyMap_T::const_iterator it =
m_keyMap.begin(); it !=
m_keyMap.end(); ++it)
294 it->second->DestroySingleton();
308 std::string className =
typeid(
PFactory).name();
311 FactoryMap::const_iterator entry = factories.find(className);
312 if (entry != factories.end()) {
313 PAssert(entry->second != NULL,
"Factory map returned NULL for existing key");
322 factories[className] = factory;
368 typename KeyMap_T::const_iterator entry =
m_keyMap.find(key);
370 return entry->second->CreateInstance(key);
379 return m_keyMap[key]->IsSingleton();
386 typename KeyMap_T::const_iterator entry;
388 list.push_back(entry->first);
411 #define PFACTORY_CREATE(factory, ConcreteClass, ...) \
412 namespace PFactoryLoader { \
413 int ConcreteClass##_link() { return 0; } \
414 factory::Worker<ConcreteClass> ConcreteClass##_instance(__VA_ARGS__); \
417 #define PFACTORY_CREATE_SINGLETON(factory, ConcreteClass) \
418 PFACTORY_CREATE(factory, ConcreteClass, typeid(ConcreteClass).name(), true)
420 #define PFACTORY_GET_SINGLETON(factory, ConcreteClass) \
421 static ConcreteClass & GetInstance() { \
422 return *factory::CreateInstanceAs<ConcreteClass>(typeid(ConcreteClass).name()); \
431 #define PFACTORY_LOAD(ConcreteType) \
432 namespace PFactoryLoader { \
433 extern int ConcreteType##_link(); \
434 int const ConcreteType##_loader = ConcreteType##_link(); \
438 #endif // PTLIB_FACTORY_H