X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9ea1246ba6783b30d5bc0877720f976b4dc9e5b9..89352653828ae50feab93f5e0fce628ea840927e:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index 33ae0bf486..3bd75b3957 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -54,28 +54,12 @@ extern "C" typedef int (* LINKAGEMODE wxSortCompareFunction)(const void *elem1, const void *elem2); } -class WXDLLIMPEXP_BASE wxObjectListNode; +class WXDLLIMPEXP_FWD_BASE wxObjectListNode; typedef wxObjectListNode wxNode; // typedef int (* LINKAGEMODE wxListIterateFunction)(void *current); -// ---------------------------------------------------------------------------- -// constants -// ---------------------------------------------------------------------------- - -#if !defined(wxENUM_KEY_TYPE_DEFINED) -#define wxENUM_KEY_TYPE_DEFINED - -enum wxKeyType -{ - wxKEY_NONE, - wxKEY_INTEGER, - wxKEY_STRING -}; - -#endif - #if wxUSE_STL #define wxLIST_COMPATIBILITY @@ -93,7 +77,7 @@ enum wxKeyType #define WX_DECLARE_LIST_WITH_DECL(elT, liT, decl) \ WX_DECLARE_LIST_XO(elT*, liT, decl) -#if !defined( __VISUALC__ ) +#if !defined(__VISUALC__) || __VISUALC__ >= 1300 // == !VC6 template class WXDLLIMPEXP_BASE wxList_SortFunction @@ -107,12 +91,12 @@ private: }; #define WX_LIST_SORTFUNCTION( elT, f ) wxList_SortFunction(f) -#define VC6_WORKAROUND(elT, liT, decl) +#define WX_LIST_VC6_WORKAROUND(elT, liT, decl) -#else // if defined( __VISUALC__ ) +#else // if defined( __VISUALC__ ) && __VISUALC__ < 1300 // == VC6 #define WX_LIST_SORTFUNCTION( elT, f ) std::greater( f ) -#define VC6_WORKAROUND(elT, liT, decl) \ +#define WX_LIST_VC6_WORKAROUND(elT, liT, decl) \ decl liT; \ \ /* Workaround for broken VC6 STL incorrectly requires a std::greater<> */ \ @@ -128,12 +112,19 @@ private: bool operator()(const elT X, const elT Y) const \ { \ return m_CompFunc ? \ - ( m_CompFunc( X, Y ) < 0 ) : \ + ( m_CompFunc( wxListCastElementToVoidPtr(X), \ + wxListCastElementToVoidPtr(Y) ) < 0 ) : \ ( X > Y ); \ } \ }; -#endif // defined( __VISUALC__ ) +// helper for std::greater above: +template +inline const void *wxListCastElementToVoidPtr(const T* ptr) { return ptr; } +inline const void *wxListCastElementToVoidPtr(const wxString& str) + { return (const char*)str; } + +#endif // VC6/!VC6 /* Note 1: the outer helper class _WX_LIST_HELPER_##liT below is a workaround @@ -173,7 +164,7 @@ private: static void DeleteFunction( _WX_LIST_ITEM_TYPE_##liT X ); \ }; \ \ - VC6_WORKAROUND(elT, liT, decl) \ + WX_LIST_VC6_WORKAROUND(elT, liT, decl) \ decl liT : public std::list \ { \ private: \ @@ -181,16 +172,18 @@ private: static BaseListType EmptyList; \ \ bool m_destroy; \ + \ public: \ decl compatibility_iterator \ { \ private: \ - /* Workaround for broken VC6 nested class name resolution */ \ - typedef std::list::iterator iterator; \ - friend class liT; \ - private: \ + /* Workaround for broken VC6 nested class name resolution */ \ + typedef std::list::iterator iterator; \ + friend class liT; \ + \ iterator m_iter; \ liT * m_list; \ + \ public: \ compatibility_iterator() \ : m_iter(EmptyList.end()), m_list( NULL ) {} \ @@ -262,9 +255,9 @@ private: std::advance( i, idx ); \ return compatibility_iterator( this, i ); \ } \ - compatibility_iterator operator[](size_t idx) const \ + elT operator[](size_t idx) const \ { \ - return Item(idx); \ + return Item(idx).GetData(); \ } \ \ compatibility_iterator GetFirst() const \ @@ -338,6 +331,9 @@ private: void Sort( wxSortCompareFunction compfunc ) \ { sort( WX_LIST_SORTFUNCTION( elT, compfunc ) ); } \ ~liT() { Clear(); } \ + \ + /* It needs access to our EmptyList */ \ + friend class compatibility_iterator; \ } #define WX_DECLARE_LIST(elementtype, listname) \ @@ -364,11 +360,6 @@ private: #else // if !wxUSE_STL -// due to circular header dependencies this function has to be declared here -// (normally it's found in utils.h which includes itself list.h...) -#if WXWIN_COMPATIBILITY_2_4 -extern WXDLLIMPEXP_BASE wxChar* copystring(const wxChar *s); -#endif // undef it to get rid of old, deprecated functions #define wxLIST_COMPATIBILITY @@ -380,7 +371,7 @@ extern WXDLLIMPEXP_BASE wxChar* copystring(const wxChar *s); union wxListKeyValue { long integer; - wxChar *string; + wxString *string; }; // a struct which may contain both types of keys @@ -397,15 +388,17 @@ public: { } 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()); } + { m_key.string = new wxString(s); } + wxListKey(const char *s) : m_keyType(wxKEY_STRING) + { m_key.string = new wxString(s); } + wxListKey(const wchar_t *s) : m_keyType(wxKEY_STRING) + { m_key.string = new wxString(s); } // accessors wxKeyType GetKeyType() const { return m_keyType; } - const wxChar *GetString() const - { wxASSERT( m_keyType == wxKEY_STRING ); return m_key.string; } + const wxString GetString() const + { wxASSERT( m_keyType == wxKEY_STRING ); return *m_key.string; } long GetNumber() const { wxASSERT( m_keyType == wxKEY_INTEGER ); return m_key.integer; } @@ -418,7 +411,7 @@ public: ~wxListKey() { if ( m_keyType == wxKEY_STRING ) - free(m_key.string); + delete m_key.string; } private: @@ -432,7 +425,7 @@ private: extern WXDLLIMPEXP_DATA_BASE(wxListKey) wxDefaultListKey; -class WXDLLIMPEXP_BASE wxListBase; +class WXDLLIMPEXP_FWD_BASE wxListBase; class WXDLLIMPEXP_BASE wxNodeBase { @@ -448,11 +441,11 @@ public: virtual ~wxNodeBase(); // FIXME no check is done that the list is really keyed on strings - const wxChar *GetKeyString() const { return m_key.string; } + wxString GetKeyString() const { return *m_key.string; } long GetKeyInteger() const { return m_key.integer; } // Necessary for some existing code - void SetKeyString(wxChar* s) { m_key.string = s; } + void SetKeyString(const wxString& s) { m_key.string = new wxString(s); } void SetKeyInteger(long i) { m_key.integer = i; } #ifdef wxLIST_COMPATIBILITY @@ -494,11 +487,11 @@ private: // a double-linked list class // ----------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxList; +class WXDLLIMPEXP_FWD_BASE wxList; class WXDLLIMPEXP_BASE wxListBase : public wxObject { -friend class WXDLLIMPEXP_BASE wxNodeBase; // should be able to call DetachNode() +friend class wxNodeBase; // should be able to call DetachNode() friend class wxHashTableBase; // should be able to call untyped Find() public: @@ -602,7 +595,7 @@ protected: // keyed append wxNodeBase *Append(long key, void *object); - wxNodeBase *Append(const wxChar *key, void *object); + wxNodeBase *Append(const wxString& 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) @@ -1031,7 +1024,8 @@ private: iterator insert(const iterator& it, const_reference v = value_type())\ { \ Insert(it.m_node, (const_base_reference)v); \ - return iterator(it.m_node->GetPrevious(), GetLast()); \ + iterator itprev(it); \ + return itprev--; \ } \ void insert(const iterator& it, size_type n, const_reference v = value_type())\ { \ @@ -1219,10 +1213,10 @@ public: // default #ifdef wxWARN_COMPAT_LIST_USE wxStringList(); - wxDEPRECATED( wxStringList(const wxChar *first ...) ); + wxDEPRECATED( wxStringList(const wxChar *first ...) ); // FIXME-UTF8 #else wxStringList(); - wxStringList(const wxChar *first ...); + wxStringList(const wxChar *first ...); // FIXME-UTF8 #endif // copying the string list: the strings are copied, too (extremely