X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0661ec3993d101d0fb02bac605c979e609fdd04e..de6019fb157459e7e7610e3ff813ad8c4a3225cf:/include/wx/dynarray.h diff --git a/include/wx/dynarray.h b/include/wx/dynarray.h index 9f8f7a3ad0..a3c4017ada 100644 --- a/include/wx/dynarray.h +++ b/include/wx/dynarray.h @@ -151,6 +151,11 @@ private: // template classes // ============================================================================ +// resolves the name conflict between the wxT() macor and T typedef: we can't +// use wxT() inside WX_DEFINE_ARRAY! +#define _WX_ERROR_SIZEOF wxT("illegal use of DEFINE_ARRAY") +#define _WX_ERROR_REMOVE wxT("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) @@ -160,9 +165,9 @@ private: // { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); // so using a temporary variable instead. // ---------------------------------------------------------------------------- -#define _WX_DEFINE_ARRAY(T, name) \ +#define _WX_DEFINE_ARRAY(T, name, classexp) \ typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \ -class WXDLLEXPORT name : public wxBaseArray \ +classexp name : public wxBaseArray \ { \ public: \ name() \ @@ -170,7 +175,7 @@ public: \ size_t type = sizeof(T); \ size_t sizelong = sizeof(long); \ if ( type > sizelong ) \ - { wxFAIL_MSG( _T("illegal use of DEFINE_ARRAY") ); } \ + { wxFAIL_MSG( _WX_ERROR_SIZEOF ); } \ } \ \ name& operator=(const name& src) \ @@ -197,7 +202,7 @@ public: \ void Remove(T Item) \ { int iIndex = Index(Item); \ wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ - _T("removing inexisting element in wxArray::Remove") ); \ + _WX_ERROR_REMOVE); \ wxBaseArray::Remove((size_t)iIndex); } \ \ void Sort(CMPFUNC##T fCmp) { wxBaseArray::Sort((CMPFUNC)fCmp); } \ @@ -223,16 +228,16 @@ public: \ // { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src); // so using a temporary variable instead. // ---------------------------------------------------------------------------- -#define _WX_DEFINE_SORTED_ARRAY(T, name) \ +#define _WX_DEFINE_SORTED_ARRAY(T, name, classexp) \ typedef int (CMPFUNC_CONV *SCMPFUNC##T)(T pItem1, T pItem2); \ -class WXDLLEXPORT name : public wxBaseArray \ +classexp name : public wxBaseArray \ { \ public: \ name(SCMPFUNC##T fn) \ { size_t type = sizeof(T); \ size_t sizelong = sizeof(long); \ if ( type > sizelong ) \ - { wxFAIL_MSG( _T("illegal use of DEFINE_ARRAY") ); } \ + { wxFAIL_MSG( _WX_ERROR_SIZEOF ); } \ m_fnCompare = fn; \ } \ \ @@ -259,7 +264,7 @@ public: \ void Remove(T Item) \ { int iIndex = Index(Item); \ wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \ - _T("removing inexisting element in wxArray::Remove") ); \ + _WX_ERROR_REMOVE ); \ wxBaseArray::Remove((size_t)iIndex); } \ \ private: \ @@ -269,9 +274,9 @@ private: \ // ---------------------------------------------------------------------------- // see WX_DECLARE_OBJARRAY and WX_DEFINE_OBJARRAY // ---------------------------------------------------------------------------- -#define _WX_DECLARE_OBJARRAY(T, name) \ +#define _WX_DECLARE_OBJARRAY(T, name, classexp) \ typedef int (CMPFUNC_CONV *CMPFUNC##T)(T** pItem1, T** pItem2); \ -class WXDLLEXPORT name : public wxBaseArray \ +classexp name : public wxBaseArray \ { \ public: \ name() { } \ @@ -335,15 +340,17 @@ private: \ @memo declare and define array class 'name' containing elements of type 'T' */ -#define WX_DEFINE_ARRAY(T, name) typedef T _A##name; \ - _WX_DEFINE_ARRAY(_A##name, name) +#define WX_DEFINE_ARRAY(T, name) \ + typedef T _A##name; \ + _WX_DEFINE_ARRAY(_A##name, name, class) /** This macro does the same as WX_DEFINE_ARRAY except that the array will be sorted with the specified compare function. */ -#define WX_DEFINE_SORTED_ARRAY(T, name) typedef T _A##name; \ - _WX_DEFINE_SORTED_ARRAY(_A##name, name) +#define WX_DEFINE_SORTED_ARRAY(T, name) \ + typedef T _A##name; \ + _WX_DEFINE_SORTED_ARRAY(_A##name, name, class) /** This macro generates a new objarrays class which owns the objects it @@ -380,8 +387,10 @@ private: \ @memo declare objarray class 'name' containing elements of type 'T' */ -#define WX_DECLARE_OBJARRAY(T, name) typedef T _L##name; \ - _WX_DECLARE_OBJARRAY(_L##name, name) +#define WX_DECLARE_OBJARRAY(T, name) \ + typedef T _L##name; \ + _WX_DECLARE_OBJARRAY(_L##name, name, class) + /** To use an objarray class you must @@ -402,18 +411,32 @@ private: \ #define WX_DEFINE_OBJARRAY(name) "don't forget to include arrimpl.cpp!" //@} +// these macros do the same thing as the WX_XXX ones above, but should be used +// inside the library for user visible classes because otherwise they wouldn't +// be visible from outside (when using wxWindows as DLL under Windows) +#define WX_DEFINE_EXPORTED_ARRAY(T, name) \ + typedef T _A##name; \ + _WX_DEFINE_ARRAY(_A##name, name, class WXDLLEXPORT) + +#define WX_DEFINE_SORTED_EXPORTED_ARRAY(T, name) \ + typedef T _A##name; \ + _WX_DEFINE_SORTED_ARRAY(_A##name, name, class WXDLLEXPORT) + +#define WX_DECLARE_EXPORTED_OBJARRAY(T, name) \ + typedef T _L##name; \ + _WX_DECLARE_OBJARRAY(_L##name, name, class WXDLLEXPORT) + // ---------------------------------------------------------------------------- /** @name Some commonly used predefined arrays */ -// # overhead if not used? // ---------------------------------------------------------------------------- //@{ /** @name ArrayInt */ -WX_DEFINE_ARRAY(int, wxArrayInt); +WX_DEFINE_EXPORTED_ARRAY(int, wxArrayInt); /** @name ArrayLong */ -WX_DEFINE_ARRAY(long, wxArrayLong); +WX_DEFINE_EXPORTED_ARRAY(long, wxArrayLong); /** @name ArrayPtrVoid */ -WX_DEFINE_ARRAY(void *, wxArrayPtrVoid); +WX_DEFINE_EXPORTED_ARRAY(void *, wxArrayPtrVoid); //@} //@} @@ -438,5 +461,6 @@ WX_DEFINE_ARRAY(void *, wxArrayPtrVoid); \ array.Empty(); \ } + #endif // _DYNARRAY_H