UnicodeString& UnicodeString::Replace(size_t Pos, size_t Len, const wchar_t* Data, size_t DataLen) { // Pos & Len must be valid assert(Pos <= m_pData->GetLength()); assert(Len <= m_pData->GetLength()); assert(Pos + Len <= m_pData->GetLength()); // Data and *this must not intersect (but Data can be located entirely within *this) assert(!(Data < m_pData->GetData() && Data + DataLen > m_pData->GetData())); assert(!(Data < m_pData->GetData() + m_pData->GetLength() && Data + DataLen > m_pData->GetData() + m_pData->GetLength())); if (!Len && !DataLen) return *this; size_t NewLength = m_pData->GetLength() + DataLen - Len; if (m_pData->GetRef() == 1 && NewLength + 1 <= m_pData->GetSize()) { if (NewLength) { if (Data >= m_pData->GetData() && Data + DataLen <= m_pData->GetData() + m_pData->GetLength()) { // copy data from self UnicodeString TmpStr(Data, DataLen); wmemmove(m_pData->GetData() + Pos + DataLen, m_pData->GetData() + Pos + Len, m_pData->GetLength() - Pos - Len); wmemcpy(m_pData->GetData() + Pos, TmpStr.CPtr(), TmpStr.GetLength()); } else { wmemmove(m_pData->GetData() + Pos + DataLen, m_pData->GetData() + Pos + Len, m_pData->GetLength() - Pos - Len); wmemcpy(m_pData->GetData() + Pos, Data, DataLen); } } m_pData->SetLength(NewLength); } else { if (!NewLength) { m_pData->DecRef(); SetEUS(); return *this; } UnicodeStringData *NewData = new UnicodeStringData(NewLength + 1); wmemcpy(NewData->GetData(), m_pData->GetData(), Pos); wmemcpy(NewData->GetData() + Pos, Data, DataLen); wmemcpy(NewData->GetData() + Pos + DataLen, m_pData->GetData() + Pos + Len, m_pData->GetLength() - Pos - Len); NewData->SetLength(NewLength); m_pData->DecRef(); m_pData = NewData; } return *this; }
UnicodeString& UnicodeString::Clear() { if (m_pData->GetRef() > 1) { m_pData->DecRef(); SetEUS(); } else { m_pData->SetLength(0); } return *this; }
UnicodeString& UnicodeString::Copy(const char *lpszData, UINT CodePage) { m_pData->DecRef(); if (!lpszData || !*lpszData) { SetEUS(); } else { size_t nSize = MultiByteToWideChar(CodePage,0,lpszData,-1,nullptr,0); m_pData = new UnicodeStringData(nSize); MultiByteToWideChar(CodePage,0,lpszData,(int)nSize,m_pData->GetData(),(int)m_pData->GetSize()); m_pData->SetLength(nSize - 1); } return *this; }
size_t UnicodeString::SetLength(size_t nLength) { if (nLength < m_pData->GetLength()) { if (!nLength && m_pData->GetRef() > 1) { m_pData->DecRef(); SetEUS(); } else { Inflate(nLength+1); return m_pData->SetLength(nLength); } } return m_pData->GetLength(); }
UnicodeString(const char *lpszData, UINT CodePage=CP_OEMCP) { SetEUS(); Copy(lpszData, CodePage); }
UnicodeString(const wchar_t *lpwszData, size_t nLength) { SetEUS(); Copy(lpwszData, nLength); }
UnicodeString(const wchar_t *lpwszData) { SetEUS(); Copy(lpwszData); }
UnicodeString(const UnicodeString &strCopy) { SetEUS(); Copy(strCopy); }
UnicodeString() { SetEUS(); }