]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dynarray.cpp
Watcom build system for wxMGL
[wxWidgets.git] / src / common / dynarray.cpp
index bbf54265c431b7eb1d996e0b5a9e224e001a773d..2d8e1623780eb18101892a366b9eb048b60fc184 100644 (file)
@@ -73,14 +73,7 @@ wxBaseArray::wxBaseArray(const wxBaseArray& src)
 // assignment operator
 wxBaseArray& wxBaseArray::operator=(const wxBaseArray& src)
 {
-#if 0
   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;
@@ -141,8 +134,6 @@ void wxBaseArray::Clear()
 // 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);
@@ -191,8 +182,8 @@ int wxBaseArray::Index(long lItem, bool bFromEnd) const
   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,
@@ -207,12 +198,23 @@ int wxBaseArray::Index(long lItem, CMPFUNC fnCompare) const
       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)
 {
@@ -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)
 {
-  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