diff options
Diffstat (limited to 'public/gcsdk/directory.h')
| -rw-r--r-- | public/gcsdk/directory.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/public/gcsdk/directory.h b/public/gcsdk/directory.h new file mode 100644 index 0000000..dfdef85 --- /dev/null +++ b/public/gcsdk/directory.h @@ -0,0 +1,166 @@ +//====== Copyright �, Valve Corporation, All rights reserved. ================= +// +// Purpose: Defines a directory for all the GC processes for an app +// +//============================================================================= + + +#ifndef DIRECTORY_H +#define DIRECTORY_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlvector.h" +#include "tier1/utlsortvector.h" +#include "tier1/utlmap.h" +#include "tier1/keyvalues.h" +#include "gamecoordinator/igamecoordinator.h" + +namespace GCSDK +{ + + +class CGCDirProcess; + +//----------------------------------------------------------------------------- +// Purpose: Entry for a GC instance +//----------------------------------------------------------------------------- +class CGCDirTypeInstance +{ +public: + CGCDirTypeInstance( const char* pszTypeName, uint32 nType, uint32 nInstance, const KeyValues *pKVConfig, const CGCDirProcess* pProcess ); + ~CGCDirTypeInstance(); + + uint32 GetType() const; + const char* GetTypeName() const; + uint32 GetInstance() const; + KeyValues * GetConfig() const; + const CGCDirProcess* GetProcess() const; + +private: + int32 m_nType; + uint32 m_nInstance; + KeyValues * m_pConfig; + CUtlConstString m_sTypeName; + const CGCDirProcess* m_pProcess; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Entry for a physical machine hosting one or more GC instances +//----------------------------------------------------------------------------- +class CGCDirProcess +{ +public: + CGCDirProcess( uint32 nDirIndex, const char *pchProcessName, const char* pchProcessType, const KeyValues *pKVConfig ); + ~CGCDirProcess( ); + + //determines if this process has any GC's of the specified type + bool HasInstanceOfType( uint32 nType ) const; + uint32 GetGCDirIndex() const; + const char * GetName() const; + const char * GetProcessType() const; + uint32 GetTypeInstanceCount() const; + KeyValues * GetConfig() const; + const CGCDirTypeInstance * GetTypeInstance( uint32 nGCIndex ) const; + + //gets the list of unique types contained within this process as IDs (note order does not match) + const CUtlSortVector< uint32 >& GetUniqueTypeList() const; + +private: + friend class CDirectory; + void AddGC( CGCDirTypeInstance *pGC ); + + uint32 m_iDirGC; + CUtlConstString m_sName; + CUtlConstString m_sType; + KeyValues * m_pConfig; + CUtlVector<CGCDirTypeInstance *> m_vecGCs; + //a bit mask of which types exist on this GC + uint64 m_nTypeMask; + //optimized list for fast searching of which types this process has + CUtlSortVector< uint32 > m_vecUniqueTypeList; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Defines what kind of GCs exist for this app in the current universe, +// the types that exist, and what machines they run on +//----------------------------------------------------------------------------- +class CDirectory +{ +public: + typedef CGCBase *(*GCFactory_t)( const CGCDirProcess *pGCDirProcess ); + static const int s_nInvalidGCType = -1; + + CDirectory(); + ~CDirectory(); + + bool BInit( KeyValues *pKVDirectory ); + void RegisterGCType( int32 nTypeID, const char *pchName ); + + uint32 GetProcessCount() const; + const CGCDirProcess *GetProcess( int32 nIndex ) const; + + uint32 GetGCTypeInstanceCount() const; + const CGCDirTypeInstance *GetGCTypeInstance( uint32 nTypeInst ) const; + + int32 GetGCCountForType( int32 nTypeID ) const; + const CGCDirTypeInstance *GetGCInstanceForType( int32 nTypeID, int32 nInstance ) const; + + const char *GetNameForGCType( int32 nTypeID ) const; + int32 GetGCTypeForName( const char *pchName ) const; + + void RegisterProcessTypeFactory( const char* pszProcessType, GCFactory_t pfnFactory ); + GCFactory_t GetFactoryForProcessType( const char* pszProcessType ) const; + + //given a GC type, and an instance number, this will return the GC directory index used for routing. If the instance number + //is greater than what is available, it will be modulo'd into the acceptable range. If no match for that type can be found, -1 will + //be returned + int32 GetGCDirIndexForInstance( int32 nTypeID, uint32 nInstanceIndex ) const; + + //given a GC type, this will add all of the GC indices associated with that type onto the provided vector + void GetGCDirIndicesForType( int32 nTypeID, CUtlVector< uint32 >& nIndices ) const; + +private: + bool m_bInitialized; + CUtlVector<CGCDirProcess *> m_vecProcesses; + CUtlVector<CGCDirTypeInstance *> m_vecTypeInstances; + CUtlMap< int32, CCopyableUtlVector< CGCDirTypeInstance *> > m_mapGCsByType; + + struct RegisteredGCType_t + { + CUtlConstString m_strName; + }; + CUtlMap< int32, RegisteredGCType_t > m_mapRegisteredGCTypes; + CUtlDict< int32 > m_dictRegisteredGCNameToType; + CUtlDict< GCFactory_t > m_dictProcessTypeToFactory; +}; + +// Gets the global directory singleton +extern CDirectory *GDirectory(); + +//the maximum value that a GC type can use. This is to enable bit masks to encode type information primarily (also don't allow the high bit to avoid SQL signed issues) +#define GC_TYPE_MAX_NUMBER 62 + +// Registration macro for GC types +#define REG_GC_TYPE( typeNum, typeName ) \ + static class CRegGC_##typeName \ + { \ + public: \ + CRegGC_##typeName() { \ + COMPILE_TIME_ASSERT( typeNum <= GC_TYPE_MAX_NUMBER ); \ + GDirectory()->RegisterGCType( ( typeNum ), ( #typeName ) ); } \ + } g_RegGC_##typeName; + +#define REG_GC_PROCESS_TYPE( gcClass, typeName ) \ + static class CRegProcessType_##typeName \ + { \ + public: \ + static CGCBase *Factory( const CGCDirProcess *pDirGC ) { return new gcClass( pDirGC ); } \ + CRegProcessType_##typeName() { GDirectory()->RegisterProcessTypeFactory( ( #typeName ), &Factory ); } \ + } g_RegProcessType_##typeName; + +} // namespace GCSDK +#endif // DIRECTORY_H |