You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
3.3 KiB
126 lines
3.3 KiB
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
|
|
#include "convar.h" |
|
#include "tier0/dbg.h" |
|
#include "stringpool.h" |
|
#include "tier1/strtools.h" |
|
#include "generichash.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Comparison function for string sorted associative data structures |
|
//----------------------------------------------------------------------------- |
|
|
|
bool StrLessInsensitive( const char * const &pszLeft, const char * const &pszRight ) |
|
{ |
|
return ( Q_stricmp( pszLeft, pszRight) < 0 ); |
|
} |
|
|
|
bool StrLessSensitive( const char * const &pszLeft, const char * const &pszRight ) |
|
{ |
|
return ( Q_strcmp( pszLeft, pszRight) < 0 ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
|
|
CStringPool::CStringPool( StringPoolCase_t caseSensitivity ) |
|
: m_Strings( 32, 256, caseSensitivity == StringPoolCaseInsensitive ? StrLessInsensitive : StrLessSensitive ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
|
|
CStringPool::~CStringPool() |
|
{ |
|
FreeAll(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
|
|
unsigned int CStringPool::Count() const |
|
{ |
|
return m_Strings.Count(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
const char * CStringPool::Find( const char *pszValue ) |
|
{ |
|
unsigned short i = m_Strings.Find(pszValue); |
|
if ( m_Strings.IsValidIndex(i) ) |
|
return m_Strings[i]; |
|
|
|
return NULL; |
|
} |
|
|
|
const char * CStringPool::Allocate( const char *pszValue ) |
|
{ |
|
char *pszNew; |
|
|
|
unsigned short i = m_Strings.Find(pszValue); |
|
bool bNew = (i == m_Strings.InvalidIndex()); |
|
|
|
if ( !bNew ) |
|
return m_Strings[i]; |
|
|
|
pszNew = strdup( pszValue ); |
|
m_Strings.Insert( pszNew ); |
|
|
|
return pszNew; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
|
|
void CStringPool::FreeAll() |
|
{ |
|
unsigned short i = m_Strings.FirstInorder(); |
|
while ( i != m_Strings.InvalidIndex() ) |
|
{ |
|
free( (void *)m_Strings[i] ); |
|
i = m_Strings.NextInorder(i); |
|
} |
|
m_Strings.RemoveAll(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
|
|
|
|
#ifdef _DEBUG |
|
CON_COMMAND( test_stringpool, "Tests the class CStringPool" ) |
|
{ |
|
CStringPool pool; |
|
|
|
Assert(pool.Count() == 0); |
|
|
|
pool.Allocate("test"); |
|
Assert(pool.Count() == 1); |
|
|
|
pool.Allocate("test"); |
|
Assert(pool.Count() == 1); |
|
|
|
pool.Allocate("test2"); |
|
Assert(pool.Count() == 2); |
|
|
|
Assert( pool.Find("test2") != NULL ); |
|
Assert( pool.Find("TEST") != NULL ); |
|
Assert( pool.Find("Test2") != NULL ); |
|
Assert( pool.Find("test") != NULL ); |
|
|
|
pool.FreeAll(); |
|
Assert(pool.Count() == 0); |
|
|
|
Msg("Pass."); |
|
} |
|
#endif
|
|
|