StringBase& Append(const wchar_t* lpData, size_t nLength, int nCodePage = CP_OEMCP) { if ( !lpData || !nLength ) //*lpData?? return *this; size_t nNewLength = Traits::GetUnicodeDataLength(lpData, nLength, nCodePage); size_t nSize = nNewLength+m_pData->GetLength(); if ( m_pData->Unique() && (nSize < m_pData->GetSize()) ) //check!!! { Traits::CopyUnicodeData(m_pData->GetData()+m_pData->GetLength(), nSize, lpData, nLength, nCodePage); m_pData->SetLength(nSize); } else { StringData<T>* pNewData = new StringData<T>(nSize+1); memcpy(pNewData->GetData(), m_pData->GetData(), m_pData->GetLength()*sizeof(T)); Traits::CopyUnicodeData(pNewData->GetData()+m_pData->GetLength(), nNewLength, lpData, nLength, nCodePage); pNewData->SetLength(nSize); FreeData(); m_pData = pNewData; } return *this; }
AsciiStringBase& Append(const wchar_t* lpData, size_t nLength) { if ( !lpData || !nLength ) //*lpData?? return *this; size_t nNewLength = WideCharToMultiByte(m_nEncoding, 0, lpData, nLength, 0, 0, 0, 0); size_t nSize = nNewLength+m_pData->GetLength(); if ( m_pData->Unique() && (nSize < m_pData->GetSize()) ) //check!!! { WideCharToMultiByte(m_nEncoding, 0, lpData, nLength, m_pData->GetData()+m_pData->GetLength(), nNewLength, 0, 0); m_pData->SetLength(nSize); } else { StringData<char>* pNewData = new StringData<char>(nSize+1); memcpy(pNewData->GetData(), m_pData->GetData(), m_pData->GetLength()); WideCharToMultiByte(m_nEncoding, 0, lpData, nLength, pNewData->GetData()+m_pData->GetLength(), nNewLength, 0, 0); pNewData->SetLength(nSize); FreeData(); m_pData = pNewData; } return *this; }
T* GetBuffer(size_t nLength = (size_t)-1) { size_t nNewLength = (nLength == (size_t)-1)?m_pData->GetLength():nLength; if ( !m_pData->Unique() || (nNewLength > m_pData->GetSize()) ) { StringData<T>* pNewData = new StringData<T>(nNewLength+1); memcpy(pNewData->GetData(), m_pData->GetData(), m_pData->GetLength()*sizeof(T)); pNewData->SetLength(m_pData->GetLength()); FreeData(); m_pData = pNewData; } return m_pData->GetData(); }
AsciiStringBase& Append(const char* lpData, size_t nLength, int nSrcEncoding = SAME_ENCODING) { if ( !lpData || !nLength ) //*lpData?? return *this; if ( nSrcEncoding == SAME_ENCODING ) nSrcEncoding = m_nEncoding; char* pBuffer = nullptr; size_t nBufferSize = 0; bool bConverted = ConvertEncoding(lpData, nLength, &pBuffer, &nBufferSize, nSrcEncoding, m_nEncoding); if ( !bConverted ) { pBuffer = (char*)lpData; nBufferSize = nLength; } size_t nSize = nBufferSize+m_pData->GetLength(); if ( m_pData->Unique() && (nSize < m_pData->GetSize()) ) //check!!! { memmove(m_pData->GetData()+m_pData->GetLength(), pBuffer, nBufferSize); m_pData->SetLength(nSize); } else { StringData<char>* pNewData = new StringData<char>(nSize+1); memcpy(pNewData->GetData(), m_pData->GetData(), m_pData->GetLength()); memmove(pNewData->GetData()+m_pData->GetLength(), pBuffer, nBufferSize); pNewData->SetLength(nSize); FreeData(); m_pData = pNewData; } if ( bConverted ) delete [] pBuffer; return *this; }
bool IsEmpty() const { return !(m_pData->GetLength() && *m_pData->GetData()); }
size_t GetLength() const { return m_pData->GetLength(); }