X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/df5168c427b51f1ab2b3200a5c8f7626b3d24aae..f74172ab4256c9e7c665e44e2f94ce12bf84a37f:/src/common/dynarray.cpp diff --git a/src/common/dynarray.cpp b/src/common/dynarray.cpp index 7224e1db53..63d9e7b5ca 100644 --- a/src/common/dynarray.cpp +++ b/src/common/dynarray.cpp @@ -78,28 +78,29 @@ int name::Index(T lItem, bool bFromEnd) const \ } \ \ /* add item assuming the array is sorted with fnCompare function */ \ -void name::Add(T lItem, CMPFUNC fnCompare) \ +size_t name::Add(T lItem, CMPFUNC fnCompare) \ { \ - Insert(lItem, IndexForInsert(lItem, fnCompare)); \ -} \ - \ + size_t idx = IndexForInsert(lItem, fnCompare); \ + Insert(lItem, idx); \ + return idx; \ +} #if wxUSE_STL #define _WX_DEFINE_BASEARRAY_NOCOMMON(T, name) \ size_t name::IndexForInsert(T lItem, CMPFUNC fnCompare) const \ { \ - Predicate p(fnCompare); \ + Predicate p((SCMPFUNC)fnCompare); \ const_iterator it = std::lower_bound(begin(), end(), lItem, p); \ return it - begin(); \ } \ \ int name::Index(T lItem, CMPFUNC fnCompare) const \ { \ - size_t n = IndexForInsert(lItem, fnCompare); \ - \ - return (n >= size() || \ - (*fnCompare)(&lItem, &(*this)[n])) ? wxNOT_FOUND : (int)n; \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator it = std::lower_bound(begin(), end(), lItem, p); \ + return (it != end() && \ + p(lItem, *it)) ? (int)(it - begin()) : wxNOT_FOUND; \ } \ \ void name::Shrink() \ @@ -378,6 +379,36 @@ void name::Remove(T lItem) \ void name::Sort(CMPFUNC fCmp) \ { \ qsort(m_pItems, m_nCount, sizeof(T), fCmp); \ +} \ + \ +void name::assign(const_iterator first, const_iterator last) \ +{ \ + clear(); \ + reserve(last - first); \ + for(; first != last; ++first) \ + push_back(*first); \ +} \ + \ +void name::assign(size_type n, const_reference v) \ +{ \ + clear(); \ + reserve(n); \ + for( size_type i = 0; i < n; ++i ) \ + push_back(v); \ +} \ + \ +void name::insert(iterator it, const_iterator first, const_iterator last) \ +{ \ + size_t nInsert = last - first, nIndex = it - begin(); \ + if (nInsert == 0) \ + return; \ + Grow(nInsert); \ + \ + memmove(&m_pItems[nIndex + nInsert], &m_pItems[nIndex], \ + (m_nCount - nIndex)*sizeof(T)); \ + for (size_t i = 0; i < nInsert; ++i, ++it, ++first) \ + *it = *first; \ + m_nCount += nInsert; \ } #endif @@ -390,7 +421,7 @@ _WX_DEFINE_BASEARRAY(const void *, wxBaseArrayPtrVoid) _WX_DEFINE_BASEARRAY(short, wxBaseArrayShort) _WX_DEFINE_BASEARRAY(int, wxBaseArrayInt) _WX_DEFINE_BASEARRAY(long, wxBaseArrayLong) -//_WX_DEFINE_BASEARRAY(double, wxBaseArrayDouble) +_WX_DEFINE_BASEARRAY(double, wxBaseArrayDouble) #if wxUSE_STL #include "wx/arrstr.h"