X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a729bb860cec596f4ce5a59fabeb4404a266e97..fe1bdf10a61ddc1f3455e5a9a22ca04a8f38eec2:/src/common/dynarray.cpp?ds=sidebyside diff --git a/src/common/dynarray.cpp b/src/common/dynarray.cpp index ed85392df3..2d8e162378 100644 --- a/src/common/dynarray.cpp +++ b/src/common/dynarray.cpp @@ -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 @@ -278,7 +259,7 @@ void wxBaseArray::Remove(long lItem) 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