X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03e11df5470fd64d9d9a669d0b50b84c2d714736..857dab7dcd7cb95dfabbe63761064b8dc949a5ef:/include/wx/dynarray.h diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index c72a62f636..9a00c3a7bd 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -69,10 +69,6 @@ public: /// assignment operator wxBaseArray& operator=(const wxBaseArray& src); /// not virtual, see above - /// EXCEPT for Gnu compiler to reduce warnings... -#ifdef __GNUG__ - virtual -#endif ~wxBaseArray(); //@} @@ -122,6 +118,8 @@ protected: int Index(long lItem, bool bFromEnd = FALSE) const; /// search for an item using binary search in a sorted array int Index(long lItem, CMPFUNC fnCompare) const; + /// search for a place to insert the element into a sorted array + size_t IndexForInsert(long lItem, CMPFUNC fnCompare) const; /// add new element at the end void Add(long lItem); /// add item assuming the array is sorted with fnCompare function @@ -199,7 +197,6 @@ public: \ void Insert(T Item, size_t uiIndex) \ { wxBaseArray::Insert((long)Item, uiIndex) ; } \ \ - void Remove(size_t uiIndex) { RemoveAt(uiIndex); } \ void RemoveAt(size_t uiIndex) { wxBaseArray::RemoveAt(uiIndex); } \ void Remove(T Item) \ { int iIndex = Index(Item); \ @@ -221,6 +218,10 @@ public: \ // 3) it has no Sort() method because it's always sorted // 4) Index() method is much faster (the sorted arrays use binary search // instead of linear one), but Add() is slower. +// 5) there is no Insert() method because you can't insert an item into the +// given position in a sorted array but there is IndexForInsert()/AddAt() +// pair which may be used to optimize a common operation of "insert only if +// not found" // // Summary: use this class when the speed of Index() function is important, use // the normal arrays otherwise. @@ -259,10 +260,16 @@ public: \ int Index(T Item) const \ { return wxBaseArray::Index((long)Item, (CMPFUNC)m_fnCompare); }\ \ + size_t IndexForInsert(T Item) const \ + { return wxBaseArray::IndexForInsert((long)Item, \ + (CMPFUNC)m_fnCompare); } \ + \ + void AddAt(T item, size_t index) \ + { wxBaseArray::Insert((long)item, index); } \ + \ void Add(T Item) \ { wxBaseArray::Add((long)Item, (CMPFUNC)m_fnCompare); } \ \ - void Remove(size_t uiIndex) { RemoveAt(uiIndex); } \ void RemoveAt(size_t uiIndex) { wxBaseArray::RemoveAt(uiIndex); } \ void Remove(T Item) \ { int iIndex = Index(Item); \ @@ -311,7 +318,6 @@ public: \ T* Detach(size_t uiIndex) \ { T* p = (T*)wxBaseArray::Item(uiIndex); \ wxBaseArray::RemoveAt(uiIndex); return p; } \ - void Remove(size_t uiIndex) { RemoveAt(uiIndex); } \ void RemoveAt(size_t uiIndex); \ \ void Sort(CMPFUNC##T fCmp) { wxBaseArray::Sort((CMPFUNC)fCmp); } \ @@ -428,10 +434,27 @@ private: \ typedef T _A##name; \ _WX_DEFINE_SORTED_ARRAY(_A##name, name, class WXDLLEXPORT) +#define WX_DEFINE_EXPORTED_OBJARRAY(name) WX_DEFINE_OBJARRAY(name) #define WX_DECLARE_EXPORTED_OBJARRAY(T, name) \ typedef T _L##name; \ _WX_DECLARE_OBJARRAY(_L##name, name, class WXDLLEXPORT) +// ..and likewise these macros do very same thing as the ones above them too, +// but allow the user to specify the export spec. Needed if you have a dll +// that wants to export a wxArray daubed with your own import/export goo. +#define WX_DEFINE_USER_EXPORTED_ARRAY(T, name, usergoo) \ + typedef T _A##name; \ + _WX_DEFINE_ARRAY(_A##name, name, class usergoo) + +#define WX_DEFINE_SORTED_USER_EXPORTED_ARRAY(T, name, usergoo) \ + typedef T _A##name; \ + _WX_DEFINE_SORTED_ARRAY(_A##name, name, class usergoo) + +#define WX_DEFINE_USER_EXPORTED_OBJARRAY(name) WX_DEFINE_OBJARRAY(name) +#define WX_DECLARE_USER_EXPORTED_OBJARRAY(T, name, usergoo) \ + typedef T _L##name; \ + _WX_DECLARE_OBJARRAY(_L##name, name, class usergoo) + // ---------------------------------------------------------------------------- /** @name Some commonly used predefined arrays */ // ---------------------------------------------------------------------------- @@ -448,16 +471,16 @@ WX_DEFINE_EXPORTED_ARRAY(void *, wxArrayPtrVoid); //@} // ----------------------------------------------------------------------------- -// convinience macros +// convenience macros // ----------------------------------------------------------------------------- // append all element of one array to another one #define WX_APPEND_ARRAY(array, other) \ { \ - size_t count = other.Count(); \ + size_t count = (other).Count(); \ for ( size_t n = 0; n < count; n++ ) \ { \ - array.Add(other[n]); \ + (array).Add((other)[n]); \ } \ } @@ -469,13 +492,13 @@ WX_DEFINE_EXPORTED_ARRAY(void *, wxArrayPtrVoid); // count on it)! #define WX_CLEAR_ARRAY(array) \ { \ - size_t count = array.Count(); \ + size_t count = (array).Count(); \ for ( size_t n = 0; n < count; n++ ) \ { \ - delete array[n]; \ + delete (array)[n]; \ } \ \ - array.Empty(); \ + (array).Empty(); \ } #endif // _DYNARRAY_H