X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77c5eefb1f06a8956231d2cbe1526e4de526cac5..438e3558adf77a68f56b6e4d30b359f8361facac:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index 0274f7fcb3..7cad34a420 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 license ///////////////////////////////////////////////////////////////////////////// /* @@ -40,7 +40,7 @@ // 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); +extern WXDLLEXPORT wxChar* copystring(const wxChar *s); class WXDLLEXPORT wxObjectListNode; typedef wxObjectListNode wxNode; @@ -65,10 +65,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 -typedef int (*wxSortCompareFunction)(const void *elem1, const void *elem2); +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 +77,7 @@ typedef int (*wxListIterateFunction)(void *current); union wxListKeyValue { long integer; - char *string; + wxChar *string; }; // a struct which may contain both types of keys @@ -94,14 +94,14 @@ public: { 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 wxChar *s) + { m_keyType = wxKEY_STRING; m_key.string = wxStrdup(s); } wxListKey(const wxString& s) - { m_keyType = wxKEY_STRING; m_key.string = strdup(s.c_str()); } + { 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,6 +127,8 @@ private: // wxNodeBase class is a (base for) node in a double linked list // ----------------------------------------------------------------------------- +WXDLLEXPORT_DATA(extern wxListKey) wxDefaultListKey; + class WXDLLEXPORT wxNodeBase { friend class wxListBase; @@ -136,16 +138,16 @@ public: wxNodeBase *previous = (wxNodeBase *)NULL, wxNodeBase *next = (wxNodeBase *)NULL, void *data = NULL, - const wxListKey& key = wxListKey()); + const wxListKey& key = wxDefaultListKey); 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 @@ -163,7 +165,7 @@ protected: void *GetData() const { return m_data; } void SetData(void *data) { m_data = data; } - // get 0-based index of this node within the list or NOT_FOUND + // get 0-based index of this node within the list or wxNOT_FOUND int IndexOf() const; virtual void DeleteData() { } @@ -195,19 +197,46 @@ public: size_t GetCount() const { return m_count; } // operations + // delete all nodes void Clear(); + // instruct it to destroy user data when deleting nodes void DeleteContents(bool destroy) { m_destroy = destroy; } + // query if to delete + bool GetDeleteContents() const + { return m_destroy; } + + // get the keytype + wxKeyType GetKeyType() const + { return m_keyType; } + + // set the keytype (required by the serial code) + void SetKeyType(wxKeyType keyType) + { 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); } +#endif // wxLIST_COMPATIBILITY + protected: + // all methods here are "overloaded" in derived classes to provide compile // time type checking // create a node for the list of this type virtual wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, void *data, - const wxListKey& key = wxListKey()) = 0; + const wxListKey& key = wxDefaultListKey) = 0; + +// Can't access these from derived classes otherwise (bug in Salford C++?) +#ifdef __SALFORDC__ +public: +#endif // ctors // from an array @@ -215,6 +244,7 @@ protected: // from a sequence of objects wxListBase(void *object, ... /* terminate with NULL */); +protected: // copy ctor and assignment operator wxListBase(const wxListBase& list) { DoCopy(list); } @@ -237,12 +267,16 @@ protected: 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) @@ -260,7 +294,7 @@ protected: // by key wxNodeBase *Find(const wxListKey& key) const; - // get 0-based index of object or NOT_FOUND + // get 0-based index of object or wxNOT_FOUND int IndexOf( void *object ) const; // this function allows the sorting of arbitrary lists by giving @@ -275,7 +309,7 @@ protected: private: // helpers // common part of all ctors - void Init(wxKeyType keyType); + 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 @@ -299,19 +333,27 @@ private: // declare a list type named 'name' and containing elements of type 'T *' // (as a by product of macro expansion you also get wx##name##Node -// wxNode-dervied type) +// wxNode-derived type) // // implementation details: -// 1. we define _WX_LIST_ITEM_TYPE_##name typedef to save in it the item type +// 1. We define _WX_LIST_ITEM_TYPE_##name typedef to save in it the item type // for the list of given type - this allows us to pass only the list name // to WX_DEFINE_LIST() even if it needs both the name and the type // -// 2. We redefine all not type-safe wxList functions withtype-safe versions -// which don't take any place (everything is inline), but bring compile +// 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) \ + typedef int (*wxSortFuncFor_##name)(const T **, const T **); \ \ class WXDLLEXPORT nodetype : public wxNodeBase \ { \ @@ -320,7 +362,7 @@ private: nodetype *previous = (nodetype *)NULL, \ nodetype *next = (nodetype *)NULL, \ T *data = (T *)NULL, \ - const wxListKey& key = wxListKey()) \ + const wxListKey& key = wxDefaultListKey) \ : wxNodeBase(list, previous, next, data, key) { } \ \ nodetype *GetNext() const \ @@ -336,9 +378,11 @@ private: virtual void DeleteData(); \ }; \ \ - class WXDLLEXPORT name : public wxListBase \ + class WXDLLEXPORT name : public wxListBase \ { \ public: \ + typedef nodetype Node; \ + \ name(wxKeyType keyType = wxKEY_NONE) : wxListBase(keyType) \ { } \ name(size_t count, T *elements[]) \ @@ -358,32 +402,34 @@ 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) \ @@ -392,7 +438,7 @@ private: protected: \ wxNodeBase *CreateNode(wxNodeBase *prev, wxNodeBase *next, \ void *data, \ - const wxListKey& key = wxListKey()) \ + const wxListKey& key = wxDefaultListKey) \ { \ return new nodetype(this, \ (nodetype *)prev, (nodetype *)next, \ @@ -400,6 +446,9 @@ private: } \ } +#define WX_DECLARE_LIST_2(elementtype, listname, nodename) \ + WX_DECLARE_LIST_3(elementtype, elementtype, listname, nodename) + #define WX_DECLARE_LIST(elementtype, listname) \ typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node) @@ -408,11 +457,14 @@ private: // #include #define WX_DEFINE_LIST(name) "don't forget to include listimpl.cpp!" - // ============================================================================= // now we can define classes 100% compatible with the old ones // ============================================================================= +// ---------------------------------------------------------------------------- +// commonly used list classes +// ---------------------------------------------------------------------------- + #ifdef wxLIST_COMPATIBILITY // ----------------------------------------------------------------------------- @@ -429,10 +481,6 @@ public: // compatibility methods void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } - 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); } wxNode *Member(wxObject *object) const { return (wxNode *)Find(object); } }; @@ -440,7 +488,7 @@ public: // wxStringList class for compatibility with the old code // ----------------------------------------------------------------------------- -WX_DECLARE_LIST_2(char, wxStringListBase, wxStringListNode); +WX_DECLARE_LIST_2(wxChar, wxStringListBase, wxStringListNode); class WXDLLEXPORT wxStringList : public wxStringListBase { @@ -448,7 +496,7 @@ public: // ctors and such // default wxStringList() { DeleteContents(TRUE); } - wxStringList(const char *first ...); + wxStringList(const wxChar *first ...); // copying the string list: the strings are copied, too (extremely // inefficient!) @@ -458,24 +506,17 @@ public: // operations // makes a copy of the string - wxNode *Add(const char *s) + wxNode *Add(const wxChar *s) { return (wxNode *)wxStringListBase::Append(copystring(s)); } - void Delete(const char *s) - { wxStringListBase::DeleteObject((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(); - // compatibility methods - 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); } - private: void DoCopy(const wxStringList&); // common part of copy ctor and operator= };