]> git.saurik.com Git - wxWidgets.git/commitdiff
1. added default constructors for wxString iterators
authorVáclav Slavík <vslavik@fastmail.fm>
Thu, 28 Jun 2007 12:49:58 +0000 (12:49 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Thu, 28 Jun 2007 12:49:58 +0000 (12:49 +0000)
2. fixed assignment of iterator to iterator that points to a different string

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46996 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/string.h
include/wx/stringimpl.h
tests/strings/stdstrings.cpp

index fa5552b9f2cb6e0f9689a427d998fec84912c65e..04483f3e12f0bac4b0b2559b3b2de27a287ed7df 100644 (file)
@@ -380,17 +380,32 @@ protected:
 // see the comment near wxString::iterator for why we need this
 struct WXDLLIMPEXP_BASE wxStringIteratorNode
 {
-    inline wxStringIteratorNode(const wxString *str,
-                                wxStringImpl::const_iterator *citer);
-    inline wxStringIteratorNode(const wxString *str,
-                                wxStringImpl::iterator *iter);
-    inline ~wxStringIteratorNode();
+    wxStringIteratorNode()
+        : m_str(NULL), m_citer(NULL), m_iter(NULL), m_prev(NULL), m_next(NULL) {}
+    wxStringIteratorNode(const wxString *str,
+                          wxStringImpl::const_iterator *citer)
+        { DoSet(str, citer, NULL); }
+    wxStringIteratorNode(const wxString *str, wxStringImpl::iterator *iter)
+        { DoSet(str, NULL, iter); }
+    ~wxStringIteratorNode()
+        { clear(); }
+
+    inline void set(const wxString *str, wxStringImpl::const_iterator *citer)
+        { clear(); DoSet(str, citer, NULL); }
+    inline void set(const wxString *str, wxStringImpl::iterator *iter)
+        { clear(); DoSet(str, NULL, iter); }
 
     const wxString *m_str;
     wxStringImpl::const_iterator *m_citer;
     wxStringImpl::iterator *m_iter;
     wxStringIteratorNode *m_prev, *m_next;
 
+private:
+    inline void clear();
+    inline void DoSet(const wxString *str,
+                      wxStringImpl::const_iterator *citer,
+                      wxStringImpl::iterator *iter);
+
     // the node belongs to a particular iterator instance, it's not copied
     // when a copy of the iterator is made
     DECLARE_NO_COPY_CLASS(wxStringIteratorNode)
@@ -665,10 +680,11 @@ public:
       WX_STR_ITERATOR_IMPL(iterator, wxChar*, wxUniCharRef);
 
   public:
+      iterator() {}
       iterator(const iterator& i)
           : m_cur(i.m_cur), m_node(i.str(), &m_cur) {}
       iterator& operator=(const iterator& i)
-        { m_cur = i.m_cur; return *this; }
+        { m_cur = i.m_cur; m_node.set(i.str(), &m_cur); return *this; }
 
       reference operator*()
         { return wxUniCharRef::CreateForString(m_node, m_cur); }
@@ -700,15 +716,16 @@ public:
       WX_STR_ITERATOR_IMPL(const_iterator, const wxChar*, wxUniChar);
 
   public:
+      const_iterator() {}
       const_iterator(const const_iterator& i)
           : m_cur(i.m_cur), m_node(i.str(), &m_cur) {}
       const_iterator(const iterator& i)
           : m_cur(i.m_cur), m_node(i.str(), &m_cur) {}
 
       const_iterator& operator=(const const_iterator& i)
-        { m_cur = i.m_cur; return *this; }
+        { m_cur = i.m_cur; m_node.set(i.str(), &m_cur); return *this; }
       const_iterator& operator=(const iterator& i)
-        { m_cur = i.m_cur; return *this; }
+        { m_cur = i.m_cur; m_node.set(i.str(), &m_cur); return *this; }
 
       reference operator*() const
         { return wxStringOperations::DecodeChar(m_cur); }
@@ -742,6 +759,7 @@ public:
       WX_STR_ITERATOR_IMPL(iterator, wxChar*, wxUniCharRef);
 
   public:
+      iterator() {}
       iterator(const iterator& i) : m_cur(i.m_cur) {}
 
       reference operator*()
@@ -771,6 +789,7 @@ public:
       WX_STR_ITERATOR_IMPL(const_iterator, const wxChar*, wxUniChar);
 
   public:
+      const_iterator() {}
       const_iterator(const const_iterator& i) : m_cur(i.m_cur) {}
       const_iterator(const iterator& i) : m_cur(i.m_cur) {}
 
@@ -812,6 +831,7 @@ public:
       typedef typename T::reference reference;
       typedef typename T::pointer *pointer;
 
+      reverse_iterator_impl() {}
       reverse_iterator_impl(iterator_type i) : m_cur(i) {}
       reverse_iterator_impl(const reverse_iterator_impl& ri)
           : m_cur(ri.m_cur) {}
@@ -3102,40 +3122,36 @@ inline wxWCharBuffer::wxWCharBuffer(const wxCStrData& cstr)
 // implementation of wxStringIteratorNode inline methods
 // ----------------------------------------------------------------------------
 
-wxStringIteratorNode::wxStringIteratorNode(const wxString *str,
-                                           wxStringImpl::const_iterator *citer)
-    : m_str(str),
-      m_citer(citer),
-      m_iter(NULL),
-      m_prev(NULL),
-      m_next(str->m_iterators.ptr)
+void wxStringIteratorNode::DoSet(const wxString *str,
+                                 wxStringImpl::const_iterator *citer,
+                                 wxStringImpl::iterator *iter)
 {
-    wx_const_cast(wxString*, m_str)->m_iterators.ptr = this;
-    if ( m_next )
-        m_next->m_prev = this;
-}
-
-wxStringIteratorNode::wxStringIteratorNode(const wxString *str,
-                                           wxStringImpl::iterator *iter)
-    : m_str(str),
-      m_citer(NULL),
-      m_iter(iter),
-      m_prev(NULL),
-      m_next(str->m_iterators.ptr)
-{
-    wx_const_cast(wxString*, m_str)->m_iterators.ptr = this;
-    if ( m_next)
-        m_next->m_prev = this;
+    m_next = m_prev = NULL;
+    m_iter = iter;
+    m_citer = citer;
+    m_str = str;
+    if ( str )
+    {
+        m_next = str->m_iterators.ptr;
+        wx_const_cast(wxString*, m_str)->m_iterators.ptr = this;
+        if ( m_next )
+            m_next->m_prev = this;
+    }
 }
 
-wxStringIteratorNode::~wxStringIteratorNode()
+void wxStringIteratorNode::clear()
 {
     if ( m_next )
         m_next->m_prev = m_prev;
     if ( m_prev )
         m_prev->m_next = m_next;
-    else // first in the list
+    else if ( m_str ) // first in the list
         wx_const_cast(wxString*, m_str)->m_iterators.ptr = m_next;
+
+    m_next = m_prev = NULL;
+    m_citer = NULL;
+    m_iter = NULL;
+    m_str = NULL;
 }
 #endif // wxUSE_UNICODE_UTF8
 
index 4669549eb493b3653794d97f828b904a0e13bea1..6f4f8fba63f487ec226db410139ada373884df95 100644 (file)
@@ -198,6 +198,7 @@ public:
         typedef ptr_type pointer;                                             \
         typedef int difference_type;                                          \
                                                                               \
+        iterator_name() : m_ptr(NULL) { }                                     \
         iterator_name(pointer ptr) : m_ptr(ptr) { }                           \
                                                                               \
         reference operator*() const { return *m_ptr; }                        \
index 3721bf937276c22ed23cbc53cc68e44ae5bff84e..7779de1d467ca7eecc5da1d8041c7c9355f58258 100644 (file)
@@ -33,6 +33,7 @@ public:
 private:
     CPPUNIT_TEST_SUITE( StdStringTestCase );
         CPPUNIT_TEST( StdConstructors );
+        CPPUNIT_TEST( StdIterators );
         CPPUNIT_TEST( StdAppend );
         CPPUNIT_TEST( StdAssign );
         CPPUNIT_TEST( StdCompare );
@@ -52,6 +53,7 @@ private:
     CPPUNIT_TEST_SUITE_END();
 
     void StdConstructors();
+    void StdIterators();
     void StdAppend();
     void StdAssign();
     void StdCompare();
@@ -108,6 +110,15 @@ void StdStringTestCase::StdConstructors()
     WX_ASSERT_STR_EQUAL( "a", wxString(pw, pw + 1) );
 }
 
+void StdStringTestCase::StdIterators()
+{
+    // test compilation of default iterators ctors:
+    wxString::iterator i1;
+    wxString::const_iterator i2;
+    wxString::reverse_iterator i3;
+    wxString::const_reverse_iterator i4;
+}
+
 void StdStringTestCase::StdAppend()
 {
     wxString s1, s2, s3, s4, s5, s6, s7, s8;