From: Mattia Barbon Date: Thu, 17 Jul 2003 22:23:43 +0000 (+0000) Subject: Use correct types for comparison functions in wxArray, X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f700f98cf5bcc9fb80a7328c9c8896c70c748f54?ds=sidebyside Use correct types for comparison functions in wxArray, wxSortedArray and wxSortedArrayString, when wxUSE_STL=1. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22063 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/arrstr.h b/include/wx/arrstr.h index 4e559f0fd6..d46e291df5 100644 --- a/include/wx/arrstr.h +++ b/include/wx/arrstr.h @@ -23,8 +23,10 @@ WXDLLIMPEXP_BASE int wxStringSortDescending(wxString*, wxString*); #include "wx/dynarray.h" typedef int (*CMPFUNCwxString)(wxString*, wxString*); -WX_DECLARE_USER_EXPORTED_BASEARRAY(wxString, wxBaseArrayStringBase, - WXDLLIMPEXP_BASE); +typedef wxString _wxArraywxBaseArrayStringBase; +_WX_DECLARE_BASEARRAY_2(_wxArraywxBaseArrayStringBase, wxBaseArrayStringBase, + wxArray_SortFunction, + class WXDLLIMPEXP_BASE); WX_DEFINE_USER_EXPORTED_TYPEARRAY(wxString, wxArrayStringBase, wxBaseArrayStringBase, WXDLLIMPEXP_BASE); _WX_DEFINE_SORTED_TYPEARRAY_2(wxString, wxSortedArrayStringBase, diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index b836cffb72..b06a1c2221 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -86,9 +86,43 @@ typedef int (wxCMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2); #if wxUSE_STL +template +class WXDLLIMPEXP_BASE wxArray_SortFunction +{ +public: + typedef int (wxCMPFUNC_CONV *CMPFUNC)(T* pItem1, T* pItem2); + + wxArray_SortFunction(CMPFUNC f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f((T*)&i1, (T*)&i2) < 0; } +private: + CMPFUNC m_f; +}; + +template +class WXDLLIMPEXP_BASE wxSortedArray_SortFunction +{ +public: + typedef F CMPFUNC; + + wxSortedArray_SortFunction(CMPFUNC f) : m_f(f) { } + bool operator()(const T& i1, const T& i2) + { return m_f(i1, i2) < 0; } +private: + CMPFUNC m_f; +}; + #define _WX_DECLARE_BASEARRAY(T, name, classexp) \ + typedef int (wxCMPFUNC_CONV *CMPFUN##name)(T pItem1, T pItem2); \ + typedef wxSortedArray_SortFunction name##_Predicate; \ + _WX_DECLARE_BASEARRAY_2(T, name, name##_Predicate, classexp) + +#define _WX_DECLARE_BASEARRAY_2(T, name, predicate, classexp) \ classexp name : public std::vector \ { \ + typedef predicate Predicate; \ + typedef predicate::CMPFUNC SCMPFUNC; \ + typedef wxArray_SortFunction::CMPFUNC CMPFUNC; \ public: \ void Empty() { clear(); } \ void Clear() { clear(); } \ @@ -120,19 +154,9 @@ protected: \ \ void Sort(CMPFUNC fCmp) \ { \ - Predicate p(fCmp); \ + wxArray_SortFunction p(fCmp); \ std::sort(begin(), end(), p); \ } \ -private: \ - class Predicate \ - { \ - typedef CMPFUNC fnc; \ - fnc m_f; \ - public: \ - Predicate(fnc f) : m_f(f) { } \ - bool operator()(const T& i1, const T& i2) \ - { return m_f((T*)&i1, (T*)&i2) < 0; /* const cast */ } \ - }; \ } #else // if !wxUSE_STL @@ -140,6 +164,7 @@ private: \ #define _WX_DECLARE_BASEARRAY(T, name, classexp) \ classexp name \ { \ + typedef CMPFUNC SCMPFUNC; /* for compatibility wuth wxUSE_STL */ \ public: \ name(); \ name(const name& array); \ @@ -459,6 +484,7 @@ wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ name); \ classexp name : public base \ { \ + typedef comptype SCMPFUNC; \ public: \ name(comptype fn defcomp) { m_fnCompare = fn; } \ \ diff --git a/src/common/dynarray.cpp b/src/common/dynarray.cpp index 038947c6ba..63d9e7b5ca 100644 --- a/src/common/dynarray.cpp +++ b/src/common/dynarray.cpp @@ -90,17 +90,17 @@ size_t name::Add(T lItem, CMPFUNC fnCompare) \ #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() \