X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/817270659e986de1b243586d8eb6ad3a76c87480..f1b63efe8993c6c0460354bc2da7331526d43efa:/include/wx/list.h diff --git a/include/wx/list.h b/include/wx/list.h index ad0e88f93d..7bfeb79f63 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -22,8 +22,8 @@ like the old class. */ -#ifndef _WX_LISTH__ -#define _WX_LISTH__ +#ifndef _WX_LIST_H_ +#define _WX_LIST_H_ // ----------------------------------------------------------------------------- // headers @@ -45,37 +45,9 @@ // types // ---------------------------------------------------------------------------- -// 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); -} - -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,10 +65,10 @@ 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 +class wxList_SortFunction { public: wxList_SortFunction(wxSortCompareFunction f) : m_f(f) { } @@ -107,12 +79,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,19 +100,26 @@ 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 for mingw 3.2.3 compiler bug that prevents a static function of liT class from being exported into dll. A minimal code snippet reproducing the bug: - struct WXDLLEXPORT Foo + struct WXDLLIMPEXP_CORE Foo { static void Bar(); struct SomeInnerClass @@ -173,7 +152,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: \ @@ -296,7 +275,7 @@ private: push_front( e ); \ return compatibility_iterator( this, begin() ); \ } \ - compatibility_iterator Insert( compatibility_iterator & i, elT e ) \ + compatibility_iterator Insert(const compatibility_iterator & i, elT e)\ { \ return compatibility_iterator( this, insert( i.m_iter, e ) ); \ } \ @@ -342,7 +321,7 @@ private: ~liT() { Clear(); } \ \ /* It needs access to our EmptyList */ \ - friend decl compatibility_iterator; \ + friend class compatibility_iterator; \ } #define WX_DECLARE_LIST(elementtype, listname) \ @@ -351,7 +330,7 @@ private: WX_DECLARE_LIST(elementtype, listname) #define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ - WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLEXPORT) + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLIMPEXP_CORE) #define WX_DECLARE_EXPORTED_LIST_PTR(elementtype, listname) \ WX_DECLARE_EXPORTED_LIST(elementtype, listname) @@ -399,6 +378,10 @@ public: { m_key.integer = i; } wxListKey(const wxString& s) : m_keyType(wxKEY_STRING) { 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; } @@ -430,7 +413,7 @@ private: extern WXDLLIMPEXP_DATA_BASE(wxListKey) wxDefaultListKey; -class WXDLLIMPEXP_BASE wxListBase; +class WXDLLIMPEXP_FWD_BASE wxListBase; class WXDLLIMPEXP_BASE wxNodeBase { @@ -474,7 +457,7 @@ protected: virtual void DeleteData() { } public: // for wxList::iterator - void** GetDataPtr() const { return &(((wxNodeBase*)this)->m_data); } + void** GetDataPtr() const { return &(const_cast(this)->m_data); } private: // optional key stuff wxListKeyValue m_key; @@ -492,11 +475,11 @@ private: // a double-linked list class // ----------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxList; +class WXDLLIMPEXP_FWD_BASE wxList; -class WXDLLIMPEXP_BASE wxListBase : public wxObject +class WXDLLIMPEXP_BASE wxListBase { -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: @@ -553,10 +536,6 @@ protected: void *data, 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 @@ -741,7 +720,7 @@ private: : wxListBase(count, (void **)elements) { } \ \ name& operator=(const name& list) \ - { Assign(list); return *this; } \ + { if (&list != this) Assign(list); return *this; } \ \ nodetype *GetFirst() const \ { return (nodetype *)wxListBase::GetFirst(); } \ @@ -1026,17 +1005,22 @@ private: for(size_type i = 0; i < n; ++i) \ Append((const_base_reference)v); \ } \ - iterator insert(const iterator& it, const_reference v = value_type())\ + iterator insert(const iterator& it, const_reference v) \ { \ - Insert(it.m_node, (const_base_reference)v); \ - return iterator(it.m_node->GetPrevious(), GetLast()); \ + if ( it == end() ) \ + Append((const_base_reference)v); \ + else \ + Insert(it.m_node, (const_base_reference)v); \ + iterator itprev(it); \ + return itprev--; \ } \ - void insert(const iterator& it, size_type n, const_reference v = value_type())\ + void insert(const iterator& it, size_type n, const_reference v) \ { \ for(size_type i = 0; i < n; ++i) \ Insert(it.m_node, (const_base_reference)v); \ } \ - void insert(const iterator& it, const_iterator first, const const_iterator& last)\ + void insert(const iterator& it, \ + const_iterator first, const const_iterator& last) \ { \ for(; first != last; ++first) \ Insert(it.m_node, (const_base_reference)*first); \ @@ -1105,11 +1089,11 @@ private: WX_DECLARE_LIST_2(elementtype, listname, wx##listname##Node, decl) #define WX_DECLARE_EXPORTED_LIST(elementtype, listname) \ - WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLEXPORT) + WX_DECLARE_LIST_WITH_DECL(elementtype, listname, class WXDLLIMPEXP_CORE) #define WX_DECLARE_EXPORTED_LIST_PTR(elementtype, listname) \ typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ - WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class WXDLLEXPORT) + WX_DECLARE_LIST_PTR_2(elementtype, listname, wx##listname##Node, class WXDLLIMPEXP_CORE) #define WX_DECLARE_USER_EXPORTED_LIST(elementtype, listname, usergoo) \ typedef elementtype _WX_LIST_ITEM_TYPE_##listname; \ @@ -1186,7 +1170,7 @@ public: #if !wxUSE_STL wxList& operator=(const wxList& list) - { (void) wxListBase::operator=(list); return *this; } + { if (&list != this) Assign(list); return *this; } // compatibility methods void Sort(wxSortCompareFunction compfunc) { wxListBase::Sort(compfunc); } @@ -1196,11 +1180,6 @@ public: #else wxNode *Member(wxObject *object) const { return (wxNode *)Find(object); } #endif - -private: -#if !wxUSE_STL - DECLARE_DYNAMIC_CLASS(wxList) -#endif }; #if !wxUSE_STL @@ -1217,17 +1196,24 @@ 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 // inefficient!) wxStringList(const wxStringList& other) : wxStringListBase() { DeleteContents(true); DoCopy(other); } wxStringList& operator=(const wxStringList& other) - { Clear(); DoCopy(other); return *this; } + { + if (&other != this) + { + Clear(); + DoCopy(other); + } + return *this; + } // operations // makes a copy of the string @@ -1246,8 +1232,6 @@ public: private: void DoCopy(const wxStringList&); // common part of copy ctor and operator= - - DECLARE_DYNAMIC_CLASS(wxStringList) }; #else // if wxUSE_STL