You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.2 KiB
100 lines
3.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "datamodel/dmelementfactoryhelper.h" |
|
#include "tier0/dbg.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
CDmElementFactoryHelper *CDmElementFactoryHelper::s_pHelpers[2] = { NULL, NULL }; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Constructor |
|
//----------------------------------------------------------------------------- |
|
CDmElementFactoryHelper::CDmElementFactoryHelper( const char *classname, IDmElementFactoryInternal *pFactory, bool bIsStandardFactory ) |
|
{ |
|
m_pNext = s_pHelpers[bIsStandardFactory]; |
|
s_pHelpers[bIsStandardFactory] = this; |
|
|
|
// Set attributes |
|
Assert( pFactory ); |
|
m_pFactory = pFactory; |
|
Assert( classname ); |
|
m_pszClassname = classname; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns next object in list |
|
// Output : CDmElementFactoryHelper |
|
//----------------------------------------------------------------------------- |
|
CDmElementFactoryHelper *CDmElementFactoryHelper::GetNext( void ) |
|
{ |
|
return m_pNext; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Installs all factories into the datamodel system |
|
//----------------------------------------------------------------------------- |
|
// NOTE: The name of this extern is defined by the macro IMPLEMENT_ELEMENT_FACTORY |
|
extern CDmElementFactoryHelper g_CDmElement_Helper; |
|
|
|
void CDmElementFactoryHelper::InstallFactories( ) |
|
{ |
|
// Just set up the type symbols of the other factories |
|
CDmElementFactoryHelper *p = s_pHelpers[0]; |
|
while ( p ) |
|
{ |
|
// Add factories to database |
|
if ( !p->GetFactory()->IsAbstract() ) |
|
{ |
|
g_pDataModel->AddElementFactory( p->GetClassname(), p->GetFactory() ); |
|
} |
|
|
|
// Set up the type symbol. Note this can't be done at |
|
// constructor time since we don't have a DataModel pointer then |
|
p->GetFactory()->SetElementTypeSymbol( g_pDataModel->GetSymbol( p->GetClassname() ) ); |
|
p = p->GetNext(); |
|
} |
|
|
|
p = s_pHelpers[1]; |
|
while ( p ) |
|
{ |
|
// Add factories to database, but not if they've been overridden |
|
if ( !g_pDataModel->HasElementFactory( p->GetClassname() ) ) |
|
{ |
|
if ( !p->GetFactory()->IsAbstract() ) |
|
{ |
|
g_pDataModel->AddElementFactory( p->GetClassname(), p->GetFactory() ); |
|
} |
|
|
|
// Set up the type symbol. Note this can't be done at |
|
// constructor time since we don't have a DataModel pointer then |
|
|
|
// Backward compat--don't let the type symbol be 'DmeElement' |
|
if ( Q_stricmp( p->GetClassname(), "DmeElement" ) ) |
|
{ |
|
p->GetFactory()->SetElementTypeSymbol( g_pDataModel->GetSymbol( p->GetClassname() ) ); |
|
} |
|
} |
|
|
|
p = p->GetNext(); |
|
} |
|
|
|
// Also install the DmElement factory as the default factory |
|
g_pDataModel->SetDefaultElementFactory( g_CDmElement_Helper.GetFactory() ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Installs all DmElement factories |
|
//----------------------------------------------------------------------------- |
|
void InstallDmElementFactories( ) |
|
{ |
|
CDmElementFactoryHelper::InstallFactories( ); |
|
}
|
|
|