Counter Strike : Global Offensive Source Code
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.
|
|
//===== 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
|