|
|
|
|
//===== Copyright <EFBFBD> 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
|