X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7788fc4046f6ff5fb6a2ef67906cecc32e7b4df8..2301cda0084278f8cde4dc08ac634b88836e699f:/include/wx/dynarray.h diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index b99ed6a64b..9bdd300ee7 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: dynarray.h +// Name: wx/dynarray.h // Purpose: auto-resizable (i.e. dynamic) array support // Author: Vadim Zeitlin // Modified by: @@ -120,6 +120,10 @@ classexp name : public std::vector \ public: \ typedef wxArray_SortFunction::CMPFUNC CMPFUNC; \ public: \ + name() : std::vector() { } \ + name(size_type n) : std::vector(n) { } \ + name(size_type n, const_reference v) : std::vector(n, v) { } \ + \ void Empty() { clear(); } \ void Clear() { clear(); } \ void Alloc(size_t uiSize) { reserve(uiSize); } \ @@ -282,12 +286,16 @@ typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ classexp name : public base \ { \ public: \ + name() : base() { } \ + name(size_type n) : base(n) { } \ + name(size_type n, const_reference v) : base(n, v) { } \ + \ 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(Count() - 1); } \ + { return Item(GetCount() - 1); } \ \ int Index(T e, bool bFromEnd = false) const \ { return base::Index(e, bFromEnd); } \ @@ -336,7 +344,7 @@ public: \ T& Item(size_t uiIndex) const \ { return (T&)(base::operator[](uiIndex)); } \ T& Last() const \ - { return (T&)(base::operator[](Count() - 1)); } \ + { return (T&)(base::operator[](GetCount() - 1)); } \ \ int Index(T lItem, bool bFromEnd = false) const \ { return base::Index((base_type)lItem, bFromEnd); } \ @@ -438,6 +446,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); } \ @@ -472,7 +481,7 @@ public: \ const_reverse_iterator rbegin() const; \ reverse_iterator rend() { return reverse_iterator(begin() - 1); } \ const_reverse_iterator rend() const; \ - void reserve(size_type n) { base::reserve(n); }; \ + void reserve(size_type n) { base::reserve(n); } \ void resize(size_type n, value_type v = value_type()) \ { base::resize(n, v); } \ } @@ -557,7 +566,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(); } \ @@ -695,7 +705,10 @@ private: \ // the normal arrays otherwise. // ---------------------------------------------------------------------------- -#define wxARRAY_EMPTY_CMP +// we need a macro which expands to nothing to pass correct number of +// parameters to a nested macro invocation even when we don't have anything to +// pass it +#define wxARRAY_EMPTY #define WX_DEFINE_SORTED_TYPEARRAY(T, name, base) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, base, \ @@ -708,7 +721,7 @@ private: \ typedef T _wxArray##name; \ 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) + wxARRAY_EMPTY, class expmode, SCMPFUNC##name) // ---------------------------------------------------------------------------- // WX_DEFINE_SORTED_TYPEARRAY_CMP: exactly the same as above but the comparison @@ -805,6 +818,7 @@ private: \ WX_DECLARE_USER_EXPORTED_BASEARRAY(const void *, wxBaseArrayPtrVoid, WXDLLIMPEXP_BASE); +WX_DECLARE_USER_EXPORTED_BASEARRAY(char, wxBaseArrayChar, 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); @@ -826,44 +840,51 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_ARRAY_WITH_DECL_PTR(T, name, decl) \ WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, decl) #define WX_DEFINE_USER_EXPORTED_ARRAY(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayPtrVoid, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) #define WX_DEFINE_USER_EXPORTED_ARRAY_PTR(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_ARRAY_CHAR(T, name) \ + WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayChar) +#define WX_DEFINE_EXPORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayChar) +#define WX_DEFINE_USER_EXPORTED_ARRAY_CHAR(T, name, expmode) \ + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayChar, wxARRAY_EMPTY expmode) #define WX_DEFINE_ARRAY_SHORT(T, name) \ WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayShort) #define WX_DEFINE_EXPORTED_ARRAY_SHORT(T, name) \ WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayShort) #define WX_DEFINE_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayShort, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayShort, wxARRAY_EMPTY expmode) #define WX_DEFINE_ARRAY_INT(T, name) \ WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayInt) #define WX_DEFINE_EXPORTED_ARRAY_INT(T, name) \ WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayInt) #define WX_DEFINE_USER_EXPORTED_ARRAY_INT(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayInt, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayInt, wxARRAY_EMPTY expmode) #define WX_DEFINE_ARRAY_LONG(T, name) \ WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayLong) #define WX_DEFINE_EXPORTED_ARRAY_LONG(T, name) \ WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayLong) #define WX_DEFINE_USER_EXPORTED_ARRAY_LONG(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayLong, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayLong, wxARRAY_EMPTY expmode) #define WX_DEFINE_ARRAY_SIZE_T(T, name) \ WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArraySizeT) #define WX_DEFINE_EXPORTED_ARRAY_SIZE_T(T, name) \ WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArraySizeT) #define WX_DEFINE_USER_EXPORTED_ARRAY_SIZE_T(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArraySizeT, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArraySizeT, wxARRAY_EMPTY expmode) #define WX_DEFINE_ARRAY_DOUBLE(T, name) \ WX_DEFINE_TYPEARRAY_PTR(T, name, wxBaseArrayDouble) #define WX_DEFINE_EXPORTED_ARRAY_DOUBLE(T, name) \ WX_DEFINE_EXPORTED_TYPEARRAY_PTR(T, name, wxBaseArrayDouble) #define WX_DEFINE_USER_EXPORTED_ARRAY_DOUBLE(T, name, expmode) \ - WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayDouble, expmode) + WX_DEFINE_TYPEARRAY_WITH_DECL_PTR(T, name, wxBaseArrayDouble, wxARRAY_EMPTY expmode) // ---------------------------------------------------------------------------- // Convenience macros to define sorted arrays from base arrays @@ -874,14 +895,21 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_EXPORTED_ARRAY(T, name) \ WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid) #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY(T, name, expmode) \ - WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid, expmode) + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayPtrVoid, wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CHAR(T, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CHAR(T, name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayChar, wxARRAY_EMPTY expmode) #define WX_DEFINE_SORTED_ARRAY_SHORT(T, name) \ WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayShort) #define WX_DEFINE_SORTED_EXPORTED_ARRAY_SHORT(T, name) \ WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort) #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SHORT(T, name, expmode) \ - WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort, expmode) + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArrayShort, wxARRAY_EMPTY expmode) #define WX_DEFINE_SORTED_ARRAY_INT(T, name) \ WX_DEFINE_SORTED_TYPEARRAY(T, name, wxBaseArrayInt) @@ -902,7 +930,7 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_EXPORTED_ARRAY_SIZE_T(T, name) \ WX_DEFINE_SORTED_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT) #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(T, name, expmode) \ - WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT, expmode) + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY(T, name, wxBaseArraySizeT, wxARRAY_EMPTY expmode) // ---------------------------------------------------------------------------- // Convenience macros to define sorted arrays from base arrays @@ -915,7 +943,18 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP(T, cmpfunc, \ name, expmode) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ - wxBaseArrayPtrVoid, expmode) + wxBaseArrayPtrVoid, \ + wxARRAY_EMPTY expmode) + +#define WX_DEFINE_SORTED_ARRAY_CMP_CHAR(T, cmpfunc, name) \ + WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_EXPORTED_ARRAY_CMP_CHAR(T, cmpfunc, name) \ + WX_DEFINE_SORTED_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayChar) +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_CHAR(T, cmpfunc, \ + name, expmode) \ + WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ + wxBaseArrayChar, \ + wxARRAY_EMPTY expmode) #define WX_DEFINE_SORTED_ARRAY_CMP_SHORT(T, cmpfunc, name) \ WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayShort) @@ -924,7 +963,8 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_SHORT(T, cmpfunc, \ name, expmode) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ - wxBaseArrayShort, expmode) + wxBaseArrayShort, \ + wxARRAY_EMPTY expmode) #define WX_DEFINE_SORTED_ARRAY_CMP_INT(T, cmpfunc, name) \ WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayInt) @@ -933,7 +973,8 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_INT(T, cmpfunc, \ name, expmode) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ - wxBaseArrayInt, expmode) + wxBaseArrayInt, \ + wxARRAY_EMPTY expmode) #define WX_DEFINE_SORTED_ARRAY_CMP_LONG(T, cmpfunc, name) \ WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArrayLong) @@ -942,7 +983,8 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_LONG(T, cmpfunc, \ name, expmode) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ - wxBaseArrayLong, expmode) + wxBaseArrayLong, \ + wxARRAY_EMPTY expmode) #define WX_DEFINE_SORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, name) \ WX_DEFINE_SORTED_TYPEARRAY_CMP(T, cmpfunc, name, wxBaseArraySizeT) @@ -951,7 +993,8 @@ WX_DECLARE_USER_EXPORTED_BASEARRAY(double, wxBaseArrayDouble, WXDLLIMPEXP_BASE); #define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_CMP_SIZE_T(T, cmpfunc, \ name, expmode) \ WX_DEFINE_SORTED_USER_EXPORTED_TYPEARRAY_CMP(T, cmpfunc, name, \ - wxBaseArraySizeT, expmode) + wxBaseArraySizeT, \ + wxARRAY_EMPTY expmode) // ---------------------------------------------------------------------------- // Some commonly used predefined arrays @@ -973,6 +1016,7 @@ WX_DEFINE_USER_EXPORTED_ARRAY_PTR(void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE #define WX_PREPEND_ARRAY(array, other) \ { \ size_t wxAAcnt = (other).size(); \ + (array).reserve(wxAAcnt); \ for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ { \ (array).Insert((other)[wxAAn], wxAAn); \ @@ -983,6 +1027,7 @@ WX_DEFINE_USER_EXPORTED_ARRAY_PTR(void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE #define WX_APPEND_ARRAY(array, other) \ { \ size_t wxAAcnt = (other).size(); \ + (array).reserve(wxAAcnt); \ for ( size_t wxAAn = 0; wxAAn < wxAAcnt; wxAAn++ ) \ { \ (array).push_back((other)[wxAAn]); \ @@ -1007,4 +1052,3 @@ WX_DEFINE_USER_EXPORTED_ARRAY_PTR(void *, wxArrayPtrVoid, class WXDLLIMPEXP_BASE } #endif // _DYNARRAY_H -