Пример #1
0
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;
}
Пример #2
0
UnicodeString& UnicodeString::Clear()
{
	if (m_pData->GetRef() > 1)
	{
		m_pData->DecRef();
		SetEUS();
	}
	else
	{
		m_pData->SetLength(0);
	}

	return *this;
}
Пример #3
0
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;
}
Пример #4
0
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();
}
Пример #5
0
		UnicodeString(const char *lpszData, UINT CodePage=CP_OEMCP) { SetEUS(); Copy(lpszData, CodePage); }
Пример #6
0
		UnicodeString(const wchar_t *lpwszData, size_t nLength) { SetEUS(); Copy(lpwszData, nLength); }
Пример #7
0
		UnicodeString(const wchar_t *lpwszData) { SetEUS(); Copy(lpwszData); }
Пример #8
0
		UnicodeString(const UnicodeString &strCopy) { SetEUS(); Copy(strCopy); }
Пример #9
0
		UnicodeString() { SetEUS(); }