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)