//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef STRINGPOOL_H #define STRINGPOOL_H #if defined( _WIN32 ) #pragma once #endif #include "utlrbtree.h" #include "utlvector.h" //----------------------------------------------------------------------------- // Purpose: Allocates memory for strings, checking for duplicates first, // reusing exising strings if duplicate found. //----------------------------------------------------------------------------- class CStringPool { public: CStringPool(); ~CStringPool(); unsigned int Count() const; const char * Allocate( const char *pszValue ); void FreeAll(); // searches for a string already in the pool const char * Find( const char *pszValue ); protected: typedef CUtlRBTree CStrSet; CStrSet m_Strings; }; //----------------------------------------------------------------------------- // Purpose: A reference counted string pool. // // Elements are stored more efficiently than in the conventional string pool, // quicker to look up, and storage is tracked via reference counts. // // At some point this should replace CStringPool //----------------------------------------------------------------------------- class CCountedStringPool { public: // HACK, hash_item_t structure should not be public. struct hash_item_t { char* pString; unsigned short nNextElement; unsigned char nReferenceCount; unsigned char pad; }; enum { INVALID_ELEMENT = 0, MAX_REFERENCE = 0xFF, HASH_TABLE_SIZE = 1024 }; CUtlVector m_HashTable; // Points to each element CUtlVector m_Elements; unsigned short m_FreeListStart; public: CCountedStringPool(); virtual ~CCountedStringPool(); void FreeAll(); char *FindString( const char* pIntrinsic ); char *ReferenceString( const char* pIntrinsic ); void DereferenceString( const char* pIntrinsic ); // These are only reliable if there are less than 64k strings in your string pool unsigned short FindStringHandle( const char* pIntrinsic ); unsigned short ReferenceStringHandle( const char* pIntrinsic ); char *HandleToString( unsigned short handle ); void SpewStrings(); }; #endif // STRINGPOOL_H