X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bcaa23de098c1276b3f35716c9ea8b73cf3599bd..8d5eff606ae62a36ea2ccecc017a810081cdc22d:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index f42942f442..cfccbf371d 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -34,7 +34,6 @@ // ----------------------------------------------------------------------------- #include "wx/defs.h" -#include "wx/debug.h" #include "wx/object.h" #include "wx/string.h" @@ -65,7 +64,10 @@ enum wxKeyType // type of compare function for list sort operation (as in 'qsort'): it should // return a negative value, 0 or positive value if the first element is less // than, equal or greater than the second +extern "C" +{ typedef int (* LINKAGEMODE wxSortCompareFunction)(const void *elem1, const void *elem2); +} // typedef int (* LINKAGEMODE wxListIterateFunction)(void *current); @@ -188,6 +190,9 @@ class WXDLLEXPORT wxListBase : public wxObject { friend class wxNodeBase; // should be able to call DetachNode() friend class wxHashTableBase; // should be able to call untyped Find() +private: + // common part of all ctors + void Init(wxKeyType keyType = wxKEY_NONE); // Must be declared before it's used (for VC++ 1.5) public: // default ctor & dtor wxListBase(wxKeyType keyType = wxKEY_NONE) { Init(keyType); } @@ -247,8 +252,8 @@ public: protected: // copy ctor and assignment operator - wxListBase(const wxListBase& list) - { DoCopy(list); } + wxListBase(const wxListBase& list) : wxObject() + { Init(); DoCopy(list); } wxListBase& operator=(const wxListBase& list) { Clear(); DoCopy(list); return *this; } @@ -309,8 +314,6 @@ protected: private: // helpers - // common part of all ctors - void Init(wxKeyType keyType = wxKEY_NONE); // common part of copy ctor and assignment operator void DoCopy(const wxListBase& list); // common part of all Append()s @@ -353,10 +356,10 @@ private: // wxWindowBase pointers are put into the list, but wxWindow pointers are // retrieved from it. -#define WX_DECLARE_LIST_3(T, Tbase, name, nodetype) \ +#define WX_DECLARE_LIST_3(T, Tbase, name, nodetype, classexp) \ typedef int (*wxSortFuncFor_##name)(const T **, const T **); \ \ - class WXDLLEXPORT nodetype : public wxNodeBase \ + classexp nodetype : public wxNodeBase \ { \ public: \ nodetype(wxListBase *list = (wxListBase *)NULL, \ @@ -379,7 +382,7 @@ private: virtual void DeleteData(); \ }; \ \ - class WXDLLEXPORT name : public wxListBase \ + classexp name : public wxListBase \ { \ public: \ typedef nodetype Node; \ @@ -389,6 +392,9 @@ private: name(size_t count, T *elements[]) \ : wxListBase(count, (void **)elements) { } \ \ + name& operator=(const name& list) \ + { return (name&)wxListBase::operator=(list); } \ + \ nodetype *GetFirst() const \ { return (nodetype *)wxListBase::GetFirst(); } \ nodetype *GetLast() const \ @@ -437,7 +443,7 @@ private: { wxListBase::Sort((wxSortCompareFunction)func); } \ \ protected: \ - wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ + virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ void *data, \ const wxListKey& key = wxDefaultListKey) \ { \ @@ -447,17 +453,29 @@ private: } \ } -#define WX_DECLARE_LIST_2(elementtype, listname, nodename) \ - WX_DECLARE_LIST_3(elementtype, elementtype, listname, nodename) +#define WX_DECLARE_LIST_2(elementtype, listname, nodename, classexp) \ + WX_DECLARE_LIST_3(elementtype, elementtype, listname, nodename, classexp) #define WX_DECLARE_LIST(elementtype, listname) \ typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ - WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node) + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class) + +#define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class WXDLLEXPORT) + +#define WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) \ + typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ + WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, class usergoo) // this macro must be inserted in your program after // #include #define WX_DEFINE_LIST(name) "don't forget to include listimpl.cpp!" +#define WX_DEFINE_EXPORTED_LIST(name) WX_DEFINE_LIST(name) +#define WX_DEFINE_USER_EXPORTED_LIST(name) WX_DEFINE_LIST(name) + + // ============================================================================= // now we can define classes 100% compatible with the old ones // ============================================================================= @@ -472,12 +490,17 @@ private: // wxList compatibility class: in fact, it's a list of wxObjects // ----------------------------------------------------------------------------- -WX_DECLARE_LIST_2(wxObject, wxObjectList, wxObjectListNode); +WX_DECLARE_LIST_2(wxObject, wxObjectList, wxObjectListNode, class WXDLLEXPORT); class WXDLLEXPORT wxList : public wxObjectList { public: wxList(int key_type = wxKEY_NONE) : wxObjectList((wxKeyType)key_type) { } + // this destructor is required for Darwin + ~wxList() { } + + wxList& operator=(const wxList& list) + { return (wxList&)wxListBase::operator=(list); } // compatibility methods void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } @@ -489,7 +512,7 @@ public: // wxStringList class for compatibility with the old code // ----------------------------------------------------------------------------- -WX_DECLARE_LIST_2(wxChar, wxStringListBase, wxStringListNode); +WX_DECLARE_LIST_2(wxChar, wxStringListBase, wxStringListNode, class WXDLLEXPORT); class WXDLLEXPORT wxStringList : public wxStringListBase { @@ -501,7 +524,7 @@ public: // copying the string list: the strings are copied, too (extremely // inefficient!) - wxStringList(const wxStringList& other) { DoCopy(other); } + wxStringList(const wxStringList& other) : wxStringListBase() { DeleteContents(TRUE); DoCopy(other); } wxStringList& operator=(const wxStringList& other) { Clear(); DoCopy(other); return *this; }