String类的包装 ---- 类实现

接上一篇《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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值