]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dynarray.cpp
Updates for Y positioning
[wxWidgets.git] / src / common / dynarray.cpp
index ed85392df3004ae66ad244ff6a98dc5da39978c5..2d8e1623780eb18101892a366b9eb048b60fc184 100644 (file)
@@ -73,14 +73,7 @@ wxBaseArray::wxBaseArray(const wxBaseArray& src)
 // assignment operator
 wxBaseArray& wxBaseArray::operator=(const wxBaseArray& src)
 {
 // assignment operator
 wxBaseArray& wxBaseArray::operator=(const wxBaseArray& src)
 {
-#if 0
   wxDELETEA(m_pItems);
   wxDELETEA(m_pItems);
-#else
-       if ( (m_pItems)) { 
-               delete (m_pItems); 
-               (m_pItems) = 0; 
-       }
-#endif
 
   m_nSize  = // not src.m_nSize to save memory
   m_nCount = src.m_nCount;
 
   m_nSize  = // not src.m_nSize to save memory
   m_nCount = src.m_nCount;
@@ -141,8 +134,6 @@ void wxBaseArray::Clear()
 // pre-allocates memory (frees the previous data!)
 void wxBaseArray::Alloc(size_t nSize)
 {
 // pre-allocates memory (frees the previous data!)
 void wxBaseArray::Alloc(size_t nSize)
 {
-  wxASSERT( nSize > 0 );
-
   // only if old buffer was not big enough
   if ( nSize > m_nSize ) {
     wxDELETEA(m_pItems);
   // only if old buffer was not big enough
   if ( nSize > m_nSize ) {
     wxDELETEA(m_pItems);
@@ -191,8 +182,8 @@ int wxBaseArray::Index(long lItem, bool bFromEnd) const
   return wxNOT_FOUND;
 }
 
   return wxNOT_FOUND;
 }
 
-// search for an item in a sorted array (binary search)
-int wxBaseArray::Index(long lItem, CMPFUNC fnCompare) const
+// search for a place to insert an item into a sorted array (binary search)
+size_t wxBaseArray::IndexForInsert(long lItem, CMPFUNC fnCompare) const
 {
   size_t i,
        lo = 0,
 {
   size_t i,
        lo = 0,
@@ -207,12 +198,23 @@ int wxBaseArray::Index(long lItem, CMPFUNC fnCompare) const
       hi = i;
     else if ( res > 0 )
       lo = i + 1;
       hi = i;
     else if ( res > 0 )
       lo = i + 1;
-    else
-      return i;
+    else {
+      lo = i;
+      break;
+    }
   }
 
   }
 
-  return wxNOT_FOUND;
+  return lo;
 }
 }
+
+// search for an item in a sorted array (binary search)
+int wxBaseArray::Index(long lItem, CMPFUNC fnCompare) const
+{
+    size_t n = IndexForInsert(lItem, fnCompare);
+
+    return n < m_nCount && m_pItems[n] == lItem ? (int)n : wxNOT_FOUND;
+}
+
 // add item at the end
 void wxBaseArray::Add(long lItem)
 {
 // add item at the end
 void wxBaseArray::Add(long lItem)
 {
@@ -223,28 +225,7 @@ void wxBaseArray::Add(long lItem)
 // add item assuming the array is sorted with fnCompare function
 void wxBaseArray::Add(long lItem, CMPFUNC fnCompare)
 {
 // add item assuming the array is sorted with fnCompare function
 void wxBaseArray::Add(long lItem, CMPFUNC fnCompare)
 {
-  size_t i,
-       lo = 0,
-       hi = m_nCount;
-  int res;
-
-  while ( lo < hi ) {
-    i = (lo + hi)/2;
-
-    res = (*fnCompare)((const void *)lItem, (const void *)m_pItems[i]);
-    if ( res < 0 )
-      hi = i;
-    else if ( res > 0 )
-      lo = i + 1;
-    else {
-      lo = hi = i;
-      break;
-    }
-  }
-
-  wxASSERT( lo == hi ); // I hope I got binary search right :-)
-
-  Insert(lItem, lo);
+  Insert(lItem, IndexForInsert(lItem, fnCompare));
 }
 
 // add item at the given position
 }
 
 // add item at the given position
@@ -278,7 +259,7 @@ void wxBaseArray::Remove(long lItem)
   wxCHECK_RET( iIndex != wxNOT_FOUND,
                wxT("removing inexistent item in wxArray::Remove") );
 
   wxCHECK_RET( iIndex != wxNOT_FOUND,
                wxT("removing inexistent item in wxArray::Remove") );
 
-  Remove((size_t)iIndex);
+  RemoveAt((size_t)iIndex);
 }
 
 // sort array elements using passed comparaison function
 }
 
 // sort array elements using passed comparaison function