119 lines
No EOL
3.5 KiB
C++
119 lines
No EOL
3.5 KiB
C++
#include "LSString.h"
|
|
#include <memory>
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
LSString::LSString(const char* pData)
|
|
: m_zSize(StringLength(pData))
|
|
, m_uiCapacity(StringLength(pData))
|
|
{
|
|
Assign(pData);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
LSString::LSString(const std::string& sRhs)
|
|
: m_zSize(sRhs.length())
|
|
, m_uiCapacity(sRhs.length())
|
|
{
|
|
Assign(sRhs);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
LSString& LSString::operator=(const LSString& sRhs)
|
|
{
|
|
m_zSize = sRhs.Size();
|
|
m_uiCapacity = sRhs.Capacity();
|
|
Assign(sRhs);
|
|
return *this;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
LSString::LSString(const LSString& sRhs)
|
|
: m_zSize(sRhs.m_zSize)
|
|
, m_uiCapacity(sRhs.m_uiCapacity)
|
|
{
|
|
Assign(sRhs);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
LSString::~LSString()
|
|
{
|
|
DELETE_ARRAY(m_pData);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
void LSString::Assign(const char* pData)
|
|
{
|
|
m_pData = new char[m_zSize + 1];
|
|
memset(m_pData, 0, m_zSize + 1);
|
|
if (pData) memcpy(m_pData, pData, m_zSize);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
void LSString::Insert(const char* pData, size_t zLength, size_t zPos)
|
|
{
|
|
if (!pData) return;
|
|
|
|
size_t zNewLength = m_zSize + zLength;
|
|
|
|
while (zNewLength > m_uiCapacity)
|
|
{
|
|
IncreaseCapacity(zNewLength);
|
|
}
|
|
|
|
char* pLeft = m_pData + zPos;
|
|
char* pRight = m_pData + zPos + zLength;
|
|
|
|
memcpy(pRight, m_pData + zPos, m_zSize - zPos);
|
|
memcpy(pLeft, pData, zLength);
|
|
|
|
m_zSize = zNewLength;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
bool LSString::RemoveAt(size_t uiPos, size_t uiSize)
|
|
{
|
|
if (uiPos > m_zSize) return false;
|
|
|
|
m_zSize = m_zSize - uiSize;
|
|
char* pLast = m_pData + uiPos + uiSize;
|
|
memcpy(m_pData + uiPos, pLast, uiSize);
|
|
memset(pLast, 0, uiSize);
|
|
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
size_t LSString::StringLength(const char* pChar) const
|
|
{
|
|
if (!pChar) return 0;
|
|
const char* pStart = pChar;
|
|
while (*pChar != 0x0)
|
|
{
|
|
pChar++;
|
|
}
|
|
return pChar - pStart;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
int LSString::Find(const char * pData, size_t uiOffset, size_t uiLength) const
|
|
{
|
|
int iRet = -1;
|
|
while (uiOffset + uiLength <= m_zSize)
|
|
{
|
|
iRet = memcmp(m_pData + uiOffset, pData, uiLength);
|
|
if (iRet == 0) break;
|
|
uiOffset++;
|
|
}
|
|
return iRet;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
void LSString::IncreaseCapacity(size_t uiNewLength)
|
|
{
|
|
m_uiCapacity = uiNewLength * c_uiCapacityIncreaseFactor;
|
|
char* pNew = new char[m_uiCapacity + 1];
|
|
memset(pNew, 0, m_uiCapacity + 1);
|
|
memmove(pNew, m_pData, m_zSize);
|
|
DELETE_ARRAY(m_pData);
|
|
m_pData = pNew;
|
|
} |