接上一篇《String类的包装 ---- 类声明》
这是SdkString类的方法实现,每个方法都经过我测试,应该没有问题。如果大家发现有写得效率不高或者BUG的地方,可以进行回贴指出。
// SdkString.cpp
#ifndef SAFE_DELETE_ARRAY
#define SAFE_DELETE_ARRAY(p) { if ((p) != NULL) { delete [] (p); (p) = NULL; } }
#endif
#define DEFAULT_CAPACITY 20
SdkString::SdkString()
{
m_maxCapacity = DEFAULT_CAPACITY;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
}
//
SdkString::SdkString(const wchar_t* lpsrcStr)
{
if ( NULL == lpsrcStr )
{
m_maxCapacity = DEFAULT_CAPACITY;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
}
else
{
int length = wcslen(lpsrcStr);
m_maxCapacity = sizeof(wchar_t) * (length + 1) + DEFAULT_CAPACITY;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
memcpy_s(m_pDataArray, m_maxCapacity, lpsrcStr, length * sizeof(wchar_t));
}
}
//
SdkString::SdkString(const SdkString& srcStr)
{
m_maxCapacity = srcStr.m_maxCapacity;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
memcpy_s(m_pDataArray, m_maxCapacity, srcStr.m_pDataArray, srcStr.m_maxCapacity);
}
//
SdkString::~SdkString()
{
m_maxCapacity = DEFAULT_CAPACITY;
SAFE_DELETE_ARRAY(m_pDataArray);
}
//
SdkString& SdkString::operator =(const SdkString& srcStr)
{
if ( this == &srcStr )
{
return *this;
}
m_maxCapacity = DEFAULT_CAPACITY;
SAFE_DELETE_ARRAY(m_pDataArray);
m_maxCapacity = srcStr.m_maxCapacity;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
memcpy_s(m_pDataArray, m_maxCapacity, srcStr.m_pDataArray, srcStr.m_maxCapacity);
return *this;
}
//
SdkString& SdkString::operator =(const wchar_t* lpsrcStr)
{
SAFE_DELETE_ARRAY(m_pDataArray);
if ( NULL == lpsrcStr )
{
m_maxCapacity = DEFAULT_CAPACITY;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
}
else
{
int length = wcslen(lpsrcStr);
m_maxCapacity = sizeof(wchar_t) * (length + 1) + DEFAULT_CAPACITY;
m_pDataArray = new wchar_t[m_maxCapacity];
memset(m_pDataArray, 0, m_maxCapacity);
memcpy_s(m_pDataArray, m_maxCapacity, lpsrcStr, length * sizeof(wchar_t));
}
return *this;
}
//
SdkString& SdkString::Append(const wchar_t* lpsrcStr)
{
if ( NULL == lpsrcStr )
{
return *this;
}
int length = wcslen(lpsrcStr);
int curlength = wcslen(m_pDataArray);
int leftSpace = (m_maxCapacity - (curlength + 1) * sizeof(wchar_t));
// If the left space can contain the new data
if ( leftSpace >= (int)((length + 1) * sizeof(wchar_t)) )
{
memcpy_s(m_pDataArray + curlength, m_maxCapacity,
lpsrcStr, length * sizeof(wchar_t));
}
else
{
m_maxCapacity += (sizeof(wchar_t) * (length + 1) + DEFAULT_CAPACITY);
wchar_t *pTempDataArr = new wchar_t[m_maxCapacity];
memset(pTempDataArr, 0, m_maxCapacity);
memcpy_s(pTempDataArr, m_maxCapacity,
m_pDataArray, curlength * sizeof(wchar_t));
memcpy_s(pTempDataArr + curlength,
m_maxCapacity, lpsrcStr, length * sizeof(wchar_t));
SAFE_DELETE_ARRAY(m_pDataArray);
m_pDataArray = pTempDataArr;
}
return *this;
}
//
SdkString& SdkString::Format(const wchar_t* lpformat, ...)
{
if ( (NULL == lpformat) || (0 == wcslen(lpformat)) )
{
return *this;
}
va_list args;
va_start(args, lpformat);
int length = _vscwprintf(lpformat, args) + 1;
wchar_t *pBuffer = new wchar_t[length];
memset(pBuffer, 0, length);
_vswprintf_s_l(pBuffer, length, lpformat, NULL, args);
va_end(args);
*this = pBuffer;
SAFE_DELETE_ARRAY(pBuffer);
return *this;
}
//
SdkString& SdkString::MakeLower()
{
_wcslwr_s(m_pDataArray, wcslen(m_pDataArray) * sizeof(wchar_t));
return *this;
}
//
SdkString& SdkString::MakeUpper()
{
_wcsupr_s(m_pDataArray, wcslen(m_pDataArray) * sizeof(wchar_t));
return *this;
}
//
SdkString& SdkString::MakeReverse()
{
int length = wcslen(m_pDataArray) - 1;
wchar_t chTemp = 0;
for (int i = 0; i < length; ++i, --length)
{
chTemp = m_pDataArray[i];
m_pDataArray[i] = m_pDataArray[length];
m_pDataArray[length] = chTemp;
}
return *this;
}
//
SdkString SdkString::SubString(int startIndex, int length)
{
int curlen = wcslen(m_pDataArray);
if ( (length < 0) || (startIndex + length > curlen) )
{
return SdkString();
}
length = (length > curlen) ? curlen : length;
startIndex = (startIndex < 0) ? 0 : startIndex;
int capacity = sizeof(wchar_t) * (length + 1);
wchar_t *pTempData = new wchar_t[capacity];
memset(pTempData, 0, capacity);
memcpy_s(pTempData, capacity, m_pDataArray + startIndex, length * sizeof(wchar_t));
SdkString strRet(pTempData);
SAFE_DELETE_ARRAY(pTempData);
return strRet;
}
//
bool SdkString::IsEmpty() const
{
return (0 == wcslen(m_pDataArray));
}
//
bool SdkString::IsContains(const wchar_t* lpstrValue, bool ignoreCase) const
{
if ( (NULL == lpstrValue) || (0 == wcslen(lpstrValue)) )
{
return false;
}
int length = wcslen(m_pDataArray);
int valuelen = wcslen(lpstrValue);
if ( length < valuelen )
{
return false;
}
int j = 0;
int offsetIndex = 0;
// If ignore lower or upper case
if ( ignoreCase )
{
while ( j < valuelen )
{
if ( (offsetIndex + valuelen) > length )
{
return false;
}
if ( *(m_pDataArray + offsetIndex + j) == *(lpstrValue + j) ||
(*(m_pDataArray + offsetIndex + j) - *(lpstrValue + j) == 0x20) ||
(*(lpstrValue + j) - *(m_pDataArray + offsetIndex + j) == 0x20) )
{
j++;
}
else
{
j = 0;
offsetIndex++;
}
}
}
else
{
while ( j < valuelen )
{
if ( (offsetIndex + valuelen) > length )
{
return false;
}
if ( *(m_pDataArray + offsetIndex + j) == *(lpstrValue + j) )
{
j++;
}
else
{
j = 0;
offsetIndex++;
}
}
}
return (j == valuelen);
}
//
bool SdkString::IsStartWith(wchar_t ch) const
{
if ( wcslen(m_pDataArray) > 0 )
{
if ( ch == *(m_pDataArray + 0) )
{
return true;
}
}
return false;
}
//
bool SdkString::IsStartWith(const wchar_t* lpsrcStr) const
{
if ( NULL == lpsrcStr )
{
return false;
}
int length = wcslen(m_pDataArray);
int srclen = wcslen(lpsrcStr);
if ( (0 == srclen) || (srclen > length))
{
return false;
}
for (int i = 0; i < srclen; ++i)
{
if ( *(m_pDataArray + i) != *(lpsrcStr + i) )
{
return false;
}
}
return true;
}
//
bool SdkString::IsEndWith(wchar_t ch) const
{
int length = wcslen(m_pDataArray);
if ( length > 0 )
{
if ( ch == *(m_pDataArray + length - 1) )
{
return true;
}
}
return true;
}
//
bool SdkString::IsEndWith(const wchar_t* lpsrcStr) const
{
if ( NULL == lpsrcStr )
{
return false;
}
int length = wcslen(m_pDataArray);
int srclen = wcslen(lpsrcStr);
if ( (0 == srclen) || (srclen > length))
{
return false;
}
for (int i = 0; i < srclen; ++i)
{
if ( *(m_pDataArray + length - srclen + i) != *(lpsrcStr + i) )
{
return false;
}
}
return true;
}
//
bool SdkString::IsEqual(const wchar_t* lpsrcStr, bool ignoreCase) const
{
if ( (NULL == lpsrcStr) )
{
return false;
}
int length = wcslen(m_pDataArray);
int srclen = wcslen(lpsrcStr);
if ( length != srclen )
{
return false;
}
if ( (0 == length) && (0 == srclen) )
{
return true;
}
if ( ignoreCase )
{
for (int i = 0; i < length, i < srclen; ++i)
{
if ( *(m_pDataArray + i) != *(lpsrcStr + i) &&
(*(m_pDataArray + i) - *(lpsrcStr + i) != 0x20) &&
(*(lpsrcStr + i) - *(m_pDataArray + i) != 0x20) )
{
return false;
}
}
}
else
{
for (int i = 0; i < length, i < srclen; ++i)
{
if ( *(m_pDataArray + i) != *(lpsrcStr + i) )
{
return false;
}
}
}
return true;
}
//
const wchar_t* SdkString::ToString() const
{
return m_pDataArray;
}
//
size_t SdkString:: GetSize_r() const
{
return wcslen(m_pDataArray);
}