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; }
StringBase& SetData(const char* lpData, size_t nLength, int nCodePage = CP_OEMCP) { m_nEncoding = nCodePage; if ( !lpData || !nLength ) { FreeData(); SetEmpty(); } else { size_t nSize = Traits::GetAnsiDataLength(lpData, nLength, m_nEncoding); if ( m_pData && m_pData->Unique() && (nSize < m_pData->GetSize()) ) { Traits::CopyAnsiData(m_pData->GetData(), nSize, lpData, nLength, m_nEncoding); m_pData->SetLength(nLength); } else { StringData<T>* pNewData = new StringData<T>(nSize+1); Traits::CopyAnsiData(pNewData->GetData(), nSize, lpData, nLength, m_nEncoding); pNewData->SetLength(nLength); FreeData(); m_pData = pNewData; } } return *this; }
StringBase& SetData(const wchar_t* lpData, size_t nLength) { if ( !lpData || !nLength ) { FreeData(); SetEmpty(); } else { size_t nSize = Traits::GetUnicodeDataLength(lpData, nLength, m_nEncoding); if ( m_pData && m_pData->Unique() && (nSize < m_pData->GetSize()) ) { Traits::CopyUnicodeData(m_pData->GetData(), nSize, lpData, nLength, m_nEncoding); m_pData->SetLength(nLength); } else { StringData<T>* pNewData = new StringData<T>(nSize+1); Traits::CopyUnicodeData(pNewData->GetData(), nSize, lpData, nLength, m_nEncoding); pNewData->SetLength(nLength); FreeData(); m_pData = pNewData; } } return *this; }
AsciiStringBase& SetData(const wchar_t* lpData, size_t nLength) { if ( !lpData || !nLength ) { FreeData(); SetEmpty(); } else { size_t nSize = WideCharToMultiByte(m_nEncoding, 0, lpData, nLength, 0, 0, 0, 0); if ( m_pData && m_pData->Unique() && (nSize < m_pData->GetSize()) ) { WideCharToMultiByte(m_nEncoding, 0, lpData, nLength, m_pData->GetData(), nSize, 0, 0); m_pData->SetLength(nSize); } else { StringData<char>* pNewData = new StringData<char>(nSize+1); WideCharToMultiByte(m_nEncoding, 0, lpData, nLength, pNewData->GetData(), nSize, 0, 0); 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; }
AsciiStringBase& SetData(const char* lpData, size_t nLength, int nSrcEncoding = SAME_ENCODING) { if ( nSrcEncoding == SAME_ENCODING ) nSrcEncoding = m_nEncoding; if ( !lpData || !nLength ) { FreeData(); SetEmpty(); } else { char* pBuffer = nullptr; size_t nBufferSize = 0; bool bConverted = ConvertEncoding(lpData, nLength, &pBuffer, &nBufferSize, nSrcEncoding, m_nEncoding); if ( !bConverted ) { pBuffer = (char*)lpData; nBufferSize = nLength; } if ( m_pData && m_pData->Unique() && (nBufferSize < m_pData->GetSize()) ) { memmove(m_pData->GetData(), pBuffer, nBufferSize); m_pData->SetLength(nBufferSize); } else { StringData<char>* pNewData = new StringData<char>(nBufferSize+1); memmove(pNewData->GetData(), pBuffer, nBufferSize); pNewData->SetLength(nBufferSize); FreeData(); m_pData = pNewData; } if ( bConverted ) delete [] pBuffer; } 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(); }