This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/public/datamodel/dmelementfactoryhelper.h
2020-08-04 13:13:01 -04:00

180 lines
6.7 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef DMELEMENTFACTORYHELPER_H
#define DMELEMENTFACTORYHELPER_H
#ifdef _WIN32
#pragma once
#endif
#include "datamodel/dmattribute.h"
#include "datamodel/dmattributevar.h"
#include "datamodel/dmelement.h"
#include "datamodel/idatamodel.h"
#include "tier1/utlsymbol.h"
#include "tier1/utlvector.h"
//-----------------------------------------------------------------------------
// Internal interface for IDmElementFactory
//-----------------------------------------------------------------------------
class IDmElementFactoryInternal : public IDmElementFactory {
public:
virtual void SetElementTypeSymbol(CUtlSymbol sym) = 0;
virtual bool IsAbstract() const = 0;
};
//-----------------------------------------------------------------------------
// Class used to register factories into a global list
//-----------------------------------------------------------------------------
class CDmElementFactoryHelper {
public:
// Static list of helpers
static CDmElementFactoryHelper *s_pHelpers[2];
// Create all the hud elements
static void InstallFactories();
public:
// Construction
CDmElementFactoryHelper(const char *pClassName,
IDmElementFactoryInternal *pFactory,
bool bIsStandardFactory);
// Accessors
CDmElementFactoryHelper *GetNext(void);
const char *GetClassname();
IDmElementFactoryInternal *GetFactory();
private:
// Next factory in list
CDmElementFactoryHelper *m_pNext;
// Creation function to use for this technology
IDmElementFactoryInternal *m_pFactory;
const char *m_pszClassname;
};
//-----------------------------------------------------------------------------
// Inline methods
//-----------------------------------------------------------------------------
inline const char *CDmElementFactoryHelper::GetClassname() {
return m_pszClassname;
}
inline IDmElementFactoryInternal *CDmElementFactoryHelper::GetFactory() {
return m_pFactory;
}
//-----------------------------------------------------------------------------
// Helper Template factory for simple creation of factories
//-----------------------------------------------------------------------------
template <class T>
class CDmElementFactory : public IDmElementFactoryInternal {
public:
CDmElementFactory(const char *pLookupName) : m_pLookupName(pLookupName) {}
// Creation, destruction
virtual CDmElement *Create(DmElementHandle_t handle,
const char *pElementType,
const char *pElementName, DmFileId_t fileid,
const DmObjectId_t &id) {
return new T(handle, m_pLookupName, id, pElementName, fileid);
}
virtual void Destroy(DmElementHandle_t hElement) {
CDmElement *pElement = g_pDataModel->GetElement(hElement);
if (pElement) {
T *pActualElement = static_cast<T *>(pElement);
delete pActualElement;
}
}
// Sets the type symbol, used for "isa" implementation
virtual void SetElementTypeSymbol(CUtlSymbol sym) { T::SetTypeSymbol(sym); }
virtual bool IsAbstract() const { return false; }
private:
const char *m_pLookupName;
};
template <class T>
class CDmAbstractElementFactory : public IDmElementFactoryInternal {
public:
CDmAbstractElementFactory() {}
// Creation, destruction
virtual CDmElement *Create(DmElementHandle_t handle,
const char *pElementType,
const char *pElementName, DmFileId_t fileid,
const DmObjectId_t &id) {
return NULL;
}
virtual void Destroy(DmElementHandle_t hElement) {}
// Sets the type symbol, used for "isa" implementation
virtual void SetElementTypeSymbol(CUtlSymbol sym) { T::SetTypeSymbol(sym); }
virtual bool IsAbstract() const { return true; }
private:
};
//-----------------------------------------------------------------------------
// Helper macro to create the class factory
//-----------------------------------------------------------------------------
#if defined(MOVIEOBJECTS_LIB) || defined(DATAMODEL_LIB) || \
defined(DMECONTROLS_LIB)
#define IMPLEMENT_ELEMENT_FACTORY(lookupName, className) \
IMPLEMENT_ELEMENT(className) \
CDmElementFactory<className> g_##className##_Factory(#lookupName); \
CDmElementFactoryHelper g_##className##_Helper( \
#lookupName, &g_##className##_Factory, true); \
className *g_##className##LinkerHack = NULL;
#define IMPLEMENT_ABSTRACT_ELEMENT(lookupName, className) \
IMPLEMENT_ELEMENT(className) \
CDmAbstractElementFactory<className> g_##className##_Factory; \
CDmElementFactoryHelper g_##className##_Helper( \
#lookupName, &g_##className##_Factory, true); \
className *g_##className##LinkerHack = NULL;
#else
#define IMPLEMENT_ELEMENT_FACTORY(lookupName, className) \
IMPLEMENT_ELEMENT(className) \
CDmElementFactory<className> g_##className##_Factory(#lookupName); \
CDmElementFactoryHelper g_##className##_Helper( \
#lookupName, &g_##className##_Factory, false); \
className *g_##className##LinkerHack = NULL;
#define IMPLEMENT_ABSTRACT_ELEMENT(lookupName, className) \
IMPLEMENT_ELEMENT(className) \
CDmAbstractElementFactory<className> g_##className##_Factory; \
CDmElementFactoryHelper g_##className##_Helper( \
#lookupName, &g_##className##_Factory, false); \
className *g_##className##LinkerHack = NULL;
#endif
// Used by classes defined in movieobjects or scenedatabase that must be
// explicitly installed
#define IMPLEMENT_ELEMENT_FACTORY_INSTALL_EXPLICITLY(lookupName, className) \
IMPLEMENT_ELEMENT(className) \
CDmElementFactory<className> g_##className##_Factory(#lookupName); \
CDmElementFactoryHelper g_##className##_Helper( \
#lookupName, &g_##className##_Factory, false); \
className *g_##className##LinkerHack = NULL;
//-----------------------------------------------------------------------------
// Installs dm element factories
//-----------------------------------------------------------------------------
void InstallDmElementFactories();
#endif // DMELEMENTFACTORYHELPER_H