]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/list.cpp
drawing optimization fix
[wxWidgets.git] / src / common / list.cpp
index f7b1ab0543789d6681923983fc74c1e0066985e3..a689f0b40eaea85cf0516bd96bed5cf7419692af 100644 (file)
 // implementation
 // =============================================================================
 
 // implementation
 // =============================================================================
 
+// -----------------------------------------------------------------------------
+// wxListKey
+// -----------------------------------------------------------------------------
+
+bool wxListKey::operator==(wxListKeyValue value) const
+{
+    switch ( m_keyType )
+    {
+        default:
+            wxFAIL_MSG("bad key type.");
+            // let compiler optimize the line above away in release build
+            // by not putting return here...
+
+        case wxKEY_STRING:
+            return strcmp(m_key.string, value.string) == 0;
+
+        case wxKEY_INTEGER:
+            return m_key.integer == value.integer;
+    }
+}                                
+
 // -----------------------------------------------------------------------------
 // wxNodeBase
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
 // wxNodeBase
 // -----------------------------------------------------------------------------
@@ -206,16 +227,26 @@ wxNodeBase *wxListBase::Insert(wxNodeBase *position, void *object)
     wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL,
                  "need a key for the object to insert" );
 
     wxCHECK_MSG( m_keyType == wxKEY_NONE, (wxNodeBase *)NULL,
                  "need a key for the object to insert" );
 
-    wxNodeBase *prev = (wxNodeBase *)NULL;
+    wxCHECK_MSG( !position || position->m_list == this, (wxNodeBase *)NULL,
+                 "can't insert before a node from another list" );
+
+    // previous and next node for the node being inserted
+    wxNodeBase *prev, *next;
     if ( position )
     if ( position )
+    {
         prev = position->GetPrevious();
         prev = position->GetPrevious();
-    //else
-    //  inserting in the beginning of the list
+        next = position;
+    }
+    else
+    {
+        // inserting in the beginning of the list
+        prev = (wxNodeBase *)NULL;
+        next = m_nodeFirst;
+    }
 
 
-    wxNodeBase *node = CreateNode(prev, position, object);
+    wxNodeBase *node = CreateNode(prev, next, object);
     if ( !m_nodeFirst )
     {
     if ( !m_nodeFirst )
     {
-        m_nodeFirst = node;
         m_nodeLast = node;
     }
 
         m_nodeLast = node;
     }
 
@@ -440,23 +471,6 @@ void wxListBase::Sort(const wxSortCompareFunction compfunc)
     delete[] objArray;
 }
 
     delete[] objArray;
 }
 
-bool wxListKey::operator==(wxListKeyValue value) const
-    {
-        switch ( m_keyType )
-        {
-            default:
-                wxFAIL_MSG("bad key type.");
-                // let compiler optimize the line above away in release build
-                // by not putting return here...
-
-            case wxKEY_STRING:
-                return strcmp(m_key.string, value.string) == 0;
-
-            case wxKEY_INTEGER:
-                return m_key.integer == value.integer;
-        }
-    }
-
 // -----------------------------------------------------------------------------
 // wxList (a.k.a. wxObjectList)
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
 // wxList (a.k.a. wxObjectList)
 // -----------------------------------------------------------------------------
@@ -477,6 +491,17 @@ void wxStringListNode::DeleteData()
     delete [] (char *)GetData();
 }
 
     delete [] (char *)GetData();
 }
 
+void wxStringList::DoCopy(const wxStringList& other)
+{
+    wxASSERT( GetCount() == 0 );    // this list must be empty before copying!
+
+    size_t count = other.GetCount();
+    for ( size_t n = 0; n < count; n++ )
+    {
+        Add(other.Item(n)->GetData()); 
+    }
+}
+
 // Variable argument list, terminated by a zero
 // Makes new storage for the strings
 wxStringList::wxStringList (const char *first, ...)
 // Variable argument list, terminated by a zero
 // Makes new storage for the strings
 wxStringList::wxStringList (const char *first, ...)