source-engine-2018-hl2_src/datamodel/dmelementfactoryhelper.cpp

101 lines
3.2 KiB
C++
Raw Normal View History

2020-04-23 00:56:21 +08:00
//========= 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( );
}