X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cd643444314b6b488c9ecaf7c971f2a7abafca18..f7f8a13c0466725ffffc0cbe9f10da729c3423dd:/include/wx/dynarray.h diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index d165c3bc5c..6495030f0c 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -4,7 +4,6 @@ // Author: Vadim Zeitlin // Modified by: // Created: 12.09.97 -// RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -14,7 +13,7 @@ #include "wx/defs.h" -#if wxUSE_STL +#if wxUSE_STD_CONTAINERS #include "wx/beforestd.h" #include #include @@ -54,6 +53,8 @@ */ #define WX_ARRAY_DEFAULT_INITIAL_SIZE (16) +#define _WX_ERROR_REMOVE "removing inexistent element in wxArray::Remove" + // ---------------------------------------------------------------------------- // types // ---------------------------------------------------------------------------- @@ -79,10 +80,10 @@ typedef int (wxCMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2); // you cast "SomeArray *" as "BaseArray *" and then delete it) // ---------------------------------------------------------------------------- -#if wxUSE_STL +#if wxUSE_STD_CONTAINERS template -class WXDLLIMPEXP_BASE wxArray_SortFunction +class wxArray_SortFunction { public: typedef int (wxCMPFUNC_CONV *CMPFUNC)(T* pItem1, T* pItem2); @@ -95,7 +96,7 @@ private: }; template -class WXDLLIMPEXP_BASE wxSortedArray_SortFunction +class wxSortedArray_SortFunction { public: typedef F CMPFUNC; @@ -119,32 +120,80 @@ classexp name : public std::vector \ typedef predicate::CMPFUNC SCMPFUNC; \ public: \ typedef wxArray_SortFunction::CMPFUNC CMPFUNC; \ + \ public: \ + typedef T base_type; \ + \ + name() : std::vector() { } \ + name(size_type n) : std::vector(n) { } \ + name(size_type n, const_reference v) : std::vector(n, v) { } \ + template \ + name(InputIterator first, InputIterator last) : std::vector(first, last) { } \ + \ void Empty() { clear(); } \ void Clear() { clear(); } \ void Alloc(size_t uiSize) { reserve(uiSize); } \ - void Shrink(); \ + void Shrink() { name tmp(*this); swap(tmp); } \ \ size_t GetCount() const { return size(); } \ void SetCount(size_t n, T v = T()) { resize(n, v); } \ bool IsEmpty() const { return empty(); } \ size_t Count() const { return size(); } \ \ - typedef T base_type; \ - \ -protected: \ T& Item(size_t uiIndex) const \ { wxASSERT( uiIndex < size() ); return (T&)operator[](uiIndex); } \ + T& Last() const { return Item(size() - 1); } \ \ - int Index(T e, bool bFromEnd = false) const; \ - int Index(T lItem, CMPFUNC fnCompare) const; \ - size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const; \ + int Index(T item, bool bFromEnd = false) const \ + { \ + if ( bFromEnd ) \ + { \ + const const_reverse_iterator b = rbegin(), \ + e = rend(); \ + for ( const_reverse_iterator i = b; i != e; ++i ) \ + if ( *i == item ) \ + return (int)(e - i - 1); \ + } \ + else \ + { \ + const const_iterator b = begin(), \ + e = end(); \ + for ( const_iterator i = b; i != e; ++i ) \ + if ( *i == item ) \ + return (int)(i - b); \ + } \ + \ + return wxNOT_FOUND; \ + } \ + int Index(T lItem, CMPFUNC fnCompare) const \ + { \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator i = std::lower_bound(begin(), end(), lItem, p);\ + return i != end() && !p(lItem, *i) ? (int)(i - begin()) \ + : wxNOT_FOUND; \ + } \ + size_t IndexForInsert(T lItem, CMPFUNC fnCompare) const \ + { \ + Predicate p((SCMPFUNC)fnCompare); \ + const_iterator i = std::lower_bound(begin(), end(), lItem, p);\ + return i - begin(); \ + } \ void Add(T lItem, size_t nInsert = 1) \ { insert(end(), nInsert, lItem); } \ - size_t Add(T lItem, CMPFUNC fnCompare); \ + size_t Add(T lItem, CMPFUNC fnCompare) \ + { \ + size_t n = IndexForInsert(lItem, fnCompare); \ + Insert(lItem, n); \ + return n; \ + } \ void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ { insert(begin() + uiIndex, nInsert, lItem); } \ - void Remove(T lItem); \ + void Remove(T lItem) \ + { \ + int n = Index(lItem); \ + wxCHECK_RET( n != wxNOT_FOUND, _WX_ERROR_REMOVE ); \ + RemoveAt((size_t)n); \ + } \ void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ { erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ \ @@ -155,12 +204,12 @@ protected: \ } \ } -#else // if !wxUSE_STL +#else // if !wxUSE_STD_CONTAINERS #define _WX_DECLARE_BASEARRAY(T, name, classexp) \ classexp name \ { \ - typedef CMPFUNC SCMPFUNC; /* for compatibility wuth wxUSE_STL */ \ + typedef CMPFUNC SCMPFUNC; /* for compatibility wuth wxUSE_STD_CONTAINERS */ \ public: \ name(); \ name(const name& array); \ @@ -201,7 +250,7 @@ protected: \ typedef const value_type* const_iterator; \ typedef value_type& reference; \ typedef const value_type& const_reference; \ - typedef int difference_type; \ + typedef ptrdiff_t difference_type; \ typedef size_t size_type; \ \ void assign(const_iterator first, const_iterator last); \ @@ -226,14 +275,26 @@ protected: \ void pop_back() { RemoveAt(size() - 1); } \ void push_back(const value_type& v) { Add(v); } \ void reserve(size_type n) { Alloc(n); } \ - void resize(size_type n, value_type v = value_type()) \ - { SetCount(n, v); } \ + void resize(size_type count, value_type defval = value_type()) \ + { \ + if ( count < m_nCount ) \ + m_nCount = count; \ + else \ + SetCount(count, defval); \ + } \ \ iterator begin() { return m_pItems; } \ iterator end() { return m_pItems + m_nCount; } \ const_iterator begin() const { return m_pItems; } \ const_iterator end() const { return m_pItems + m_nCount; } \ \ + void swap(name& other) \ + { \ + wxSwap(m_nSize, other.m_nSize); \ + wxSwap(m_nCount, other.m_nCount); \ + wxSwap(m_pItems, other.m_pItems); \ + } \ + \ /* the following functions may be made directly public because */ \ /* they don't use the type of the elements at all */ \ public: \ @@ -252,7 +313,7 @@ private: \ T *m_pItems; \ } -#endif // !wxUSE_STL +#endif // !wxUSE_STD_CONTAINERS // ============================================================================ // The private helper macros containing the core of the array classes @@ -265,53 +326,22 @@ private: \ // so using a temporary variable instead. // // The classes need a (even trivial) ~name() to link under Mac X -// -// _WX_ERROR_REMOVE is needed to resolve the name conflict between the wxT() -// macro and T typedef: we can't use wxT() inside WX_DEFINE_ARRAY! - -#define _WX_ERROR_REMOVE wxT("removing inexisting element in wxArray::Remove") // ---------------------------------------------------------------------------- // _WX_DEFINE_TYPEARRAY: array for simple types // ---------------------------------------------------------------------------- -#if wxUSE_STL +#if wxUSE_STD_CONTAINERS +// in STL case we don't need the entire base arrays hack as standard container +// don't suffer from alignment/storage problems as our home-grown do #define _WX_DEFINE_TYPEARRAY(T, name, base, classexp) \ -typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ -classexp name : public base \ -{ \ -public: \ - T& operator[](size_t uiIndex) const \ - { return (T&)(base::operator[](uiIndex)); } \ - T& Item(size_t uiIndex) const \ - { return (T&)/*const cast*/base::operator[](uiIndex); } \ - T& Last() const \ - { return Item(GetCount() - 1); } \ - \ - int Index(T e, bool bFromEnd = false) const \ - { return base::Index(e, bFromEnd); } \ - \ - void Add(T lItem, size_t nInsert = 1) \ - { insert(end(), nInsert, lItem); } \ - void Insert(T lItem, size_t uiIndex, size_t nInsert = 1) \ - { insert(begin() + uiIndex, nInsert, lItem); } \ - \ - void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ - { base::RemoveAt(uiIndex, nRemove); } \ - void Remove(T lItem) \ - { int iIndex = Index(lItem); \ - wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ - _WX_ERROR_REMOVE); \ - RemoveAt((size_t)iIndex); } \ - \ - void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); } \ -} + _WX_DECLARE_BASEARRAY(T, name, classexp) #define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp) \ _WX_DEFINE_TYPEARRAY(T, name, base, classexp) -#else // if !wxUSE_STL +#else // if !wxUSE_STD_CONTAINERS // common declaration used by both _WX_DEFINE_TYPEARRAY and // _WX_DEFINE_TYPEARRAY_PTR @@ -326,11 +356,6 @@ public: \ name() { } \ ~name() { } \ \ - name& operator=(const name& src) \ - { base* temp = (base*) this; \ - (*temp) = ((const base&)src); \ - return *this; } \ - \ T& operator[](size_t uiIndex) const \ { return (T&)(base::operator[](uiIndex)); } \ T& Item(size_t uiIndex) const \ @@ -350,8 +375,7 @@ public: \ { base::RemoveAt(uiIndex, nRemove); } \ void Remove(T lItem) \ { int iIndex = Index(lItem); \ - wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ - _WX_ERROR_REMOVE); \ + wxCHECK_RET( iIndex != wxNOT_FOUND, _WX_ERROR_REMOVE); \ base::RemoveAt((size_t)iIndex); } \ \ void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); } \ @@ -438,6 +462,7 @@ public: \ bool operator !=(const itor& it) const { return m_ptr != it.m_ptr; }\ }; \ \ + name(size_type n) { assign(n, value_type()); } \ name(size_type n, const_reference v) { assign(n, v); } \ name(const_iterator first, const_iterator last) \ { assign(first, last); } \ @@ -475,6 +500,7 @@ public: \ void reserve(size_type n) { base::reserve(n); } \ void resize(size_type n, value_type v = value_type()) \ { base::resize(n, v); } \ + void swap(name& other) { base::swap(other); } \ } #define _WX_PTROP pointer operator->() const { return m_ptr; } @@ -485,7 +511,7 @@ public: \ #define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp) \ _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP_NONE) -#endif // !wxUSE_STL +#endif // !wxUSE_STD_CONTAINERS // ---------------------------------------------------------------------------- // _WX_DEFINE_SORTED_TYPEARRAY: sorted array for simple data types @@ -526,13 +552,14 @@ public: \ \ size_t Add(T lItem) \ { return base::Add(lItem, (CMPFUNC)m_fnCompare); } \ + void push_back(T lItem) \ + { Add(lItem); } \ \ void RemoveAt(size_t uiIndex, size_t nRemove = 1) \ { base::erase(begin() + uiIndex, begin() + uiIndex + nRemove); } \ void Remove(T lItem) \ { int iIndex = Index(lItem); \ - wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ - _WX_ERROR_REMOVE ); \ + wxCHECK_RET( iIndex != wxNOT_FOUND, _WX_ERROR_REMOVE ); \ base::erase(begin() + iIndex); } \ \ private: \ @@ -557,7 +584,8 @@ public: \ \ ~name(); \ \ - void Alloc(size_t count) { reserve(count); } \ + void Alloc(size_t count) { base::reserve(count); } \ + void reserve(size_t count) { base::reserve(count); } \ size_t GetCount() const { return base_array::size(); } \ size_t size() const { return base_array::size(); } \ bool IsEmpty() const { return base_array::empty(); } \ @@ -616,7 +644,7 @@ private: \ // that wants to export a wxArray daubed with your own import/export goo. // // Finally, you can define the macro below as something special to modify the -// arrays defined by a simple WX_FOO_ARRAY as well. By default is is empty. +// arrays defined by a simple WX_FOO_ARRAY as well. By default is empty. #define wxARRAY_DEFAULT_EXPORT // ---------------------------------------------------------------------------- @@ -628,7 +656,7 @@ private: \ WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, wxARRAY_DEFAULT_EXPORT) #define WX_DECLARE_EXPORTED_BASEARRAY(T, name) \ - WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, WXDLLEXPORT) + WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, WXDLLIMPEXP_CORE) #define WX_DECLARE_USER_EXPORTED_BASEARRAY(T, name, expmode) \ typedef T _wxArray##name; \ @@ -649,10 +677,10 @@ private: \ WX_DEFINE_TYPEARRAY_WITH_DECL_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) + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class WXDLLIMPEXP_CORE) #define WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, base) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class WXDLLEXPORT) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, base, class WXDLLIMPEXP_CORE) #define WX_DEFINE_USER_EXPORTED_TYPEARRAY(T, name, base, expdecl) \ WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, base, class expdecl) @@ -705,7 +733,7 @@ private: \ wxARRAY_DEFAULT_EXPORT) #define WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, base) \ - WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, WXDLLEXPORT) + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, WXDLLIMPEXP_CORE) #define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, expmode) \ typedef T _wxArray##name; \ @@ -731,7 +759,7 @@ private: \ #define WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ - WXDLLEXPORT) + WXDLLIMPEXP_CORE) #define WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, base, \ expmode) \ @@ -784,7 +812,7 @@ private: \ WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, wxARRAY_DEFAULT_EXPORT) #define WX_DECLARE_EXPORTED_OBJARRAY(T, name) \ - WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, WXDLLEXPORT) + WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, WXDLLIMPEXP_CORE) #define WX_DECLARE_OBJARRAY_WITH_DECL(T, name, decl) \ typedef T _wxObjArray##name; \