101 lines
3.2 KiB
C++
101 lines
3.2 KiB
C++
|
//========= 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( );
|
||
|
}
|