template <class T>
void CvXMLLoadUtility::SetGlobalClassInfoTwoPassReplacement(std::vector<T*>& aInfos, const char* szTagName)
{
char szLog[256];
sprintf(szLog, "SetGlobalClassInfo (%s)", szTagName);
PROFILE(szLog);
logMsg(szLog);
if (gDLL->getXMLIFace()->LocateNode(m_pFXml, szTagName))
{
// loop through each tag
do
{
SkipToNextVal(); // skip to the next non-comment node
T* pClassInfo = new T;
FAssert(NULL != pClassInfo);
bool bSuccess = pClassInfo->readPass2(this);
if ( !GC.isAnyDependency() )
{
FAssert(bSuccess);
}
else
{
int iTypeIndex = -1;
if (NULL != pClassInfo->getType())
{
iTypeIndex = GC.getInfoTypeForString(pClassInfo->getType(), true);
}
// TYPE dependency? (Condition 1)
if ( GC.getTypeDependency() && -1 == iTypeIndex)
{
delete pClassInfo;
GC.resetDependencies(); // make sure we always reset once anydependency was true!
continue;
}
// OR Dependencies (Condition 2)
GC.setTypeDependency(false);
if ( GC.getOrNumDependencyTypes() > 0 )
{
// if we have Or dependencies, set to dependend by default(this will prevent loading)
// the moment ANY condition is met, we can safely load the ClassInfo and set the
// dependency to false
GC.setTypeDependency(true);
}
for ( int iI = 0; iI < GC.getOrNumDependencyTypes(); iI++ )
{
iTypeIndex = GC.getInfoTypeForString( GC.getOrDependencyTypes(iI), true );
if ( !(iTypeIndex == -1) )
{
// we found a OR dependent Type, so we can load safely!
// dependency will be set disabled(false)
GC.setTypeDependency(false);
}
}
for ( int iI = 0; iI < GC.getAndNumDependencyTypes(); iI++ )
{
iTypeIndex = GC.getInfoTypeForString( GC.getAndDependencyTypes(iI), true );
if ( iTypeIndex == -1 )
{
// if any AND condition is not met, we disable the loading of the Class Info!
GC.setTypeDependency(true);
}
}
//This covers both the bTypeDependency and the And/Or-DependencyTypes tags!
if ( GC.getTypeDependency() )
{
// We found that any of the 3! conditions NOT to load this class info has been met!
delete pClassInfo;
GC.resetDependencies(); // make sure we always reset once anydependency was true!
continue;
}
else
{
bool bSuccess = pClassInfo->read(this);
GC.resetDependencies(); // make sure we always reset once anydependency was true!
FAssert(bSuccess);
if (!bSuccess)
{
delete pClassInfo;
break;
}
}
}
int iIndex = -1;
if (NULL != pClassInfo->getType())
{
iIndex = GC.getInfoTypeForString(pClassInfo->getType(), true);
}
aInfos[iIndex]->copyNonDefaultsReadPass2(pClassInfo);
[B]SAFE_DELETE(pClassInfo);[/B]
} while (gDLL->getXMLIFace()->NextSibling(m_pFXml));
}
}