X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f373f1979884082bc201b49e921f8c2b2dc671d1..84c5b38d579e140df28cfbb649587e8862148c89:/src/common/dynarray.cpp diff --git a/src/common/dynarray.cpp b/src/common/dynarray.cpp index bbf54265c4..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