21 #pragma warning ( disable : 4786 )
37 class CleanUpObjectFactory
43 ~CleanUpObjectFactory()
48 static CleanUpObjectFactory CleanUpObjectFactoryGlobal;
85 typedef std::multimap<std::string, ObjectFactoryBase::OverrideInformation>
99 std::list<ObjectFactoryBase*>*
116 for ( std::list<ObjectFactoryBase*>::iterator
117 i = m_RegisteredFactories->begin();
118 i != m_RegisteredFactories->end(); ++i )
131 std::list<LightObject::Pointer>
139 std::list<LightObject::Pointer> created;
140 for ( std::list<ObjectFactoryBase*>::iterator
141 i = m_RegisteredFactories->begin();
142 i != m_RegisteredFactories->end(); ++i )
144 std::list<LightObject::Pointer> moreObjects = (*i)->CreateAllObject( itkclassname );
145 created.splice( created.end(), moreObjects );
158 CleanUpObjectFactoryGlobal.Use();
168 new std::list<ObjectFactoryBase*>;
195 char PathSeparator =
';';
197 char PathSeparator =
':';
200 std::string LoadPath;
201 if (getenv(
"ITK_AUTOLOAD_PATH"))
203 LoadPath = getenv(
"ITK_AUTOLOAD_PATH");
210 if(LoadPath.size() == 0)
214 std::string::size_type EndSeparatorPosition = 0;
215 std::string::size_type StartSeparatorPosition = 0;
217 while ( StartSeparatorPosition != std::string::npos )
219 StartSeparatorPosition = EndSeparatorPosition;
224 EndSeparatorPosition = LoadPath.find(PathSeparator,
225 StartSeparatorPosition);
226 if(EndSeparatorPosition == std::string::npos)
228 EndSeparatorPosition = LoadPath.size() + 1;
231 std::string CurrentPath =
232 LoadPath.substr(StartSeparatorPosition,
233 EndSeparatorPosition - StartSeparatorPosition);
240 if(EndSeparatorPosition > LoadPath.size())
242 StartSeparatorPosition = std::string::npos;
246 EndSeparatorPosition++;
261 const char sep =
'\\';
263 const char sep =
'/';
269 if ( !ret.empty() && ret[ret.size()-1] != sep )
294 std::string extension = itksys::DynamicLoader::LibExtension();
300 extension =
".dylib";
303 std::string sname = name;
304 size_t extensionpos = sname.rfind(extension);
305 if ( extensionpos != std::string::npos && extensionpos == sname.size() - extension.size() )
320 if ( !dir->Load(path) )
328 for (
unsigned int i = 0; i < dir->GetNumberOfFiles(); i++ )
330 const char* file = dir->GetFile(i);
405 m_OverrideMap->erase(m_OverrideMap->begin(), m_OverrideMap->end());
406 delete m_OverrideMap;
419 const char nonDynamicName[] =
"Non-Dynamicaly loaded factory";
425 itkGenericOutputMacro(<<
"Possible incompatible factory load:"
428 <<
"\nLoading factory:\n" << factory->
m_LibraryPath <<
"\n");
444 Superclass::PrintSelf(os, indent);
446 os << indent <<
"Factory DLL path: " << m_LibraryPath.c_str() <<
"\n";
447 os << indent <<
"Factory description: " << this->GetDescription() << std::endl;
449 int num =
static_cast<int>( m_OverrideMap->size() );
450 os << indent <<
"Factory overides " << num <<
" classes:" << std::endl;
453 for(OverRideMap::iterator i = m_OverrideMap->begin();
454 i != m_OverrideMap->end(); ++i)
456 os << indent <<
"Class : " << (*i).first.c_str() <<
"\n";
457 os << indent <<
"Overriden with: " << (*i).second.m_OverrideWithName.c_str()
459 os << indent <<
"Enable flag: " << (*i).second.m_EnabledFlag
461 os << indent <<
"Create object: " << (*i).second.m_CreateObject
475 for ( std::list<ObjectFactoryBase*>::iterator i =
476 m_RegisteredFactories->begin();
477 i != m_RegisteredFactories->end(); ++i )
482 m_RegisteredFactories->remove(factory);
501 std::list<void *> libs;
502 for ( std::list<ObjectFactoryBase*>::iterator i
503 = m_RegisteredFactories->begin();
504 i != m_RegisteredFactories->end(); ++i )
506 libs.push_back(static_cast<void *>((*i)->m_LibraryHandle));
509 for ( std::list<ObjectFactoryBase*>::iterator f
510 = m_RegisteredFactories->begin();
511 f != m_RegisteredFactories->end(); ++f )
517 for ( std::list<void *>::iterator lib = libs.begin();
539 const char* subclass,
540 const char* description,
559 OverRideMap::iterator start = m_OverrideMap->lower_bound(itkclassname);
560 OverRideMap::iterator end = m_OverrideMap->upper_bound(itkclassname);
562 for ( OverRideMap::iterator i = start; i != end; ++i )
564 if ( i != m_OverrideMap->end() && (*i).second.m_EnabledFlag)
566 return (*i).second.m_CreateObject->CreateObject();
573 std::list<LightObject::Pointer>
577 OverRideMap::iterator start = m_OverrideMap->lower_bound(itkclassname);
578 OverRideMap::iterator end = m_OverrideMap->upper_bound(itkclassname);
580 std::list<LightObject::Pointer> created;
582 for ( OverRideMap::iterator i = start; i != end; ++i )
584 if ( i != m_OverrideMap->end() && (*i).second.m_EnabledFlag)
586 created.push_back( (*i).second.m_CreateObject->CreateObject() );
598 const char* className,
599 const char* subclassName)
601 OverRideMap::iterator start = m_OverrideMap->lower_bound(className);
602 OverRideMap::iterator end = m_OverrideMap->upper_bound(className);
603 for ( OverRideMap::iterator i = start; i != end; ++i )
605 if ( (*i).second.m_OverrideWithName == subclassName )
607 (*i).second.m_EnabledFlag = flag;
620 OverRideMap::iterator start = m_OverrideMap->lower_bound(className);
621 OverRideMap::iterator end = m_OverrideMap->upper_bound(className);
622 for ( OverRideMap::iterator i = start; i != end; ++i )
624 if ( (*i).second.m_OverrideWithName == subclassName )
626 return (*i).second.m_EnabledFlag;
640 OverRideMap::iterator start = m_OverrideMap->lower_bound(className);
641 OverRideMap::iterator end = m_OverrideMap->upper_bound(className);
642 for ( OverRideMap::iterator i = start; i != end; ++i )
644 (*i).second.m_EnabledFlag = 0;
652 std::list<ObjectFactoryBase*>
663 std::list<std::string>
667 std::list<std::string> ret;
668 for ( OverRideMap::iterator i = m_OverrideMap->begin();
669 i != m_OverrideMap->end(); ++i )
671 ret.push_back((*i).first);
680 std::list<std::string>
684 std::list<std::string> ret;
685 for ( OverRideMap::iterator i = m_OverrideMap->begin();
686 i != m_OverrideMap->end(); ++i )
688 ret.push_back((*i).second.m_OverrideWithName);
697 std::list<std::string>
701 std::list<std::string> ret;
702 for ( OverRideMap::iterator i = m_OverrideMap->begin();
703 i != m_OverrideMap->end(); ++i )
705 ret.push_back((*i).second.m_Description);
719 for( OverRideMap::iterator i = m_OverrideMap->begin();
720 i != m_OverrideMap->end(); ++i)
722 ret.push_back((*i).second.m_EnabledFlag);
733 return m_LibraryPath.c_str();