X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3093cef829d26137a14303c36d592ed817da1028..e3556282410eb387e426d68076403fa69f2b669f:/src/common/dynarray.cpp diff --git a/src/common/dynarray.cpp b/src/common/dynarray.cpp index 4d13c80f0b..2d8e162378 100644 --- a/src/common/dynarray.cpp +++ b/src/common/dynarray.cpp @@ -17,14 +17,14 @@ #pragma implementation "dynarray.h" #endif -#include +#include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #include "wx/dynarray.h" -#include +#include "wx/intl.h" #include #include // for memmove @@ -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); @@ -188,11 +179,11 @@ int wxBaseArray::Index(long lItem, bool bFromEnd) const } } - return NOT_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, @@ -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 NOT_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,34 +225,13 @@ 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 void wxBaseArray::Insert(long lItem, size_t nIndex) { - wxCHECK_RET( nIndex <= m_nCount, "bad index in wxArray::Insert" ); + wxCHECK_RET( nIndex <= m_nCount, wxT("bad index in wxArray::Insert") ); Grow(); @@ -261,9 +242,9 @@ void wxBaseArray::Insert(long lItem, size_t nIndex) } // removes item from array (by index) -void wxBaseArray::Remove(size_t nIndex) +void wxBaseArray::RemoveAt(size_t nIndex) { - wxCHECK_RET( nIndex <= m_nCount, "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)); @@ -275,10 +256,10 @@ void wxBaseArray::Remove(long lItem) { int iIndex = Index(lItem); - wxCHECK_RET( iIndex != NOT_FOUND, - "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