#pragma implementation "dynarray.h"
#endif
-#include <wx/wxprec.h>
+#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/dynarray.h"
-#include <wx/intl.h>
+#include "wx/intl.h"
#include <stdlib.h>
#include <string.h> // for memmove
// 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;
// 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);
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,
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 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
}
// removes item from array (by index)
-void wxBaseArray::Remove(size_t nIndex)
+void wxBaseArray::RemoveAt(size_t nIndex)
{
- wxCHECK_RET( nIndex <= m_nCount, wxT("bad index in wxArray::Remove") );
+ wxCHECK_RET( nIndex <= m_nCount, wxT("bad index in wxArray::RemoveAt") );
memmove(&m_pItems[nIndex], &m_pItems[nIndex + 1],
(m_nCount - nIndex - 1)*sizeof(long));
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