X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e146b8c8bf449e2264ac3edc6a0228585c619dd1..01c6f3724ed22b2b2a0851b358532ed5c37b1bb0:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index 8bd77c2d2f..e3c8284fb6 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -6,7 +6,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Julian Smart -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// /* @@ -25,7 +25,7 @@ #ifndef _WX_LISTH__ #define _WX_LISTH__ -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(__APPLE__) #pragma interface "list.h" #endif @@ -34,15 +34,10 @@ // ----------------------------------------------------------------------------- #include "wx/defs.h" -#include "wx/debug.h" #include "wx/object.h" #include "wx/string.h" -// due to circular header dependencies this function has to be declared here -// (normally it's found in utils.h which includes itself list.h...) -extern WXDLLEXPORT char* copystring(const char *s); - -class WXDLLEXPORT wxObjectListNode; +class WXDLLIMPEXP_BASE wxObjectListNode; typedef wxObjectListNode wxNode; // undef it to get rid of old, deprecated functions @@ -65,10 +60,13 @@ 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 -typedef int (*wxSortCompareFunction)(const void *elem1, const void *elem2); +extern "C" +{ +typedef int (* LINKAGEMODE wxSortCompareFunction)(const void *elem1, const void *elem2); +} // -typedef int (*wxListIterateFunction)(void *current); +typedef int (* LINKAGEMODE wxListIterateFunction)(void *current); // ----------------------------------------------------------------------------- // key stuff: a list may be optionally keyed on integer or string key @@ -77,7 +75,7 @@ typedef int (*wxListIterateFunction)(void *current); union wxListKeyValue { long integer; - char *string; + wxChar *string; }; // a struct which may contain both types of keys @@ -86,22 +84,22 @@ union wxListKeyValue // for any keyed operation instead of 2 almost equivalent. OTOH, it's needed to // resolve ambiguity which we would otherwise have with wxStringList::Find() and // wxList::Find(const char *). -class WXDLLEXPORT wxListKey +class WXDLLIMPEXP_BASE wxListKey { public: // implicit ctors - wxListKey() - { m_keyType = wxKEY_NONE; } - wxListKey(long i) - { m_keyType = wxKEY_INTEGER; m_key.integer = i; } - wxListKey(const char *s) - { m_keyType = wxKEY_STRING; m_key.string = strdup(s); } - wxListKey(const wxString& s) - { m_keyType = wxKEY_STRING; m_key.string = strdup(s.c_str()); } + wxListKey() : m_keyType(wxKEY_NONE) + { } + wxListKey(long i) : m_keyType(wxKEY_INTEGER) + { m_key.integer = i; } + wxListKey(const wxChar *s) : m_keyType(wxKEY_STRING) + { m_key.string = wxStrdup(s); } + wxListKey(const wxString& s) : m_keyType(wxKEY_STRING) + { m_key.string = wxStrdup(s.c_str()); } // accessors wxKeyType GetKeyType() const { return m_keyType; } - const char *GetString() const + const wxChar *GetString() const { wxASSERT( m_keyType == wxKEY_STRING ); return m_key.string; } long GetNumber() const { wxASSERT( m_keyType == wxKEY_INTEGER ); return m_key.integer; } @@ -127,9 +125,11 @@ private: // wxNodeBase class is a (base for) node in a double linked list // ----------------------------------------------------------------------------- -WXDLLEXPORT_DATA(extern wxListKey) wxDefaultListKey; +WXDLLIMPEXP_DATA_BASE(extern wxListKey) wxDefaultListKey; + +class WXDLLIMPEXP_BASE wxListBase; -class WXDLLEXPORT wxNodeBase +class WXDLLIMPEXP_BASE wxNodeBase { friend class wxListBase; public: @@ -142,19 +142,19 @@ public: virtual ~wxNodeBase(); - // @@ no check is done that the list is really keyed on strings - const char *GetKeyString() const { return m_key.string; } + // FIXME no check is done that the list is really keyed on strings + const wxChar *GetKeyString() const { return m_key.string; } long GetKeyInteger() const { return m_key.integer; } // Necessary for some existing code - void SetKeyString(char* s) { m_key.string = s; } + void SetKeyString(wxChar* s) { m_key.string = s; } void SetKeyInteger(long i) { m_key.integer = i; } #ifdef wxLIST_COMPATIBILITY - // compatibility methods - wxNode *Next() const { return (wxNode *)GetNext(); } - wxNode *Previous() const { return (wxNode *)GetPrevious(); } - wxObject *Data() const { return (wxObject *)GetData(); } + // compatibility methods, use Get* instead. + wxDEPRECATED( wxNode *Next() const ); + wxDEPRECATED( wxNode *Previous() const ); + wxDEPRECATED( wxObject *Data() const ); #endif // wxLIST_COMPATIBILITY protected: @@ -179,23 +179,36 @@ private: *m_previous; wxListBase *m_list; // list we belong to + + DECLARE_NO_COPY_CLASS(wxNodeBase) }; // ----------------------------------------------------------------------------- // a double-linked list class // ----------------------------------------------------------------------------- -class WXDLLEXPORT wxListBase : public wxObject + +class wxList; + +class WXDLLIMPEXP_BASE wxListBase : public wxObject { -friend class wxNodeBase; // should be able to call DetachNode() +friend class WXDLLIMPEXP_BASE 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); } + wxListBase(wxKeyType keyType = wxKEY_NONE) + { Init(keyType); } virtual ~wxListBase(); // accessors // count of items in the list size_t GetCount() const { return m_count; } + // return TRUE if this list is empty + bool IsEmpty() const { return m_count == 0; } + // operations // delete all nodes @@ -217,10 +230,14 @@ public: { wxASSERT( m_count==0 ); m_keyType = keyType; } #ifdef wxLIST_COMPATIBILITY - int Number() const { return GetCount(); } - wxNode *First() const { return (wxNode *)GetFirst(); } - wxNode *Last() const { return (wxNode *)GetLast(); } - wxNode *Nth(size_t index) const { return (wxNode *)Item(index); } + // compatibility methods from old wxList + wxDEPRECATED( int Number() const ); // use GetCount instead. + wxDEPRECATED( wxNode *First() const ); // use GetFirst + wxDEPRECATED( wxNode *Last() const ); // use GetLast + wxDEPRECATED( wxNode *Nth(size_t n) const ); // use Item + + // kludge for typesafe list migration in core classes. + wxDEPRECATED( operator wxList&() const ); #endif // wxLIST_COMPATIBILITY protected: @@ -246,8 +263,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; } @@ -259,20 +276,31 @@ protected: wxNodeBase *Item(size_t index) const; // get the list item's data - void *operator[](size_t index) const - { wxNodeBase *node = Item(index); return node ? node->GetData() : (wxNodeBase*)NULL; } + void *operator[](size_t n) const + { + wxNodeBase *node = Item(n); + + return node ? node->GetData() : (wxNodeBase *)NULL; + } // operations // append to end of list + wxNodeBase *Prepend(void *object) + { return (wxNodeBase *)wxListBase::Insert(object); } + // append to beginning of list wxNodeBase *Append(void *object); // insert a new item at the beginning of the list wxNodeBase *Insert(void *object) { return Insert( (wxNodeBase*)NULL, object); } + // insert a new item at the given position + wxNodeBase *Insert(size_t pos, void *object) + { return pos == GetCount() ? Append(object) + : Insert(Item(pos), object); } // insert before given node or at front of list if prev == NULL wxNodeBase *Insert(wxNodeBase *prev, void *object); // keyed append wxNodeBase *Append(long key, void *object); - wxNodeBase *Append(const char *key, void *object); + wxNodeBase *Append(const wxChar *key, void *object); // removes node from the list but doesn't delete it (returns pointer // to the node or NULL if it wasn't found in the list) @@ -304,8 +332,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 @@ -339,11 +365,19 @@ private: // 2. We redefine all non-type-safe wxList functions with type-safe versions // which don't take any space (everything is inline), but bring compile // time error checking. - -#define WX_DECLARE_LIST_2(T, name, nodetype) \ - typedef int (*wxSortFuncFor_##name)(const T *, const T *); \ +// +// 3. The macro which is usually used (WX_DECLARE_LIST) is defined in terms of +// a more generic WX_DECLARE_LIST_2 macro which, in turn, uses the most +// generic WX_DECLARE_LIST_3 one. The last macro adds a sometimes +// interesting capability to store polymorphic objects in the list and is +// particularly useful with, for example, "wxWindow *" list where the +// wxWindowBase pointers are put into the list, but wxWindow pointers are +// retrieved from it. + +#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, \ @@ -366,7 +400,7 @@ private: virtual void DeleteData(); \ }; \ \ - class WXDLLEXPORT name : public wxListBase \ + classexp name : public wxListBase \ { \ public: \ typedef nodetype Node; \ @@ -376,6 +410,9 @@ private: name(size_t count, T *elements[]) \ : wxListBase(count, (void **)elements) { } \ \ + name& operator=(const name& list) \ + { (void) wxListBase::operator=(list); return *this; } \ + \ nodetype *GetFirst() const \ { return (nodetype *)wxListBase::GetFirst(); } \ nodetype *GetLast() const \ @@ -390,39 +427,41 @@ private: return node ? (T*)(node->GetData()) : (T*)NULL; \ } \ \ - nodetype *Append(T *object) \ + nodetype *Append(Tbase *object) \ { return (nodetype *)wxListBase::Append(object); } \ - nodetype *Insert(T *object) \ + nodetype *Insert(Tbase *object) \ { return (nodetype *)Insert((nodetype*)NULL, object); } \ - nodetype *Insert(nodetype *prev, T *object) \ + nodetype *Insert(size_t pos, Tbase *object) \ + { return (nodetype *)wxListBase::Insert(pos, object); } \ + nodetype *Insert(nodetype *prev, Tbase *object) \ { return (nodetype *)wxListBase::Insert(prev, object); } \ \ nodetype *Append(long key, void *object) \ { return (nodetype *)wxListBase::Append(key, object); } \ - nodetype *Append(const char *key, void *object) \ + nodetype *Append(const wxChar *key, void *object) \ { return (nodetype *)wxListBase::Append(key, object); } \ \ nodetype *DetachNode(nodetype *node) \ { return (nodetype *)wxListBase::DetachNode(node); } \ bool DeleteNode(nodetype *node) \ { return wxListBase::DeleteNode(node); } \ - bool DeleteObject(T *object) \ + bool DeleteObject(Tbase *object) \ { return wxListBase::DeleteObject(object); } \ \ - nodetype *Find(T *object) const \ + nodetype *Find(Tbase *object) const \ { return (nodetype *)wxListBase::Find(object); } \ \ virtual nodetype *Find(const wxListKey& key) const \ { return (nodetype *)wxListBase::Find(key); } \ \ - int IndexOf( T *object ) const \ + int IndexOf(Tbase *object) const \ { return wxListBase::IndexOf(object); } \ \ void Sort(wxSortFuncFor_##name func) \ { wxListBase::Sort((wxSortCompareFunction)func); } \ \ protected: \ - wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ + virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ void *data, \ const wxListKey& key = wxDefaultListKey) \ { \ @@ -432,79 +471,116 @@ private: } \ } +#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 // ============================================================================= // ---------------------------------------------------------------------------- -// commonly used string classes +// commonly used list classes // ---------------------------------------------------------------------------- -class wxWindow; -WX_DECLARE_LIST(wxWindow, wxWindowList); - #ifdef wxLIST_COMPATIBILITY +// define this to make a lot of noise about use of the old wxList classes. +//#define wxWARN_COMPAT_LIST_USE + // ----------------------------------------------------------------------------- // 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 WXDLLIMPEXP_BASE); -class WXDLLEXPORT wxList : public wxObjectList +class WXDLLIMPEXP_BASE wxList : public wxObjectList { public: - wxList(int key_type = wxKEY_NONE) : wxObjectList((wxKeyType)key_type) { } +#ifdef wxWARN_COMPAT_LIST_USE + wxDEPRECATED( wxList(int key_type = wxKEY_NONE) ); +#else + wxList(int key_type = wxKEY_NONE); +#endif + + // this destructor is required for Darwin + ~wxList() { } + + wxList& operator=(const wxList& list) + { (void) wxListBase::operator=(list); return *this; } // compatibility methods void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } wxNode *Member(wxObject *object) const { return (wxNode *)Find(object); } + +private: + DECLARE_DYNAMIC_CLASS(wxList) }; // ----------------------------------------------------------------------------- // wxStringList class for compatibility with the old code // ----------------------------------------------------------------------------- -WX_DECLARE_LIST_2(char, wxStringListBase, wxStringListNode); +WX_DECLARE_LIST_2(wxChar, wxStringListBase, wxStringListNode, class WXDLLIMPEXP_BASE); -class WXDLLEXPORT wxStringList : public wxStringListBase +class WXDLLIMPEXP_BASE wxStringList : public wxStringListBase { public: // ctors and such // default - wxStringList() { DeleteContents(TRUE); } - wxStringList(const char *first ...); +#ifdef wxWARN_COMPAT_LIST_USE + wxDEPRECATED( wxStringList() ); + wxDEPRECATED( wxStringList(const wxChar *first ...) ); +#else + wxStringList(); + wxStringList(const wxChar *first ...); +#endif // 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; } // operations // makes a copy of the string - wxNode *Add(const char *s) - { return (wxNode *)wxStringListBase::Append(copystring(s)); } + wxNode *Add(const wxChar *s); + + // Append to beginning of list + wxNode *Prepend(const wxChar *s); - bool Delete(const char *s); + bool Delete(const wxChar *s); - char **ListToArray(bool new_copies = FALSE) const; - bool Member(const char *s) const; + wxChar **ListToArray(bool new_copies = FALSE) const; + bool Member(const wxChar *s) const; // alphabetic sort void Sort(); private: void DoCopy(const wxStringList&); // common part of copy ctor and operator= + + DECLARE_DYNAMIC_CLASS(wxStringList) }; #endif // wxLIST_COMPATIBILITY