]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dynarray.cpp
better learn the operators...
[wxWidgets.git] / src / common / dynarray.cpp
index 5b4d11e9b9c5ef8a071123d16e53c5278eb4c77c..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;
@@ -189,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,
@@ -205,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)
 {
@@ -221,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