X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2c356747d9322f1f5dcdf8ca523096cf3ad5cdd2..a2115c88f381b95cf6d423a5d3128ccbe20c4fa1:/include/wx/dynarray.h diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index d1a4f020a6..b5466516d2 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -43,13 +43,7 @@ callback compare function for quick sort must return negative value, 0 or positive value if pItem1 <, = or > pItem2 */ - -#ifdef __VISUALC__ - #define CMPFUNC_CONV _cdecl -#else // !Visual C++ - #define CMPFUNC_CONV -#endif // compiler -typedef int (CMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2); +typedef int (wxCMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2); // ---------------------------------------------------------------------------- /** @@ -123,8 +117,8 @@ protected: /** Search the element in the array, starting from the either side @param bFromEnd if TRUE, start from the end - @return index of the first item matched or NOT_FOUND - @see NOT_FOUND + @return index of the first item matched or wxNOT_FOUND + @see wxNOT_FOUND */ int Index(long lItem, bool bFromEnd = FALSE) const; /// search for an item using binary search in a sorted array @@ -157,22 +151,36 @@ private: // template classes // ============================================================================ +// resolves the name conflict between the T() macor and T typedef: we can't +// use T() inside WX_DEFINE_ARRAY! +#define _WX_ERROR_SIZEOF T("illegal use of DEFINE_ARRAY") +#define _WX_ERROR_REMOVE T("removing inexisting element in wxArray::Remove") + // ---------------------------------------------------------------------------- // This macro generates a new array class. It is intended for storage of simple // types of sizeof()<=sizeof(long) or pointers if sizeof(pointer)<=sizeof(long) // // NB: it has only inline functions => takes no space at all +// Mod by JACS: Salford C++ doesn't like 'var->operator=' syntax, as in: +// { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); +// so using a temporary variable instead. // ---------------------------------------------------------------------------- #define _WX_DEFINE_ARRAY(T, name) \ typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ -class WXDLLEXPORTLOCAL name : public wxBaseArray \ +class WXDLLEXPORT name : public wxBaseArray \ { \ public: \ name() \ - { wxASSERT( sizeof(T) <= sizeof(long) ); } \ + { \ + size_t type = sizeof(T); \ + size_t sizelong = sizeof(long); \ + if ( type > sizelong ) \ + { wxFAIL_MSG( _WX_ERROR_SIZEOF ); } \ + } \ \ name& operator=(const name& src) \ - { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); \ + { wxBaseArray* temp = (wxBaseArray*) this; \ + (*temp) = ((const wxBaseArray&)src); \ return *this; } \ \ T& operator[](size_t uiIndex) const \ @@ -193,9 +201,9 @@ public: \ void Remove(size_t uiIndex) { wxBaseArray::Remove(uiIndex); } \ void Remove(T Item) \ { int iIndex = Index(Item); \ - wxCHECK2_MSG( iIndex != NOT_FOUND, return, \ - "removing inexisting element in wxArray::Remove" ); \ - wxBaseArray::Remove((size_t)iIndex); } \ + wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ + _WX_ERROR_REMOVE); \ + wxBaseArray::Remove((size_t)iIndex); } \ \ void Sort(CMPFUNC##T fCmp) { wxBaseArray::Sort((CMPFUNC)fCmp); } \ } @@ -216,17 +224,26 @@ public: \ // the normal arrays otherwise. // // NB: it has only inline functions => takes no space at all +// Mod by JACS: Salford C++ doesn't like 'var->operator=' syntax, as in: +// { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); +// so using a temporary variable instead. // ---------------------------------------------------------------------------- #define _WX_DEFINE_SORTED_ARRAY(T, name) \ typedef int (CMPFUNC_CONV *SCMPFUNC##T)(T pItem1, T pItem2); \ -class WXDLLEXPORTLOCAL name : public wxBaseArray \ +class WXDLLEXPORT name : public wxBaseArray \ { \ public: \ name(SCMPFUNC##T fn) \ - { wxASSERT( sizeof(T) <= sizeof(long) ); m_fnCompare = fn; } \ + { size_t type = sizeof(T); \ + size_t sizelong = sizeof(long); \ + if ( type > sizelong ) \ + { wxFAIL_MSG( _WX_ERROR_SIZEOF ); } \ + m_fnCompare = fn; \ + } \ \ name& operator=(const name& src) \ - { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); \ + { wxBaseArray* temp = (wxBaseArray*) this; \ + (*temp) = ((const wxBaseArray&)src); \ m_fnCompare = src.m_fnCompare; \ return *this; } \ \ @@ -246,8 +263,8 @@ public: \ void Remove(size_t uiIndex) { wxBaseArray::Remove(uiIndex); } \ void Remove(T Item) \ { int iIndex = Index(Item); \ - wxCHECK2_MSG( iIndex != NOT_FOUND, return, \ - "removing inexisting element in wxArray::Remove" ); \ + wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ + _WX_ERROR_REMOVE ); \ wxBaseArray::Remove((size_t)iIndex); } \ \ private: \ @@ -259,7 +276,7 @@ private: \ // ---------------------------------------------------------------------------- #define _WX_DECLARE_OBJARRAY(T, name) \ typedef int (CMPFUNC_CONV *CMPFUNC##T)(T** pItem1, T** pItem2); \ -class WXDLLEXPORTLOCAL name : public wxBaseArray \ +class WXDLLEXPORT name : public wxBaseArray \ { \ public: \ name() { } \ @@ -395,8 +412,6 @@ private: \ // # overhead if not used? // ---------------------------------------------------------------------------- -#define WXDLLEXPORTLOCAL WXDLLEXPORT - //@{ /** @name ArrayInt */ WX_DEFINE_ARRAY(int, wxArrayInt); @@ -408,9 +423,6 @@ WX_DEFINE_ARRAY(void *, wxArrayPtrVoid); //@} -#undef WXDLLEXPORTLOCAL -#define WXDLLEXPORTLOCAL - // ----------------------------------------------------------------------------- // convinience macros // -----------------------------------------------------------------------------