Index: src/libchcore/TString.cpp
===================================================================
diff -u -N -rb8d323f736b7a2d3e85a6420f330f139db5964cf -r3d37945a5eaceb8e104154588d429f3eb52a90ab
--- src/libchcore/TString.cpp	(.../TString.cpp)	(revision b8d323f736b7a2d3e85a6420f330f139db5964cf)
+++ src/libchcore/TString.cpp	(.../TString.cpp)	(revision 3d37945a5eaceb8e104154588d429f3eb52a90ab)
@@ -181,7 +181,6 @@
 	if(this != &rSrc)
 	{
 		Release();
-
 		m_pszStringData = rSrc.m_pszStringData;
 		AddRef();
 	}
@@ -207,7 +206,7 @@
  * \param[in] src - TString object that will be appended
  * \return A new TString object with concatenated strings.
  */
-const TString TString::operator+(const TString& src) const
+TString TString::operator+(const TString& src) const
 {
 	TString str(*this);
 	str.Append(src);
@@ -220,7 +219,7 @@
  * \param[in] pszSrc - unicode TString that will be appended
  * \return A new TString object with concatenated strings.
  */
-const TString TString::operator+(const wchar_t* pszSrc) const
+TString TString::operator+(const wchar_t* pszSrc) const
 {
 	TString str(*this);
 	str.Append(pszSrc);
@@ -750,6 +749,8 @@
 	TInternalStringData* pInternalStringData = GetInternalStringData();
 	if(!pInternalStringData)
 	{
+		BOOST_ASSERT(m_pszStringData == NULL);
+
 		pInternalStringData = TInternalStringData::Allocate(stRequestedSize);
 		m_pszStringData = pInternalStringData->GetData();
 		AddRef();
@@ -762,7 +763,6 @@
 		if(bCloned)
 		{
 			Release();
-
 			m_pszStringData = pNewData->GetData();
 			AddRef();
 		}
@@ -771,13 +771,39 @@
 	{
 		// need to resize
 		TInternalStringData* pNewData = pInternalStringData->CloneWithResize(stRequestedSize);
-		Release();
 
+		Release();
 		m_pszStringData = pNewData->GetData();
 		AddRef();
 	}
 }
 
+void TString::AddRef()
+{
+	if(m_pszStringData)
+	{
+		details::TInternalStringData* pInternalStringData = details::TInternalStringData::GetStringDataFromTextPointer(m_pszStringData);
+		pInternalStringData->AddRef();
+	}
+}
+
+void TString::Release()
+{
+	details::TInternalStringData* pInternalStringData = details::TInternalStringData::GetStringDataFromTextPointer(m_pszStringData);
+	if(pInternalStringData && pInternalStringData->Release())
+		details::TInternalStringData::Free(pInternalStringData);
+	m_pszStringData = NULL;
+}
+
+size_t TString::GetCurrentBufferSize() const
+{
+	const details::TInternalStringData* pData = GetInternalStringData();
+	if(pData)
+		return pData->GetBufferSize();
+	else
+		return 0;
+}
+
 END_CHCORE_NAMESPACE
 
 chcore::TString operator+(const wchar_t* pszString, chcore::TString& str)