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; }
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& 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& 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; }
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; }
bool operator==(const StringBase& strCmp) { return (strCmp.m_pData == m_pData) || ( (strCmp.GetLength() == GetLength()) && !memcmp(m_pData->GetData(), strCmp.m_pData->GetData(), GetLength()*sizeof(T)) ); }
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(); }
void ReleaseBuffer(size_t nLength = (size_t)-1) { //неправильна¤ логика if ( nLength == (size_t)-1 ) nLength = strlen(m_pData->GetData()); if ( nLength >= m_pData->GetSize() ) nLength = m_pData->GetSize()-1; m_pData->SetLength (nLength); }
void ReleaseBuffer(size_t nLength = (size_t)-1) { //неправильная логика if ( nLength == (size_t)-1 ) nLength = Traits::StrLength(m_pData->GetData()); if ( nLength >= m_pData->GetSize() ) nLength = m_pData->GetSize()-1; m_pData->SetLength (nLength); }
bool SetEncoding(int nEncoding) { if ( (m_nEncoding == CP_UNICODE) || (nEncoding == CP_UNICODE) ) return false; if ( m_pData ) { char* pData = Traits::ConvertString(m_pData->GetData(), m_nEncoding, nEncoding); //m_nEncoding = nEncoding; SetData(pData, nEncoding); Traits::Free(pData); } else m_nEncoding = nEncoding; return true; }
bool operator==(const T* lpCmp) { return (StrLength(lpCmp) == GetLength()) && !memcmp(lpCmp, m_pData->GetData(), GetLength()*sizeof(T)); }
BSTR ToBSTR(int nCodePage = CP_OEMCP) const { return Traits::ToBSTR(m_pData->GetData(), nCodePage); }
operator const T*() const { return m_pData->GetData(); }
const T* GetString() const { return m_pData->GetData(); }
bool operator==(const char* lpCmp) { return (lpCmp && (strlen(lpCmp) == GetLength()) && !memcmp(lpCmp, m_pData->GetData(), GetLength())); }
bool IsEmpty() const { return !(m_pData->GetLength() && *m_pData->GetData()); }
T At(size_t nIndex) const { return m_pData->GetData()[nIndex]; }