Seaside/SpyCustom/sdk/gamestringpool.h
2021-06-16 18:45:17 +03:00

105 lines
2.0 KiB
C++

#ifndef GAMESTRINGPOOL_H
#define GAMESTRINGPOOL_H
#if defined( _WIN32 )
#pragma once
#endif
#if !defined( GC )
class IGameSystem;
#endif
string_t AllocPooledString(const char* pszValue);
#define AllocPooledStringConstant( pszValue ) AllocPooledString( pszValue )
string_t FindPooledString(const char* pszValue);
void RemovePooledString(const char* pszValue);
#define AssertIsValidString( s ) AssertMsg( s == NULL_STRING || s == FindPooledString( STRING(s) ), "Invalid string " #s );
#if !defined( GC )
IGameSystem* GameStringSystem();
#endif
class CGameString
{
public:
CGameString() :
m_iszString(NULL_STRING), m_pszString(NULL), m_iSerial(0)
{
}
CGameString(const char* pszString, bool bCopy = false) :
m_iszString(NULL_STRING), m_pszString(NULL), m_iSerial(0)
{
Set(pszString, bCopy);
}
~CGameString()
{
if (m_bCopy)
free((void*)m_pszString);
}
void Set(const char* pszString, bool bCopy = false)
{
if (m_bCopy && m_pszString)
free((void*)m_pszString);
m_iszString = NULL_STRING;
m_pszString = (!bCopy) ? pszString : strdup(pszString);
}
void SetFastNoCopy(string_t iszString)
{
m_iszString = iszString;
m_iSerial = gm_iSerialNumber;
}
bool IsSerialNumberOutOfDate(void) const
{
return m_iSerial != gm_iSerialNumber;
}
string_t Get() const
{
if (m_iszString == NULL_STRING || IsSerialNumberOutOfDate())
{
if (!m_pszString)
return NULL_STRING;
m_iszString = AllocPooledString(m_pszString);
m_iSerial = gm_iSerialNumber;
}
return m_iszString;
}
operator const char* () const
{
return (m_pszString) ? m_pszString : "";
}
#ifndef NO_STRING_T
operator string_t() const
{
return Get();
}
#endif
static void IncrementSerialNumber()
{
gm_iSerialNumber++;
}
private:
mutable string_t m_iszString;
const char* m_pszString;
mutable int m_iSerial;
bool m_bCopy;
static int gm_iSerialNumber;
};
#endif