Files
mir_server/sdk/srvlib/include/AnsiString.hpp

348 lines
6.9 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _WYLIB_ANSISTRING_H_
#define _WYLIB_ANSISTRING_H_
/******************************************************************
*
* wyLib库 2008 - 2010
*
* $ UCS2字符串类 $
*
* - -
*
* UCS字符串的基本操作UCS2字符指针的相互操作
*
*****************************************************************/
#include <stdlib.h>
namespace wylib
{
namespace string
{
class CWideString;
class CAnsiString
{
public:
typedef char CharType;
typedef char* RawStrType;
private:
char* m_sStr;
private:
static const char* EMPTY_STR;
protected:
/**
* realloc
* ptr:
* newsize: 0ptr指针
* ptr和newsize都不为0则表示对ptr内存块重新申请大小
*/
virtual void* alloc(void* ptr, size_t newsize)
{
if ( newsize == 0 )
{
if ( ptr ) free( ptr );
return NULL;
}
return realloc( ptr, newsize );
}
/**
*setData:
*data:
*/
inline void setData(const char* data)
{
if ( data )
{
size_t size = strlen(data) + 1;
size *= sizeof(*data);
m_sStr = (char*)alloc( m_sStr, size );
memcpy( m_sStr, data, size );
}
else m_sStr = (char*)alloc( m_sStr, 0 );
}
/**
* catData
* data:
*/
inline void catData(const char* data)
{
if ( data )
{
size_t cat_size = strlen(data);
size_t cur_size = length();
m_sStr = (char*)alloc( m_sStr, (cat_size + cur_size + 1) * sizeof(*data) );
memcpy( &m_sStr[cur_size], data, (cat_size + 1) * sizeof(*data) );
}
}
public:
CAnsiString()
{
m_sStr = NULL;
}
CAnsiString(const char* data)
{
m_sStr = NULL;
setData( data );
}
CAnsiString(const CAnsiString &str)
{
m_sStr = NULL;
setData( str.m_sStr );
}
virtual ~CAnsiString()
{
setData( NULL );
}
public:
/**
* (const char*)
* NULL""NULL
*/
inline operator const char*() const
{
return m_sStr ? m_sStr : EMPTY_STR;
}
/**
* (const char*)
* NULL""NULL
*/
inline operator char*()
{
return m_sStr ? m_sStr : NULL;
}
/**
*(const char*)
*/
inline void operator = (const char* data)
{
if ( data != m_sStr )
{
setData( data );
}
}
/**
*
*/
inline void operator = (const CAnsiString& str)
{
if ( &str != this )
{
setData( str.m_sStr );
}
}
/**
* (const char*)
*/
inline void operator += (const char* data)
{
if ( data != m_sStr )
{
catData( data );
}
else
{
CAnsiString wstr(m_sStr);
catData(wstr.m_sStr);
}
}
/**
*
*/
inline void operator += (const CAnsiString& str)
{
if ( &str != this )
{
catData( str.m_sStr );
}
else
{
CAnsiString wstr(m_sStr);
catData(wstr.m_sStr);
}
}
/**
* (const char*)CAnsiString类
*/
inline const CAnsiString operator + (const char* data)
{
CAnsiString str( m_sStr );
str.catData( data );
return str;
}
/**
* CAnsiString类
*/
inline const CAnsiString operator + (const CAnsiString& str)
{
CAnsiString _str( m_sStr );
_str.catData( str.m_sStr );
return _str;
}
/**
* (const char*)
*/
inline bool operator == (const char* data) const
{
return compare( data ) == 0;
}
/**
*
*/
inline bool operator == (const CAnsiString& str) const
{
return compare( str.m_sStr ) == 0;
}
/**
* (const char*)
*/
inline bool operator != (const char* data) const
{
return compare( data ) != 0;
}
/**
*
*/
inline bool operator != (const CAnsiString& str) const
{
return compare( str.m_sStr ) != 0;
}
/**
*
*/
inline bool operator ! () const
{
return !m_sStr || !m_sStr[0];
}
public:
/**
*
*/
inline const char* rawStr() const
{
return m_sStr;
}
/**
*
*/
inline char* rawStr()
{
return m_sStr;
}
/**
*
*/
inline size_t length() const
{
return m_sStr ? strlen(m_sStr) : 0;
}
/**
* ()
*/
inline void setLength(const size_t len)
{
if ( len > 0 )
{
m_sStr = (char*)alloc( m_sStr, sizeof(m_sStr[0]) * (len + 1) );
if ( m_sStr ) m_sStr[len] = 0;
}
else m_sStr = (char*)alloc( m_sStr, 0 );
}
/**
*
*/
inline int compare(const char* data) const
{
if ( !m_sStr || !m_sStr[0] )
{
if ( !data || !data[0] )
return 0;
else return 1;
}
return strcmp( m_sStr, data );
}
/**
*
*/
inline int compare(const CAnsiString& str) const
{
if ( !m_sStr || !m_sStr[0] )
{
if ( !str.m_sStr || !str.m_sStr[0] )
return 0;
else return 1;
}
return strcmp( m_sStr, str.m_sStr );
}
/**
*
*/
inline bool isEmpty() const
{
return !m_sStr || !m_sStr[0];
}
/**
* UCS-2LE格式
* sOutput参数不为且编码转换成功则函数将转换结果赋值给sOutput参数并返回sOutput
* null且sOutput的内容可能仍然会改变
* sOutput参数为空且函数转换编码成功则返回新的CWideString对象delete返回值
* NULL
*/
CWideString* toWStr(CWideString* sOutput = NULL) const;
/**
*
*/
size_t format(const char* fmt, ...);
size_t format_args(const char* fmt, va_list _Args);
};
};
};
#endif