diff --git a/include/wx/string.h b/include/wx/string.h index 35491795df..b7fe3836ae 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -673,7 +673,7 @@ public: } reference operator*() - { return wxUniCharRef::CreateForString(m_node, m_cur); } + { return wxUniCharRef::CreateForString(*str(), m_cur); } iterator operator+(ptrdiff_t n) const { return iterator(str(), wxStringOperations::AddToIter(m_cur, n)); } diff --git a/include/wx/unichar.h b/include/wx/unichar.h index defc237114..2b93bf9c88 100644 --- a/include/wx/unichar.h +++ b/include/wx/unichar.h @@ -183,7 +183,7 @@ private: // create the reference #if wxUSE_UNICODE_UTF8 - wxUniCharRef(wxStringIteratorNode& node, iterator pos) : m_node(node), m_pos(pos) {} + wxUniCharRef(wxString& str, iterator pos) : m_str(str), m_pos(pos) {} #else wxUniCharRef(iterator pos) : m_pos(pos) {} #endif @@ -195,8 +195,8 @@ public: // that must be used explicitly (this is more than using 'explicit' // keyword on ctor!): #if wxUSE_UNICODE_UTF8 - static wxUniCharRef CreateForString(wxStringIteratorNode& node, iterator pos) - { return wxUniCharRef(node, pos); } + static wxUniCharRef CreateForString(wxString& str, iterator pos) + { return wxUniCharRef(str, pos); } #else static wxUniCharRef CreateForString(iterator pos) { return wxUniCharRef(pos); } @@ -287,7 +287,7 @@ private: private: // reference to the string and pointer to the character in string #if wxUSE_UNICODE_UTF8 - wxStringIteratorNode& m_node; + wxString& m_str; #endif iterator m_pos; }; diff --git a/src/common/unichar.cpp b/src/common/unichar.cpp index d75555acd9..7a8df7600d 100644 --- a/src/common/unichar.cpp +++ b/src/common/unichar.cpp @@ -106,8 +106,7 @@ wxUniCharRef& wxUniCharRef::operator=(const wxUniChar& c) // code -- in that case, we have to use wxStringImpl::replace() and // this invalidates all iterators, so we have to update them too: - wxString& str = *wx_const_cast(wxString*, m_node.m_str); - wxStringImpl& strimpl = str.m_impl; + wxStringImpl& strimpl = m_str.m_impl; int iterDiff = lenNew - lenOld; size_t posIdx = m_pos - strimpl.begin(); @@ -121,7 +120,7 @@ wxUniCharRef& wxUniCharRef::operator=(const wxUniChar& c) size_t *indexes = indexes_a; size_t iterNum = 0; wxStringIteratorNode *it; - for ( it = str.m_iterators.ptr; it; it = it->m_next, ++iterNum ) + for ( it = m_str.m_iterators.ptr; it; it = it->m_next, ++iterNum ) { wxASSERT( it->m_iter || it->m_citer ); @@ -152,7 +151,7 @@ wxUniCharRef& wxUniCharRef::operator=(const wxUniChar& c) // finally, set the iterators to valid values again (note that this // updates m_pos as well): size_t i; - for ( i = 0, it = str.m_iterators.ptr; it; it = it->m_next, ++i ) + for ( i = 0, it = m_str.m_iterators.ptr; it; it = it->m_next, ++i ) { wxASSERT( i < iterNum ); wxASSERT( it->m_iter || it->m_citer ); diff --git a/tests/strings/strings.cpp b/tests/strings/strings.cpp index 0967c6249a..a3fec56598 100644 --- a/tests/strings/strings.cpp +++ b/tests/strings/strings.cpp @@ -59,6 +59,7 @@ private: CPPUNIT_TEST( CStrDataOperators ); CPPUNIT_TEST( CStrDataImplicitConversion ); CPPUNIT_TEST( ExplicitConversion ); + CPPUNIT_TEST( IndexedAccess ); CPPUNIT_TEST_SUITE_END(); void String(); @@ -89,6 +90,7 @@ private: void CStrDataOperators(); void CStrDataImplicitConversion(); void ExplicitConversion(); + void IndexedAccess(); DECLARE_NO_COPY_CLASS(StringTestCase) }; @@ -826,3 +828,16 @@ void StringTestCase::ExplicitConversion() CPPUNIT_ASSERT( CheckStrConstWChar(s, s.wc_str()) ); CPPUNIT_ASSERT( CheckStrWChar(s, s.wchar_str()) ); } + +void StringTestCase::IndexedAccess() +{ + wxString s("bar"); + CPPUNIT_ASSERT_EQUAL( 'r', s[2] ); + + // this tests for a possible bug in UTF-8 based wxString implementation: + // the 3rd character of the underlying byte string is going to change, but + // the 3rd character of wxString should remain the same + s[0] = L'\u00e9'; + CPPUNIT_ASSERT_EQUAL( 'r', s[2] ); +} +