X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c514cd532c8515061bcd69df61d685b45b29da4f..61d457caae3e33efe8e0953f79c4a94e366b22d7:/include/wx/dynarray.h diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index cc79f0a680..852ade1717 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -24,9 +24,6 @@ #include #include #include "wx/afterstd.h" - #if defined(__WXMSW__) && defined(__MINGW32__) - #include "wx/msw/winundef.h" - #endif #endif /* @@ -89,9 +86,44 @@ 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; \ +public: \ + typedef wxArray_SortFunction::CMPFUNC CMPFUNC; \ public: \ void Empty() { clear(); } \ void Clear() { clear(); } \ @@ -114,7 +146,7 @@ protected: \ size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \ void Add(T lItem, size_t nInsert = 1) \ { insert(end(), nInsert, lItem); } \ - void Add(T lItem, CMPFUNC fnCompare); \ + size_t Add(T lItem, CMPFUNC fnCompare); \ void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ { insert(begin() + uiIndex, nInsert, lItem); } \ void Remove(T lItem); \ @@ -123,19 +155,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 @@ -143,6 +165,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); \ @@ -170,7 +193,7 @@ protected: \ int Index(T lItem, CMPFUNC fnCompare) const; \ size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \ void Add(T lItem, size_t nInsert = 1); \ - void Add(T lItem, CMPFUNC fnCompare); \ + size_t Add(T lItem, CMPFUNC fnCompare); \ void Insert(T lItem, size_t uiIndex, size_t nInsert = 1); \ void Remove(T lItem); \ void RemoveAt(size_t uiIndex, size_t nRemove = 1); \ @@ -284,9 +307,14 @@ public: \ void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); } \ } +#define _WX_DEFINE_TYPEARRAY_NO_PTR(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY(T, name, base, classexp) + #else // if !wxUSE_STL -#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ +// common declaration used by both _WX_DEFINE_TYPEARRAY and +// _WX_DEFINE_TYPEARRAY_NO_PTR +#define _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, ptrop) \ wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ TypeTooBigToBeStoredIn##base, \ name); \ @@ -350,17 +378,23 @@ public: \ typedef value_type& reference; \ typedef value_type* pointer; \ typedef reverse_iterator itor; \ - friend itor operator+(int o, const itor& it); \ - friend itor operator+(const itor& it, int o); \ - friend itor operator-(const itor& it, int o); \ - friend difference_type operator -(const itor& i1, const itor& i2);\ + friend inline itor operator+(int o, const itor& it) \ + { return it.m_ptr - o; } \ + friend inline itor operator+(const itor& it, int o) \ + { return it.m_ptr - o; } \ + friend inline itor operator-(const itor& it, int o) \ + { return it.m_ptr + o; } \ + friend inline difference_type operator-(const itor& i1, \ + const itor& i2) \ + { return i1.m_ptr - i2.m_ptr; } \ + \ public: \ pointer m_ptr; \ reverse_iterator() : m_ptr(NULL) { } \ reverse_iterator(pointer ptr) : m_ptr(ptr) { } \ reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } \ reference operator*() const { return *m_ptr; } \ - pointer operator->() const { return m_ptr; } \ + ptrop \ itor operator++() { --m_ptr; return *this; } \ itor operator++(int) \ { reverse_iterator tmp = *this; --m_ptr; return tmp; } \ @@ -376,10 +410,16 @@ public: \ typedef const value_type& reference; \ typedef const value_type* pointer; \ typedef const_reverse_iterator itor; \ - friend itor operator+(int o, const itor& it); \ - friend itor operator+(const itor& it, int o); \ - friend itor operator-(const itor& it, int o); \ - friend difference_type operator -(const itor& i1, const itor& i2);\ + friend inline itor operator+(int o, const itor& it) \ + { return it.m_ptr - o; } \ + friend inline itor operator+(const itor& it, int o) \ + { return it.m_ptr - o; } \ + friend inline itor operator-(const itor& it, int o) \ + { return it.m_ptr + o; } \ + friend inline difference_type operator-(const itor& i1, \ + const itor& i2) \ + { return i1.m_ptr - i2.m_ptr; } \ + \ public: \ pointer m_ptr; \ const_reverse_iterator() : m_ptr(NULL) { } \ @@ -387,7 +427,7 @@ public: \ const_reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { } \ const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { }\ reference operator*() const { return *m_ptr; } \ - pointer operator->() const { return m_ptr; } \ + ptrop \ itor operator++() { --m_ptr; return *this; } \ itor operator++(int) \ { itor tmp = *this; --m_ptr; return tmp; } \ @@ -434,21 +474,15 @@ public: \ void reserve(size_type n) { base::reserve(n); }; \ void resize(size_type n, value_type v = value_type()); \ size_type size() const { return base::size(); } \ -}; \ - \ -inline name::reverse_iterator operator+(int o, const name::reverse_iterator& it) { return it.m_ptr - o; } \ -inline name::reverse_iterator operator+(const name::reverse_iterator& it, int o) { return it.m_ptr - o; } \ -inline name::reverse_iterator operator-(const name::reverse_iterator& it, int o) { return it.m_ptr + o; } \ -inline name::difference_type operator -(const name::reverse_iterator& i1, \ - const name::reverse_iterator& i2) \ - { return i1.m_ptr - i2.m_ptr; } \ - \ -inline name::const_reverse_iterator operator+(int o, const name::const_reverse_iterator& it) { return it.m_ptr - o; } \ -inline name::const_reverse_iterator operator+(const name::const_reverse_iterator& it, int o) { return it.m_ptr - o; } \ -inline name::const_reverse_iterator operator-(const name::const_reverse_iterator& it, int o) { return it.m_ptr + o; } \ -inline name::difference_type operator -(const name::const_reverse_iterator& i1,\ - const name::const_reverse_iterator& i2) \ - { return i1.m_ptr - i2.m_ptr; } \ +} + +#define _WX_PTROP pointer operator->() const { return m_ptr; } +#define _WX_PTROP_NONE + +#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP) +#define _WX_DEFINE_TYPEARRAY_NO_PTR(T, name, base, classexp) \ + _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP_NONE) #endif // !wxUSE_STL @@ -457,16 +491,13 @@ inline name::difference_type operator -(const name::const_reverse_iterator& i1,\ // cannot handle types with size greater than pointer because of sorting // ---------------------------------------------------------------------------- -#define _WX_DEFINE_SORTED_TYPEARRAY(T, name, base, defcomp, classexp) \ -typedef int (CMPFUNC_CONV *SCMPFUNC##T)(T pItem1, T pItem2); \ -_WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, SCMPFUNC##T) - #define _WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, comptype)\ -wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(void *), \ +wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type), \ TypeTooBigToBeStoredInSorted##base, \ name); \ classexp name : public base \ { \ + typedef comptype SCMPFUNC; \ public: \ name(comptype fn defcomp) { m_fnCompare = fn; } \ \ @@ -492,8 +523,8 @@ public: \ void AddAt(T item, size_t index) \ { base::insert(begin() + index, item); } \ \ - void Add(T Item) \ - { base::Add(Item, (CMPFUNC)m_fnCompare); } \ + size_t Add(T Item) \ + { return base::Add(Item, (CMPFUNC)m_fnCompare); } \ \ void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ { base::erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ @@ -612,16 +643,29 @@ private: \ #define WX_DEFINE_TYPEARRAY(T, name, base) \ WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class wxARRAY_DEFAULT_EXPORT) +#define WX_DEFINE_TYPEARRAY_NO_PTR(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, base, class wxARRAY_DEFAULT_EXPORT) + #define WX_DEFINE_EXPORTED_TYPEARRAY(T, name, base) \ WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class WXDLLEXPORT) +#define WX_DEFINE_EXPORTED_TYPEARRAY_NO_PTR(T, name, base) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, base, class WXDLLEXPORT) + #define WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, expdecl) \ WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class expdecl) +#define WX_DEFINE_USER_EXPORTED_TYPEARRAY_NO_PTR(T, name, base, expdecl) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, base, class expdecl) + #define WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, classdecl) \ typedef T _wxArray##name; \ _WX_DEFINE_TYPEARRAY(_wxArray##name, name, base, classdecl) +#define WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, base, classdecl) \ + typedef T _wxArray##name; \ + _WX_DEFINE_TYPEARRAY_NO_PTR(_wxArray##name, name, base, classdecl) + // ---------------------------------------------------------------------------- // WX_DEFINE_SORTED_TYPEARRAY: this is the same as the previous macro, but it // defines a sorted array. @@ -660,8 +704,9 @@ private: \ #define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, expmode) \ typedef T _wxArray##name; \ - _WX_DEFINE_SORTED_TYPEARRAY(_wxArray##name, name, base, \ - wxARRAY_EMPTY_CMP, class expmode) + typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \ + _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, \ + wxARRAY_EMPTY_CMP, class expmode, SCMPFUNC##name) // ---------------------------------------------------------------------------- // WX_DEFINE_SORTED_TYPEARRAY_CMP: exactly the same as above but the comparison @@ -686,8 +731,9 @@ private: \ #define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ expmode) \ typedef T _wxArray##name; \ - _WX_DEFINE_SORTED_TYPEARRAY(_wxArray##name, name, base, = cmpfunc, \ - class expmode) + typedef int (CMPFUNC_CONV *SCMPFUNC##name)(T pItem1, T pItem2); \ + _WX_DEFINE_SORTED_TYPEARRAY_2(_wxArray##name, name, base, = cmpfunc, \ + class expmode, SCMPFUNC##name) // ---------------------------------------------------------------------------- // WX_DECLARE_OBJARRAY(T, name): this macro generates a new array class @@ -735,9 +781,12 @@ private: \ #define WX_DECLARE_EXPORTED_OBJARRAY(T, name) \ WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, WXDLLEXPORT) -#define WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, expmode) \ +#define WX_DECLARE_OBJARRAY_WITH_DECL(T, name, decl) \ typedef T _wxObjArray##name; \ - _WX_DECLARE_OBJARRAY(_wxObjArray##name, name, wxArrayPtrVoid, class expmode) + _WX_DECLARE_OBJARRAY(_wxObjArray##name, name, wxArrayPtrVoid, decl) + +#define WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, expmode) \ + WX_DECLARE_OBJARRAY_WITH_DECL(T, name, class expmode) // WX_DEFINE_OBJARRAY is going to be redefined when arrimpl.cpp is included, // try to provoke a human-understandable error if it used incorrectly. @@ -754,14 +803,10 @@ private: \ WX_DECLARE_USER_EXPORTED_BASEARRAY(const void *, wxBaseArrayPtrVoid, WXDLLIMPEXP_BASE); -WX_DECLARE_USER_EXPORTED_BASEARRAY(short, wxBaseArrayShort, - WXDLLIMPEXP_BASE); -WX_DECLARE_USER_EXPORTED_BASEARRAY(int, wxBaseArrayInt, - WXDLLIMPEXP_BASE); -WX_DECLARE_USER_EXPORTED_BASEARRAY(long, wxBaseArrayLong, - WXDLLIMPEXP_BASE); -WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, - WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(short, wxBaseArrayShort, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(int, wxBaseArrayInt, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(long, wxBaseArrayLong, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); // ---------------------------------------------------------------------------- // Convenience macros to define arrays from base arrays @@ -769,38 +814,44 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, #define WX_DEFINE_ARRAY(T, name) \ WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_ARRAY_NO_PTR(T, name) \ + WX_DEFINE_TYPEARRAY_NO_PTR(T, name, wxBaseArrayPtrVoid) #define WX_DEFINE_EXPORTED_ARRAY(T, name) \ WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) +#define WX_DEFINE_EXPORTED_ARRAY_NO_PTR(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_NO_PTR(T, name, wxBaseArrayPtrVoid) #define WX_DEFINE_USER_EXPORTED_ARRAY(T, name, expmode) \ WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayPtrVoid, expmode) +#define WX_DEFINE_USER_EXPORTED_ARRAY_NO_PTR(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, wxBaseArrayPtrVoid, expmode) #define WX_DEFINE_ARRAY_SHORT(T, name) \ - WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayShort) + WX_DEFINE_TYPEARRAY_NO_PTR(T, name, wxBaseArrayShort) #define WX_DEFINE_EXPORTED_ARRAY_SHORT(T, name) \ - WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort) + WX_DEFINE_EXPORTED_TYPEARRAY_NO_PTR(T, name, wxBaseArrayShort) #define WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayShort, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, wxBaseArrayShort, expmode) #define WX_DEFINE_ARRAY_INT(T, name) \ - WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayInt) + WX_DEFINE_TYPEARRAY_NO_PTR(T, name, wxBaseArrayInt) #define WX_DEFINE_EXPORTED_ARRAY_INT(T, name) \ - WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayInt) + WX_DEFINE_EXPORTED_TYPEARRAY_NO_PTR(T, name, wxBaseArrayInt) #define WX_DEFINE_USER_EXPORTED_ARRAY_INT(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayInt, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, wxBaseArrayInt, expmode) #define WX_DEFINE_ARRAY_LONG(T, name) \ - WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayLong) + WX_DEFINE_TYPEARRAY_NO_PTR(T, name, wxBaseArrayLong) #define WX_DEFINE_EXPORTED_ARRAY_LONG(T, name) \ - WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayLong) + WX_DEFINE_EXPORTED_TYPEARRAY_NO_PTR(T, name, wxBaseArrayLong) #define WX_DEFINE_USER_EXPORTED_ARRAY_LONG(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayLong, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, wxBaseArrayLong, expmode) #define WX_DEFINE_ARRAY_DOUBLE(T, name) \ - WX_DEFINE_TYPEARRAY(T, name, wxBaseArrayDouble) + WX_DEFINE_TYPEARRAY_NO_PTR(T, name, wxBaseArrayDouble) #define WX_DEFINE_EXPORTED_ARRAY_DOUBLE(T, name) \ - WX_DEFINE_EXPORTED_TYPEARRAY(T, name, wxBaseArrayDouble) + WX_DEFINE_EXPORTED_TYPEARRAY_NO_PTR(T, name, wxBaseArrayDouble) #define WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayDouble, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_NO_PTR(T, name, wxBaseArrayDouble, expmode) // ---------------------------------------------------------------------------- // Convenience macros to define sorted arrays from base arrays @@ -878,10 +929,10 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, // Some commonly used predefined arrays // ---------------------------------------------------------------------------- -WX_DEFINE_USER_EXPORTED_ARRAY_SHORT (short, wxArrayShort, class WXDLLIMPEXP_BASE); -WX_DEFINE_USER_EXPORTED_ARRAY_INT (int, wxArrayInt, class WXDLLIMPEXP_BASE); -WX_DEFINE_USER_EXPORTED_ARRAY_LONG (long, wxArrayLong, class WXDLLIMPEXP_BASE); -WX_DEFINE_USER_EXPORTED_ARRAY (void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(short, wxArrayShort, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_INT(int, wxArrayInt, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_LONG(long, wxArrayLong, class WXDLLIMPEXP_BASE); +WX_DEFINE_USER_EXPORTED_ARRAY_NO_PTR(void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE); // ----------------------------------------------------------------------------- // convenience macros